From 034f5e4edf568a37aaffe6d931759308eda5a51d Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Thu, 22 Jun 2023 11:35:15 -0700 Subject: [PATCH] [Impeller] Add validation forbidding SamplerAddressMode::kDecal on the OpenGLES backend (flutter/engine#43094) Fixes uncontrolled crash when kDecal is used (as seen on https://github.com/flutter/engine/pull/43087). --- .../impeller/renderer/backend/gles/context_gles.cc | 1 + .../renderer/backend/gles/sampler_library_gles.cc | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/engine/src/flutter/impeller/renderer/backend/gles/context_gles.cc b/engine/src/flutter/impeller/renderer/backend/gles/context_gles.cc index 8da1154a4c..47e7256374 100644 --- a/engine/src/flutter/impeller/renderer/backend/gles/context_gles.cc +++ b/engine/src/flutter/impeller/renderer/backend/gles/context_gles.cc @@ -75,6 +75,7 @@ ContextGLES::ContextGLES(std::unique_ptr gl, .SetSupportsComputeSubgroups(false) .SetSupportsReadFromResolve(false) .SetSupportsReadFromOnscreenTexture(false) + .SetSupportsDecalTileMode(false) .Build(); } diff --git a/engine/src/flutter/impeller/renderer/backend/gles/sampler_library_gles.cc b/engine/src/flutter/impeller/renderer/backend/gles/sampler_library_gles.cc index bea4a4d408..7f4cd3d243 100644 --- a/engine/src/flutter/impeller/renderer/backend/gles/sampler_library_gles.cc +++ b/engine/src/flutter/impeller/renderer/backend/gles/sampler_library_gles.cc @@ -5,6 +5,8 @@ #include "impeller/renderer/backend/gles/sampler_library_gles.h" #include "impeller/base/config.h" +#include "impeller/base/validation.h" +#include "impeller/core/formats.h" #include "impeller/renderer/backend/gles/sampler_gles.h" namespace impeller { @@ -17,6 +19,17 @@ SamplerLibraryGLES::~SamplerLibraryGLES() = default; // |SamplerLibrary| std::shared_ptr SamplerLibraryGLES::GetSampler( SamplerDescriptor descriptor) { + // TODO(bdero): Change this validation once optional support for kDecal is + // added to the OpenGLES backend: + // https://github.com/flutter/flutter/issues/129358 + if (descriptor.width_address_mode == SamplerAddressMode::kDecal || + descriptor.height_address_mode == SamplerAddressMode::kDecal || + descriptor.depth_address_mode == SamplerAddressMode::kDecal) { + VALIDATION_LOG << "SamplerAddressMode::kDecal is not supported by the " + "OpenGLES backend."; + return nullptr; + } + auto found = samplers_.find(descriptor); if (found != samplers_.end()) { return found->second;