From 945c66f507f628151f6dd0d3804fda962d78a368 Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Fri, 15 Nov 2024 11:21:42 -0800 Subject: [PATCH] Move SetRenderTargetType to EmbedderTestCompositor SetRenderTargetType is used to configure the backingstore producer on the compositor, but the backingstore types available to any given compositor are limited to the specific graphics backend in use: Software, GL, Metal, or Vulkan. This moves SetRenderTargetType to EmbedderTestCompositor and its subclasses and adds RenderTargetType validation. A follow-up patch will refactor EmbedderTestBackingStoreProducer into backend-specific subclasses. For OpenGL backingstore producers, the egl_context_ from EmbedderTestContext (which is actually set in the EmbedderTestContextGL subclass and should live there, but that's a separate cleanup) is required in SetRenderTargetType, so we now inject it into EmbedderTestCompositor in the constructor so it's available when needed. --- .../embedder/tests/embedder_config_builder.cc | 2 +- .../tests/embedder_test_compositor.cc | 5 ---- .../embedder/tests/embedder_test_compositor.h | 5 ++-- .../tests/embedder_test_compositor_gl.cc | 27 ++++++++++++++++++- .../tests/embedder_test_compositor_gl.h | 11 +++++++- .../tests/embedder_test_compositor_metal.h | 4 +++ .../tests/embedder_test_compositor_metal.mm | 20 ++++++++++++++ .../embedder_test_compositor_software.cc | 21 +++++++++++++++ .../tests/embedder_test_compositor_software.h | 4 +++ .../tests/embedder_test_compositor_vulkan.cc | 21 +++++++++++++++ .../tests/embedder_test_compositor_vulkan.h | 4 +++ .../embedder/tests/embedder_test_context.cc | 26 ------------------ .../tests/embedder_test_context_gl.cc | 2 +- 13 files changed, 115 insertions(+), 37 deletions(-) diff --git a/shell/platform/embedder/tests/embedder_config_builder.cc b/shell/platform/embedder/tests/embedder_config_builder.cc index ef1a59f31dc41..abba1302ffd6b 100644 --- a/shell/platform/embedder/tests/embedder_config_builder.cc +++ b/shell/platform/embedder/tests/embedder_config_builder.cc @@ -287,7 +287,7 @@ FlutterCompositor& EmbedderConfigBuilder::GetCompositor() { void EmbedderConfigBuilder::SetRenderTargetType( EmbedderTestBackingStoreProducer::RenderTargetType type, FlutterSoftwarePixelFormat software_pixfmt) { - context_.SetRenderTargetType(type, software_pixfmt); + context_.GetCompositor().SetRenderTargetType(type, software_pixfmt); } UniqueEngine EmbedderConfigBuilder::LaunchEngine() const { diff --git a/shell/platform/embedder/tests/embedder_test_compositor.cc b/shell/platform/embedder/tests/embedder_test_compositor.cc index 66f6d55af0c7f..38b5a6358d568 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor.cc +++ b/shell/platform/embedder/tests/embedder_test_compositor.cc @@ -51,11 +51,6 @@ bool EmbedderTestCompositor::CollectBackingStore( return true; } -void EmbedderTestCompositor::SetBackingStoreProducer( - std::unique_ptr backingstore_producer) { - backingstore_producer_ = std::move(backingstore_producer); -} - sk_sp EmbedderTestCompositor::GetLastComposition() { return last_composition_; } diff --git a/shell/platform/embedder/tests/embedder_test_compositor.h b/shell/platform/embedder/tests/embedder_test_compositor.h index 04da7759773da..4e0b0f16464ba 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor.h +++ b/shell/platform/embedder/tests/embedder_test_compositor.h @@ -29,8 +29,9 @@ class EmbedderTestCompositor { virtual ~EmbedderTestCompositor(); - void SetBackingStoreProducer( - std::unique_ptr backingstore_producer); + virtual void SetRenderTargetType( + EmbedderTestBackingStoreProducer::RenderTargetType type, + FlutterSoftwarePixelFormat software_pixfmt) = 0; bool CreateBackingStore(const FlutterBackingStoreConfig* config, FlutterBackingStore* backing_store_out); diff --git a/shell/platform/embedder/tests/embedder_test_compositor_gl.cc b/shell/platform/embedder/tests/embedder_test_compositor_gl.cc index 29daf8da59969..8727317a901dc 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor_gl.cc +++ b/shell/platform/embedder/tests/embedder_test_compositor_gl.cc @@ -15,12 +15,37 @@ namespace flutter { namespace testing { EmbedderTestCompositorGL::EmbedderTestCompositorGL( + std::shared_ptr egl_context, SkISize surface_size, sk_sp context) - : EmbedderTestCompositor(surface_size, std::move(context)) {} + : EmbedderTestCompositor(surface_size, std::move(context)), + egl_context_(std::move(egl_context)) {} EmbedderTestCompositorGL::~EmbedderTestCompositorGL() = default; +void EmbedderTestCompositorGL::SetRenderTargetType( + EmbedderTestBackingStoreProducer::RenderTargetType type, + FlutterSoftwarePixelFormat software_pixfmt) { + switch (type) { + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLSurface: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLTexture: + case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer: + case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer2: + // no-op: Rendering into GL and software render targets is supported. + break; + case EmbedderTestBackingStoreProducer::RenderTargetType::kMetalTexture: + case EmbedderTestBackingStoreProducer::RenderTargetType::kVulkanImage: + FML_LOG(FATAL) << "Unsupported render target type: " + << static_cast(type); + break; + } + auto producer = std::make_unique( + context_, type, software_pixfmt); + producer->SetEGLContext(egl_context_); + backingstore_producer_ = std::move(producer); +} + bool EmbedderTestCompositorGL::UpdateOffscrenComposition( const FlutterLayer** layers, size_t layers_count) { diff --git a/shell/platform/embedder/tests/embedder_test_compositor_gl.h b/shell/platform/embedder/tests/embedder_test_compositor_gl.h index 507760d5acc97..2569b910e4981 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor_gl.h +++ b/shell/platform/embedder/tests/embedder_test_compositor_gl.h @@ -5,21 +5,30 @@ #ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_COMPOSITOR_GL_H_ #define FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_COMPOSITOR_GL_H_ +#include + #include "flutter/fml/macros.h" #include "flutter/shell/platform/embedder/embedder.h" #include "flutter/shell/platform/embedder/tests/embedder_test_compositor.h" +#include "flutter/testing/test_gl_surface.h" namespace flutter { namespace testing { class EmbedderTestCompositorGL : public EmbedderTestCompositor { public: - EmbedderTestCompositorGL(SkISize surface_size, + EmbedderTestCompositorGL(std::shared_ptr egl_context, + SkISize surface_size, sk_sp context); ~EmbedderTestCompositorGL() override; + void SetRenderTargetType( + EmbedderTestBackingStoreProducer::RenderTargetType type, + FlutterSoftwarePixelFormat software_pixfmt) override; + private: + std::shared_ptr egl_context_; bool UpdateOffscrenComposition(const FlutterLayer** layers, size_t layers_count) override; diff --git a/shell/platform/embedder/tests/embedder_test_compositor_metal.h b/shell/platform/embedder/tests/embedder_test_compositor_metal.h index bbe56272b5358..4bd134ac3b445 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor_metal.h +++ b/shell/platform/embedder/tests/embedder_test_compositor_metal.h @@ -19,6 +19,10 @@ class EmbedderTestCompositorMetal : public EmbedderTestCompositor { ~EmbedderTestCompositorMetal() override; + void SetRenderTargetType( + EmbedderTestBackingStoreProducer::RenderTargetType type, + FlutterSoftwarePixelFormat software_pixfmt) override; + private: bool UpdateOffscrenComposition(const FlutterLayer** layers, size_t layers_count) override; diff --git a/shell/platform/embedder/tests/embedder_test_compositor_metal.mm b/shell/platform/embedder/tests/embedder_test_compositor_metal.mm index 45eb8575678ea..bdf1b59492940 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor_metal.mm +++ b/shell/platform/embedder/tests/embedder_test_compositor_metal.mm @@ -20,6 +20,26 @@ EmbedderTestCompositorMetal::~EmbedderTestCompositorMetal() = default; +void EmbedderTestCompositorMetal::SetRenderTargetType( + EmbedderTestBackingStoreProducer::RenderTargetType type, + FlutterSoftwarePixelFormat software_pixfmt) { + switch (type) { + case EmbedderTestBackingStoreProducer::RenderTargetType::kMetalTexture: + // no-op. + break; + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLSurface: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLTexture: + case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer: + case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer2: + case EmbedderTestBackingStoreProducer::RenderTargetType::kVulkanImage: + FML_LOG(FATAL) << "Unsupported render target type: " << static_cast(type); + break; + } + backingstore_producer_ = + std::make_unique(context_, type, software_pixfmt); +} + bool EmbedderTestCompositorMetal::UpdateOffscrenComposition(const FlutterLayer** layers, size_t layers_count) { last_composition_ = nullptr; diff --git a/shell/platform/embedder/tests/embedder_test_compositor_software.cc b/shell/platform/embedder/tests/embedder_test_compositor_software.cc index 46938205e2c13..08e277039541b 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor_software.cc +++ b/shell/platform/embedder/tests/embedder_test_compositor_software.cc @@ -17,6 +17,27 @@ EmbedderTestCompositorSoftware::EmbedderTestCompositorSoftware( EmbedderTestCompositorSoftware::~EmbedderTestCompositorSoftware() = default; +void EmbedderTestCompositorSoftware::SetRenderTargetType( + EmbedderTestBackingStoreProducer::RenderTargetType type, + FlutterSoftwarePixelFormat software_pixfmt) { + switch (type) { + case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer: + case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer2: + // no-op. + break; + case EmbedderTestBackingStoreProducer::RenderTargetType::kMetalTexture: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLSurface: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLTexture: + case EmbedderTestBackingStoreProducer::RenderTargetType::kVulkanImage: + FML_LOG(FATAL) << "Unsupported render target type: " + << static_cast(type); + break; + } + backingstore_producer_ = std::make_unique( + context_, type, software_pixfmt); +} + bool EmbedderTestCompositorSoftware::UpdateOffscrenComposition( const FlutterLayer** layers, size_t layers_count) { diff --git a/shell/platform/embedder/tests/embedder_test_compositor_software.h b/shell/platform/embedder/tests/embedder_test_compositor_software.h index ffd007fff0fdb..d076d29106e3e 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor_software.h +++ b/shell/platform/embedder/tests/embedder_test_compositor_software.h @@ -16,6 +16,10 @@ class EmbedderTestCompositorSoftware : public EmbedderTestCompositor { ~EmbedderTestCompositorSoftware() override; + void SetRenderTargetType( + EmbedderTestBackingStoreProducer::RenderTargetType type, + FlutterSoftwarePixelFormat software_pixfmt) override; + private: bool UpdateOffscrenComposition(const FlutterLayer** layers, size_t layers_count); diff --git a/shell/platform/embedder/tests/embedder_test_compositor_vulkan.cc b/shell/platform/embedder/tests/embedder_test_compositor_vulkan.cc index 18a0fafabd465..3477a223c250c 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor_vulkan.cc +++ b/shell/platform/embedder/tests/embedder_test_compositor_vulkan.cc @@ -22,6 +22,27 @@ EmbedderTestCompositorVulkan::EmbedderTestCompositorVulkan( EmbedderTestCompositorVulkan::~EmbedderTestCompositorVulkan() = default; +void EmbedderTestCompositorVulkan::SetRenderTargetType( + EmbedderTestBackingStoreProducer::RenderTargetType type, + FlutterSoftwarePixelFormat software_pixfmt) { + switch (type) { + case EmbedderTestBackingStoreProducer::RenderTargetType::kVulkanImage: + // no-op. + break; + case EmbedderTestBackingStoreProducer::RenderTargetType::kMetalTexture: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLSurface: + case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLTexture: + case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer: + case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer2: + FML_LOG(FATAL) << "Unsupported render target type: " + << static_cast(type); + break; + } + backingstore_producer_ = std::make_unique( + context_, type, software_pixfmt); +} + bool EmbedderTestCompositorVulkan::UpdateOffscrenComposition( const FlutterLayer** layers, size_t layers_count) { diff --git a/shell/platform/embedder/tests/embedder_test_compositor_vulkan.h b/shell/platform/embedder/tests/embedder_test_compositor_vulkan.h index 608bda52ec858..46d54fe728fef 100644 --- a/shell/platform/embedder/tests/embedder_test_compositor_vulkan.h +++ b/shell/platform/embedder/tests/embedder_test_compositor_vulkan.h @@ -19,6 +19,10 @@ class EmbedderTestCompositorVulkan : public EmbedderTestCompositor { ~EmbedderTestCompositorVulkan() override; + void SetRenderTargetType( + EmbedderTestBackingStoreProducer::RenderTargetType type, + FlutterSoftwarePixelFormat software_pixfmt) override; + private: bool UpdateOffscrenComposition(const FlutterLayer** layers, size_t layers_count) override; diff --git a/shell/platform/embedder/tests/embedder_test_context.cc b/shell/platform/embedder/tests/embedder_test_context.cc index d53491ee2935c..0f5e3dcf9afe5 100644 --- a/shell/platform/embedder/tests/embedder_test_context.cc +++ b/shell/platform/embedder/tests/embedder_test_context.cc @@ -96,32 +96,6 @@ void EmbedderTestContext::SetRootSurfaceTransformation(SkMatrix matrix) { root_surface_transformation_ = matrix; } -void EmbedderTestContext::SetRenderTargetType( - EmbedderTestBackingStoreProducer::RenderTargetType type, - FlutterSoftwarePixelFormat software_pixfmt) { - // TODO(wrightgeorge): figure out a better way of plumbing through the - // GrDirectContext - auto& compositor = GetCompositor(); - auto producer = std::make_unique( - compositor.GetGrContext(), type, software_pixfmt); -#ifdef SHELL_ENABLE_GL - switch (type) { - case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLFramebuffer: - case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLTexture: - case EmbedderTestBackingStoreProducer::RenderTargetType::kOpenGLSurface: - producer->SetEGLContext(egl_context_); - break; - case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer: - case EmbedderTestBackingStoreProducer::RenderTargetType::kSoftwareBuffer2: - case EmbedderTestBackingStoreProducer::RenderTargetType::kMetalTexture: - case EmbedderTestBackingStoreProducer::RenderTargetType::kVulkanImage: - // no-op. - break; - } -#endif // SHELL_ENABLE_GL - compositor.SetBackingStoreProducer(std::move(producer)); -} - void EmbedderTestContext::AddIsolateCreateCallback( const fml::closure& closure) { if (closure) { diff --git a/shell/platform/embedder/tests/embedder_test_context_gl.cc b/shell/platform/embedder/tests/embedder_test_context_gl.cc index ac916ead94f87..e562411841f0c 100644 --- a/shell/platform/embedder/tests/embedder_test_context_gl.cc +++ b/shell/platform/embedder/tests/embedder_test_context_gl.cc @@ -140,7 +140,7 @@ void EmbedderTestContextGL::SetupCompositor() { FML_CHECK(gl_surface_) << "Set up the GL surface before setting up a compositor."; compositor_ = std::make_unique( - gl_surface_->GetSurfaceSize(), gl_surface_->GetGrContext()); + egl_context_, gl_surface_->GetSurfaceSize(), gl_surface_->GetGrContext()); GLClearCurrent(); }