diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index 50d09c9464da1..aab4fbd0cfebd 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -128,7 +128,8 @@ TEST_P(AiksTest, CanRenderTiledTexture) { 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::kNearest, MipFilter::kLinear}; + const MipFilter mip_filters[] = {MipFilter::kNone, 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 5d420db7c774f..5f675ebb37fd2 100644 --- a/impeller/entity/contents/text_contents.cc +++ b/impeller/entity/contents/text_contents.cc @@ -114,7 +114,7 @@ static bool CommonRender( sampler_desc.min_filter = MinMagFilter::kLinear; sampler_desc.mag_filter = MinMagFilter::kLinear; } - sampler_desc.mip_filter = MipFilter::kNearest; + sampler_desc.mip_filter = MipFilter::kNone; 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 47f2ce56ddddb..72fea36726f95 100644 --- a/impeller/renderer/backend/gles/sampler_gles.cc +++ b/impeller/renderer/backend/gles/sampler_gles.cc @@ -3,7 +3,6 @@ // found in the LICENSE file. #include "impeller/renderer/backend/gles/sampler_gles.h" -#include #include "impeller/renderer/backend/gles/formats_gles.h" #include "impeller/renderer/backend/gles/proc_table_gles.h" @@ -20,19 +19,15 @@ bool SamplerGLES::IsValid() const { return true; } -static GLint ToParam(MinMagFilter minmag_filter, - std::optional 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()) { +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; + } case MipFilter::kNearest: switch (minmag_filter) { case MinMagFilter::kNearest: @@ -74,17 +69,12 @@ bool SamplerGLES::ConfigureBoundTexture(const TextureGLES& texture, if (!target.has_value()) { return false; } - const auto& desc = GetDescriptor(); - - std::optional mip_filter = std::nullopt; - if (texture.GetTextureDescriptor().mip_count > 1) { - mip_filter = desc.mip_filter; - } + const auto& desc = GetDescriptor(); gl.TexParameteri(target.value(), GL_TEXTURE_MIN_FILTER, - ToParam(desc.min_filter, mip_filter)); + ToParam(desc.min_filter, desc.mip_filter)); gl.TexParameteri(target.value(), GL_TEXTURE_MAG_FILTER, - ToParam(desc.mag_filter)); + ToParam(desc.mag_filter, MipFilter::kNone)); 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 533011717c5ab..85a942364c0a3 100644 --- a/impeller/renderer/backend/metal/formats_mtl.h +++ b/impeller/renderer/backend/metal/formats_mtl.h @@ -332,6 +332,8 @@ constexpr MTLSamplerMinMagFilter ToMTLSamplerMinMagFilter(MinMagFilter filter) { 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 d2f532fa0687b..83ea4acc463b0 100644 --- a/impeller/renderer/backend/vulkan/formats_vk.h +++ b/impeller/renderer/backend/vulkan/formats_vk.h @@ -225,6 +225,8 @@ constexpr vk::SamplerMipmapMode ToVKSamplerMipmapMode(MipFilter filter) { 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 817b065a006bf..170a068da607f 100644 --- a/impeller/renderer/formats.h +++ b/impeller/renderer/formats.h @@ -247,6 +247,8 @@ enum class MinMagFilter { }; 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 d8a44de6c7d62..fa2d82356d91c 100644 --- a/impeller/renderer/renderer_unittests.cc +++ b/impeller/renderer/renderer_unittests.cc @@ -724,14 +724,15 @@ TEST_P(RendererTest, CanGenerateMipmaps) { bool first_frame = true; Renderer::RenderCallback callback = [&](RenderTarget& render_target) { - const char* mip_filter_names[] = {"Nearest", "Linear"}; - const MipFilter mip_filters[] = {MipFilter::kNearest, MipFilter::kLinear}; + const char* mip_filter_names[] = {"None", "Nearest", "Linear"}; + const MipFilter mip_filters[] = {MipFilter::kNone, 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 = 1; + static int selected_mip_filter = 2; 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 60678dac122bc..01d0f293b9054 100644 --- a/impeller/renderer/sampler_descriptor.h +++ b/impeller/renderer/sampler_descriptor.h @@ -18,7 +18,7 @@ class Context; struct SamplerDescriptor final : public Comparable { MinMagFilter min_filter = MinMagFilter::kNearest; MinMagFilter mag_filter = MinMagFilter::kNearest; - MipFilter mip_filter = MipFilter::kNearest; + MipFilter mip_filter = MipFilter::kNone; 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 ed6eda6ab64e8..7abc74f406f2f 100644 --- a/impeller/scene/geometry.cc +++ b/impeller/scene/geometry.cc @@ -246,7 +246,7 @@ void SkinnedVertexBufferGeometry::BindToCommand( SamplerDescriptor sampler_desc; sampler_desc.min_filter = MinMagFilter::kNearest; sampler_desc.mag_filter = MinMagFilter::kNearest; - sampler_desc.mip_filter = MipFilter::kNearest; + sampler_desc.mip_filter = MipFilter::kNone; sampler_desc.width_address_mode = SamplerAddressMode::kRepeat; sampler_desc.label = "NN Repeat";