[Impeller] change default sampler descriptor to use nearest mip level and remove kNone (#40460)
[Impeller] change default sampler descriptor to use nearest mip level and remove kNone
diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc
index aab4fbd..50d09c9 100644
--- a/impeller/aiks/aiks_unittests.cc
+++ b/impeller/aiks/aiks_unittests.cc
@@ -128,8 +128,7 @@
Entity::TileMode::kClamp, Entity::TileMode::kRepeat,
Entity::TileMode::kMirror, Entity::TileMode::kDecal};
const char* mip_filter_names[] = {"None", "Nearest", "Linear"};
- const MipFilter mip_filters[] = {MipFilter::kNone, MipFilter::kNearest,
- MipFilter::kLinear};
+ const MipFilter mip_filters[] = {MipFilter::kNearest, MipFilter::kLinear};
const char* min_mag_filter_names[] = {"Nearest", "Linear"};
const MinMagFilter min_mag_filters[] = {MinMagFilter::kNearest,
MinMagFilter::kLinear};
diff --git a/impeller/entity/contents/text_contents.cc b/impeller/entity/contents/text_contents.cc
index 5f675eb..5d420db 100644
--- a/impeller/entity/contents/text_contents.cc
+++ b/impeller/entity/contents/text_contents.cc
@@ -114,7 +114,7 @@
sampler_desc.min_filter = MinMagFilter::kLinear;
sampler_desc.mag_filter = MinMagFilter::kLinear;
}
- sampler_desc.mip_filter = MipFilter::kNone;
+ sampler_desc.mip_filter = MipFilter::kNearest;
typename FS::FragInfo frag_info;
frag_info.text_color = ToVector(color.Premultiply());
diff --git a/impeller/renderer/backend/gles/sampler_gles.cc b/impeller/renderer/backend/gles/sampler_gles.cc
index 72fea36..47f2ce5 100644
--- a/impeller/renderer/backend/gles/sampler_gles.cc
+++ b/impeller/renderer/backend/gles/sampler_gles.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "impeller/renderer/backend/gles/sampler_gles.h"
+#include <iostream>
#include "impeller/renderer/backend/gles/formats_gles.h"
#include "impeller/renderer/backend/gles/proc_table_gles.h"
@@ -19,15 +20,19 @@
return true;
}
-static GLint ToParam(MinMagFilter minmag_filter, MipFilter mip_filter) {
- switch (mip_filter) {
- case MipFilter::kNone:
- switch (minmag_filter) {
- case MinMagFilter::kNearest:
- return GL_NEAREST;
- case MinMagFilter::kLinear:
- return GL_LINEAR;
- }
+static GLint ToParam(MinMagFilter minmag_filter,
+ std::optional<MipFilter> mip_filter = std::nullopt) {
+ if (!mip_filter.has_value()) {
+ switch (minmag_filter) {
+ case MinMagFilter::kNearest:
+ return GL_NEAREST;
+ case MinMagFilter::kLinear:
+ return GL_LINEAR;
+ }
+ FML_UNREACHABLE();
+ }
+
+ switch (mip_filter.value()) {
case MipFilter::kNearest:
switch (minmag_filter) {
case MinMagFilter::kNearest:
@@ -69,12 +74,17 @@
if (!target.has_value()) {
return false;
}
-
const auto& desc = GetDescriptor();
+
+ std::optional<MipFilter> mip_filter = std::nullopt;
+ if (texture.GetTextureDescriptor().mip_count > 1) {
+ mip_filter = desc.mip_filter;
+ }
+
gl.TexParameteri(target.value(), GL_TEXTURE_MIN_FILTER,
- ToParam(desc.min_filter, desc.mip_filter));
+ ToParam(desc.min_filter, mip_filter));
gl.TexParameteri(target.value(), GL_TEXTURE_MAG_FILTER,
- ToParam(desc.mag_filter, MipFilter::kNone));
+ ToParam(desc.mag_filter));
gl.TexParameteri(target.value(), GL_TEXTURE_WRAP_S,
ToAddressMode(desc.width_address_mode));
gl.TexParameteri(target.value(), GL_TEXTURE_WRAP_T,
diff --git a/impeller/renderer/backend/metal/formats_mtl.h b/impeller/renderer/backend/metal/formats_mtl.h
index 85a9423..5330117 100644
--- a/impeller/renderer/backend/metal/formats_mtl.h
+++ b/impeller/renderer/backend/metal/formats_mtl.h
@@ -332,8 +332,6 @@
constexpr MTLSamplerMipFilter ToMTLSamplerMipFilter(MipFilter filter) {
switch (filter) {
- case MipFilter::kNone:
- return MTLSamplerMipFilterNotMipmapped;
case MipFilter::kNearest:
return MTLSamplerMipFilterNearest;
case MipFilter::kLinear:
diff --git a/impeller/renderer/backend/vulkan/formats_vk.h b/impeller/renderer/backend/vulkan/formats_vk.h
index 83ea4ac..d2f532f 100644
--- a/impeller/renderer/backend/vulkan/formats_vk.h
+++ b/impeller/renderer/backend/vulkan/formats_vk.h
@@ -225,8 +225,6 @@
return vk::SamplerMipmapMode::eNearest;
case MipFilter::kLinear:
return vk::SamplerMipmapMode::eLinear;
- case MipFilter::kNone:
- return vk::SamplerMipmapMode::eNearest;
}
FML_UNREACHABLE();
diff --git a/impeller/renderer/formats.h b/impeller/renderer/formats.h
index 170a068..817b065 100644
--- a/impeller/renderer/formats.h
+++ b/impeller/renderer/formats.h
@@ -247,8 +247,6 @@
};
enum class MipFilter {
- /// Always sample from mip level 0. Other mip levels are ignored.
- kNone,
/// Sample from the nearest mip level.
kNearest,
/// Sample from the two nearest mip levels and linearly interpolate between
diff --git a/impeller/renderer/renderer_unittests.cc b/impeller/renderer/renderer_unittests.cc
index fa2d823..d8a44de 100644
--- a/impeller/renderer/renderer_unittests.cc
+++ b/impeller/renderer/renderer_unittests.cc
@@ -724,15 +724,14 @@
bool first_frame = true;
Renderer::RenderCallback callback = [&](RenderTarget& render_target) {
- const char* mip_filter_names[] = {"None", "Nearest", "Linear"};
- const MipFilter mip_filters[] = {MipFilter::kNone, MipFilter::kNearest,
- MipFilter::kLinear};
+ const char* mip_filter_names[] = {"Nearest", "Linear"};
+ const MipFilter mip_filters[] = {MipFilter::kNearest, MipFilter::kLinear};
const char* min_filter_names[] = {"Nearest", "Linear"};
const MinMagFilter min_filters[] = {MinMagFilter::kNearest,
MinMagFilter::kLinear};
// UI state.
- static int selected_mip_filter = 2;
+ static int selected_mip_filter = 1;
static int selected_min_filter = 0;
static float lod = 4.5;
diff --git a/impeller/renderer/sampler_descriptor.h b/impeller/renderer/sampler_descriptor.h
index 01d0f29..60678da 100644
--- a/impeller/renderer/sampler_descriptor.h
+++ b/impeller/renderer/sampler_descriptor.h
@@ -18,7 +18,7 @@
struct SamplerDescriptor final : public Comparable<SamplerDescriptor> {
MinMagFilter min_filter = MinMagFilter::kNearest;
MinMagFilter mag_filter = MinMagFilter::kNearest;
- MipFilter mip_filter = MipFilter::kNone;
+ MipFilter mip_filter = MipFilter::kNearest;
SamplerAddressMode width_address_mode = SamplerAddressMode::kClampToEdge;
SamplerAddressMode height_address_mode = SamplerAddressMode::kClampToEdge;
diff --git a/impeller/scene/geometry.cc b/impeller/scene/geometry.cc
index 7abc74f..ed6eda6 100644
--- a/impeller/scene/geometry.cc
+++ b/impeller/scene/geometry.cc
@@ -246,7 +246,7 @@
SamplerDescriptor sampler_desc;
sampler_desc.min_filter = MinMagFilter::kNearest;
sampler_desc.mag_filter = MinMagFilter::kNearest;
- sampler_desc.mip_filter = MipFilter::kNone;
+ sampler_desc.mip_filter = MipFilter::kNearest;
sampler_desc.width_address_mode = SamplerAddressMode::kRepeat;
sampler_desc.label = "NN Repeat";