From beacd277738f6875142bc3b130acf1f772a66d6b Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Tue, 5 Nov 2024 09:45:02 -0800 Subject: [PATCH] [Impeller] make sure binding nullptr texture does not crash. --- .../renderer/backend/metal/render_pass_mtl.mm | 3 +++ .../renderer/backend/vulkan/render_pass_vk.cc | 2 +- impeller/renderer/renderer_unittests.cc | 16 +++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/impeller/renderer/backend/metal/render_pass_mtl.mm b/impeller/renderer/backend/metal/render_pass_mtl.mm index 4463fa283712b..80cf59bb5f1f7 100644 --- a/impeller/renderer/backend/metal/render_pass_mtl.mm +++ b/impeller/renderer/backend/metal/render_pass_mtl.mm @@ -408,6 +408,9 @@ static bool Bind(PassBindingsCacheMTL& pass, const ShaderMetadata& metadata, std::shared_ptr texture, const std::unique_ptr& sampler) { + if (!texture) { + return false; + } return Bind(pass_bindings_, stage, slot.texture_index, sampler, *texture); } diff --git a/impeller/renderer/backend/vulkan/render_pass_vk.cc b/impeller/renderer/backend/vulkan/render_pass_vk.cc index d971bf7142c1d..3808d84fd34c2 100644 --- a/impeller/renderer/backend/vulkan/render_pass_vk.cc +++ b/impeller/renderer/backend/vulkan/render_pass_vk.cc @@ -602,7 +602,7 @@ bool RenderPassVK::BindResource(ShaderStage stage, if (bound_buffer_offset_ >= kMaxBindings) { return false; } - if (!texture->IsValid() || !sampler) { + if (!texture || !texture->IsValid() || !sampler) { return false; } const TextureVK& texture_vk = TextureVK::Cast(*texture); diff --git a/impeller/renderer/renderer_unittests.cc b/impeller/renderer/renderer_unittests.cc index 39cb1a7f19c7b..633ad6ddba897 100644 --- a/impeller/renderer/renderer_unittests.cc +++ b/impeller/renderer/renderer_unittests.cc @@ -31,7 +31,6 @@ #include "impeller/fixtures/swizzle.frag.h" #include "impeller/fixtures/texture.frag.h" #include "impeller/fixtures/texture.vert.h" -#include "impeller/geometry/path_builder.h" #include "impeller/playground/playground.h" #include "impeller/playground/playground_test.h" #include "impeller/renderer/command_buffer.h" @@ -1626,6 +1625,21 @@ TEST_P(RendererTest, CanSepiaToneThenSwizzleWithSubpasses) { OpenPlaygroundHere(callback); } +TEST_P(RendererTest, BindingNullTexturesDoesNotCrash) { + using FS = BoxFadeFragmentShader; + + auto context = GetContext(); + const std::unique_ptr& sampler = + context->GetSamplerLibrary()->GetSampler({}); + auto command_buffer = context->CreateCommandBuffer(); + + RenderTargetAllocator allocator(context->GetResourceAllocator()); + RenderTarget target = allocator.CreateOffscreen(*context, {1, 1}, 1); + + auto pass = command_buffer->CreateRenderPass(target); + EXPECT_FALSE(FS::BindContents2(*pass, nullptr, sampler)); +} + } // namespace testing } // namespace impeller