diff --git a/ci/licenses_golden/excluded_files b/ci/licenses_golden/excluded_files index d6fa28a61dd12..b8670e1d9c1b2 100644 --- a/ci/licenses_golden/excluded_files +++ b/ci/licenses_golden/excluded_files @@ -184,6 +184,7 @@ ../../../flutter/impeller/playground ../../../flutter/impeller/renderer/backend/gles/buffer_bindings_gles_unittests.cc ../../../flutter/impeller/renderer/backend/gles/test +../../../flutter/impeller/renderer/backend/gles/unique_handle_gles_unittests.cc ../../../flutter/impeller/renderer/backend/metal/allocator_mtl_unittests.mm ../../../flutter/impeller/renderer/backend/metal/texture_mtl_unittests.mm ../../../flutter/impeller/renderer/backend/vulkan/allocator_vk_unittests.cc diff --git a/impeller/renderer/backend/gles/BUILD.gn b/impeller/renderer/backend/gles/BUILD.gn index 13ffcd8f71351..4c8598a449eb4 100644 --- a/impeller/renderer/backend/gles/BUILD.gn +++ b/impeller/renderer/backend/gles/BUILD.gn @@ -27,6 +27,7 @@ impeller_component("gles_unittests") { "test/specialization_constants_unittests.cc", "test/surface_gles_unittests.cc", "test/texture_gles_unittests.cc", + "unique_handle_gles_unittests.cc", ] deps = [ ":gles", diff --git a/impeller/renderer/backend/gles/pipeline_library_gles.cc b/impeller/renderer/backend/gles/pipeline_library_gles.cc index 493aabd926c83..791716e802339 100644 --- a/impeller/renderer/backend/gles/pipeline_library_gles.cc +++ b/impeller/renderer/backend/gles/pipeline_library_gles.cc @@ -212,7 +212,8 @@ std::shared_ptr PipelineLibraryGLES::CreatePipeline( desc, // has_cached_program ? std::move(cached_program) - : std::make_shared(reactor, HandleType::kProgram))); + : std::make_shared(UniqueHandleGLES::MakeUntracked( + reactor, HandleType::kProgram)))); auto program = reactor->GetGLHandle(pipeline->GetProgramHandle()); diff --git a/impeller/renderer/backend/gles/unique_handle_gles.cc b/impeller/renderer/backend/gles/unique_handle_gles.cc index ddf4081791672..012900d28b1cd 100644 --- a/impeller/renderer/backend/gles/unique_handle_gles.cc +++ b/impeller/renderer/backend/gles/unique_handle_gles.cc @@ -15,6 +15,14 @@ UniqueHandleGLES::UniqueHandleGLES(ReactorGLES::Ref reactor, HandleType type) } } +// static +UniqueHandleGLES UniqueHandleGLES::MakeUntracked(ReactorGLES::Ref reactor, + HandleType type) { + FML_DCHECK(reactor); + HandleGLES handle = reactor->CreateUntrackedHandle(type); + return UniqueHandleGLES(std::move(reactor), handle); +} + UniqueHandleGLES::UniqueHandleGLES(ReactorGLES::Ref reactor, HandleGLES handle) : reactor_(std::move(reactor)), handle_(handle) {} diff --git a/impeller/renderer/backend/gles/unique_handle_gles.h b/impeller/renderer/backend/gles/unique_handle_gles.h index 91c3bc2a67122..d005aa0cc346a 100644 --- a/impeller/renderer/backend/gles/unique_handle_gles.h +++ b/impeller/renderer/backend/gles/unique_handle_gles.h @@ -19,6 +19,9 @@ class UniqueHandleGLES { public: UniqueHandleGLES(ReactorGLES::Ref reactor, HandleType type); + static UniqueHandleGLES MakeUntracked(ReactorGLES::Ref reactor, + HandleType type); + UniqueHandleGLES(ReactorGLES::Ref reactor, HandleGLES handle); ~UniqueHandleGLES(); diff --git a/impeller/renderer/backend/gles/unique_handle_gles_unittests.cc b/impeller/renderer/backend/gles/unique_handle_gles_unittests.cc new file mode 100644 index 0000000000000..6a01fefbc47df --- /dev/null +++ b/impeller/renderer/backend/gles/unique_handle_gles_unittests.cc @@ -0,0 +1,42 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/testing/testing.h" // IWYU pragma: keep +#include "gtest/gtest.h" +#include "impeller/renderer/backend/gles/reactor_gles.h" +#include "impeller/renderer/backend/gles/test/mock_gles.h" +#include "impeller/renderer/backend/gles/unique_handle_gles.h" + +namespace impeller { +namespace testing { + +namespace { +class TestWorker : public ReactorGLES::Worker { + public: + bool CanReactorReactOnCurrentThreadNow( + const ReactorGLES& reactor) const override { + return true; + } +}; +} // namespace + +TEST(UniqueHandleGLES, MakeUntracked) { + auto mock_gles = MockGLES::Init(); + ProcTableGLES::Resolver resolver = kMockResolverGLES; + auto proc_table = std::make_unique(resolver); + auto worker = std::make_shared(); + auto reactor = std::make_shared(std::move(proc_table)); + reactor->AddWorker(worker); + + mock_gles->GetCapturedCalls(); + UniqueHandleGLES handle = + UniqueHandleGLES::MakeUntracked(reactor, HandleType::kTexture); + EXPECT_FALSE(handle.Get().IsDead()); + std::vector calls = mock_gles->GetCapturedCalls(); + EXPECT_TRUE(std::find(calls.begin(), calls.end(), "glGenTextures") != + calls.end()); +} + +} // namespace testing +} // namespace impeller