From 38d4abac51937a3b968507d96b252fbcdb247b6d Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Mon, 22 Nov 2021 14:56:58 -0800 Subject: [PATCH] Renderer components no longer need a surface reference to function. --- impeller/aiks/aiks_playground.cc | 4 ++-- impeller/aiks/picture_renderer.cc | 6 ++--- impeller/aiks/picture_renderer.h | 4 +--- impeller/entity/contents.cc | 23 ++++++++----------- impeller/entity/contents.h | 6 ----- impeller/entity/entity_playground.cc | 5 ++-- impeller/entity/entity_renderer.cc | 5 ++-- impeller/entity/entity_renderer.h | 3 +-- impeller/playground/playground.mm | 9 ++++---- impeller/renderer/BUILD.gn | 4 ++-- .../backend/metal/command_buffer_mtl.h | 2 +- .../backend/metal/command_buffer_mtl.mm | 5 ++-- .../renderer/backend/metal/render_pass_mtl.h | 4 ++-- .../renderer/backend/metal/render_pass_mtl.mm | 8 +++---- impeller/renderer/command_buffer.h | 5 ++-- impeller/renderer/render_pass.cc | 11 ++++++++- impeller/renderer/render_pass.h | 11 ++++++++- ...er_pass_descriptor.cc => render_target.cc} | 7 +++++- ...nder_pass_descriptor.h => render_target.h} | 2 ++ impeller/renderer/renderer.cc | 2 +- impeller/renderer/renderer.h | 3 +-- impeller/renderer/renderer_unittests.cc | 15 +++++------- impeller/renderer/surface.h | 2 +- 23 files changed, 75 insertions(+), 71 deletions(-) rename impeller/renderer/{render_pass_descriptor.cc => render_target.cc} (89%) rename impeller/renderer/{render_pass_descriptor.h => render_target.h} (96%) diff --git a/impeller/aiks/aiks_playground.cc b/impeller/aiks/aiks_playground.cc index 8541b193a6bfd..7928ead04cdb4 100644 --- a/impeller/aiks/aiks_playground.cc +++ b/impeller/aiks/aiks_playground.cc @@ -19,8 +19,8 @@ bool AiksPlayground::OpenPlaygroundHere(const Picture& picture) { } return Playground::OpenPlaygroundHere( - [renderer, &picture](const Surface& surface, RenderPass& pass) -> bool { - return renderer->Render(surface, pass, picture); + [renderer, &picture](RenderPass& pass) -> bool { + return renderer->Render(pass, picture); }); } diff --git a/impeller/aiks/picture_renderer.cc b/impeller/aiks/picture_renderer.cc index 85f9da018fd47..33db1008f364c 100644 --- a/impeller/aiks/picture_renderer.cc +++ b/impeller/aiks/picture_renderer.cc @@ -22,16 +22,14 @@ bool PictureRenderer::IsValid() const { return is_valid_; } -bool PictureRenderer::Render(const Surface& surface, - RenderPass& parent_pass, - const Picture& picture) { +bool PictureRenderer::Render(RenderPass& parent_pass, const Picture& picture) { if (!IsValid()) { return false; } for (const auto& entry : picture.entries) { if (auto pass = entry.pass) { - if (!entity_renderer_.RenderEntities(surface, parent_pass, + if (!entity_renderer_.RenderEntities(parent_pass, pass->GetPassEntities())) { return false; } diff --git a/impeller/aiks/picture_renderer.h b/impeller/aiks/picture_renderer.h index 66aa1b5c4826a..269c321b29f70 100644 --- a/impeller/aiks/picture_renderer.h +++ b/impeller/aiks/picture_renderer.h @@ -22,9 +22,7 @@ class PictureRenderer { bool IsValid() const; - [[nodiscard]] bool Render(const Surface& surface, - RenderPass& parent_pass, - const Picture& picture); + [[nodiscard]] bool Render(RenderPass& parent_pass, const Picture& picture); private: EntityRenderer entity_renderer_; diff --git a/impeller/entity/contents.cc b/impeller/entity/contents.cc index 571418652a41a..9d15c959e6cbe 100644 --- a/impeller/entity/contents.cc +++ b/impeller/entity/contents.cc @@ -56,7 +56,6 @@ const std::vector& LinearGradientContents::GetColors() const { bool LinearGradientContents::Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const { using VS = GradientFillPipeline::VertexShader; using FS = GradientFillPipeline::FragmentShader; @@ -75,8 +74,8 @@ bool LinearGradientContents::Render(const ContentRenderer& renderer, } VS::FrameInfo frame_info; - frame_info.mvp = - Matrix::MakeOrthographic(surface.GetSize()) * entity.GetTransformation(); + frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) * + entity.GetTransformation(); FS::GradientInfo gradient_info; gradient_info.start_point = start_point_; @@ -134,7 +133,6 @@ static VertexBuffer CreateSolidFillVertices(const Path& path, bool SolidColorContents::Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const { if (color_.IsTransparent()) { return true; @@ -150,8 +148,8 @@ bool SolidColorContents::Render(const ContentRenderer& renderer, CreateSolidFillVertices(entity.GetPath(), pass.GetTransientsBuffer())); VS::FrameInfo frame_info; - frame_info.mvp = - Matrix::MakeOrthographic(surface.GetSize()) * entity.GetTransformation(); + frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) * + entity.GetTransformation(); frame_info.color = color_; VS::BindFrameInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frame_info)); @@ -188,7 +186,6 @@ std::shared_ptr TextureContents::GetTexture() const { bool TextureContents::Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const { if (texture_ == nullptr) { return true; @@ -234,8 +231,8 @@ bool TextureContents::Render(const ContentRenderer& renderer, auto& host_buffer = pass.GetTransientsBuffer(); VS::FrameInfo frame_info; - frame_info.mvp = - Matrix::MakeOrthographic(surface.GetSize()) * entity.GetTransformation(); + frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) * + entity.GetTransformation(); Command cmd; cmd.label = "TextureFill"; @@ -316,7 +313,6 @@ static VertexBuffer CreateSolidStrokeVertices(const Path& path, bool SolidStrokeContents::Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const { if (color_.IsTransparent() || stroke_size_ <= 0.0) { return true; @@ -325,8 +321,8 @@ bool SolidStrokeContents::Render(const ContentRenderer& renderer, using VS = SolidStrokeVertexShader; VS::FrameInfo frame_info; - frame_info.mvp = - Matrix::MakeOrthographic(surface.GetSize()) * entity.GetTransformation(); + frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) * + entity.GetTransformation(); VS::StrokeInfo stroke_info; stroke_info.color = color_; @@ -366,7 +362,6 @@ ClipContents::~ClipContents() = default; bool ClipContents::Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const { using VS = ClipPipeline::VertexShader; @@ -380,7 +375,7 @@ bool ClipContents::Render(const ContentRenderer& renderer, VS::FrameInfo info; // The color really doesn't matter. info.color = Color::SkyBlue(); - info.mvp = Matrix::MakeOrthographic(surface.GetSize()); + info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()); VS::BindFrameInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(info)); diff --git a/impeller/entity/contents.h b/impeller/entity/contents.h index 826bf29040763..381a11f5f011f 100644 --- a/impeller/entity/contents.h +++ b/impeller/entity/contents.h @@ -28,7 +28,6 @@ class Contents { virtual bool Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const = 0; private: @@ -44,7 +43,6 @@ class LinearGradientContents final : public Contents { // |Contents| bool Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const override; void SetEndPoints(Point start_point, Point end_point); @@ -76,7 +74,6 @@ class SolidColorContents final : public Contents { // |Contents| bool Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const override; private: @@ -102,7 +99,6 @@ class TextureContents final : public Contents { // |Contents| bool Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const override; public: @@ -129,7 +125,6 @@ class SolidStrokeContents final : public Contents { // |Contents| bool Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const override; private: @@ -148,7 +143,6 @@ class ClipContents final : public Contents { // |Contents| bool Render(const ContentRenderer& renderer, const Entity& entity, - const Surface& surface, RenderPass& pass) const override; private: diff --git a/impeller/entity/entity_playground.cc b/impeller/entity/entity_playground.cc index e643bd81488c7..835cf655fbaa5 100644 --- a/impeller/entity/entity_playground.cc +++ b/impeller/entity/entity_playground.cc @@ -17,10 +17,9 @@ bool EntityPlayground::OpenPlaygroundHere(Entity entity) { return false; } } - Renderer::RenderCallback callback = [&](const Surface& surface, - RenderPass& pass) -> bool { + Renderer::RenderCallback callback = [&](RenderPass& pass) -> bool { std::vector entities = {entity}; - return renderer_->RenderEntities(surface, pass, entities); + return renderer_->RenderEntities(pass, entities); }; return Playground::OpenPlaygroundHere(callback); } diff --git a/impeller/entity/entity_renderer.cc b/impeller/entity/entity_renderer.cc index 2531ff833b3ce..9572080b059f4 100644 --- a/impeller/entity/entity_renderer.cc +++ b/impeller/entity/entity_renderer.cc @@ -29,8 +29,7 @@ bool EntityRenderer::IsValid() const { return is_valid_; } -bool EntityRenderer::RenderEntities(const Surface& surface, - RenderPass& parent_pass, +bool EntityRenderer::RenderEntities(RenderPass& parent_pass, const std::vector& entities) { if (!IsValid()) { return false; @@ -38,7 +37,7 @@ bool EntityRenderer::RenderEntities(const Surface& surface, for (const auto& entity : entities) { if (auto contents = entity.GetContents()) { - if (!contents->Render(*content_renderer_, entity, surface, parent_pass)) { + if (!contents->Render(*content_renderer_, entity, parent_pass)) { return false; } } diff --git a/impeller/entity/entity_renderer.h b/impeller/entity/entity_renderer.h index b87b64572ef29..e453100ce0744 100644 --- a/impeller/entity/entity_renderer.h +++ b/impeller/entity/entity_renderer.h @@ -23,8 +23,7 @@ class EntityRenderer { bool IsValid() const; - [[nodiscard]] bool RenderEntities(const Surface& surface, - RenderPass& parent_pass, + [[nodiscard]] bool RenderEntities(RenderPass& parent_pass, const std::vector& entities); private: diff --git a/impeller/playground/playground.mm b/impeller/playground/playground.mm index 00c7d92c423ff..a325c0be6a12f 100644 --- a/impeller/playground/playground.mm +++ b/impeller/playground/playground.mm @@ -180,11 +180,10 @@ static void PlaygroundKeyCallback(GLFWwindow* window, Surface surface(desc); - Renderer::RenderCallback wrapped_callback = - [render_callback](const auto& surface, auto& pass) { - pass.SetLabel("Playground Main Render Pass"); - return render_callback(surface, pass); - }; + Renderer::RenderCallback wrapped_callback = [render_callback](auto& pass) { + pass.SetLabel("Playground Main Render Pass"); + return render_callback(pass); + }; if (!renderer_.Render(surface, wrapped_callback)) { FML_LOG(ERROR) << "Could not render into the surface."; diff --git a/impeller/renderer/BUILD.gn b/impeller/renderer/BUILD.gn index be4fe29aa4006..cb175b91e3b41 100644 --- a/impeller/renderer/BUILD.gn +++ b/impeller/renderer/BUILD.gn @@ -72,8 +72,8 @@ impeller_component("renderer") { "range.h", "render_pass.h", "render_pass.cc", - "render_pass_descriptor.h", - "render_pass_descriptor.cc", + "render_target.h", + "render_target.cc", "renderer.h", "renderer.cc", "sampler.h", diff --git a/impeller/renderer/backend/metal/command_buffer_mtl.h b/impeller/renderer/backend/metal/command_buffer_mtl.h index 9b438455f4923..46b398efc1db1 100644 --- a/impeller/renderer/backend/metal/command_buffer_mtl.h +++ b/impeller/renderer/backend/metal/command_buffer_mtl.h @@ -34,7 +34,7 @@ class CommandBufferMTL final : public CommandBuffer { // |CommandBuffer| std::shared_ptr CreateRenderPass( - const RenderTarget& desc) const override; + RenderTarget target) const override; FML_DISALLOW_COPY_AND_ASSIGN(CommandBufferMTL); }; diff --git a/impeller/renderer/backend/metal/command_buffer_mtl.mm b/impeller/renderer/backend/metal/command_buffer_mtl.mm index 5b4f7628cc39d..1065008dba461 100644 --- a/impeller/renderer/backend/metal/command_buffer_mtl.mm +++ b/impeller/renderer/backend/metal/command_buffer_mtl.mm @@ -53,12 +53,13 @@ } std::shared_ptr CommandBufferMTL::CreateRenderPass( - const RenderTarget& desc) const { + RenderTarget target) const { if (!buffer_) { return nullptr; } - auto pass = std::shared_ptr(new RenderPassMTL(buffer_, desc)); + auto pass = std::shared_ptr( + new RenderPassMTL(buffer_, std::move(target))); if (!pass->IsValid()) { return nullptr; } diff --git a/impeller/renderer/backend/metal/render_pass_mtl.h b/impeller/renderer/backend/metal/render_pass_mtl.h index 530a60c2b0a2d..d177c688cc613 100644 --- a/impeller/renderer/backend/metal/render_pass_mtl.h +++ b/impeller/renderer/backend/metal/render_pass_mtl.h @@ -8,7 +8,7 @@ #include "flutter/fml/macros.h" #include "impeller/renderer/render_pass.h" -#include "impeller/renderer/render_pass_descriptor.h" +#include "impeller/renderer/render_target.h" namespace impeller { @@ -27,7 +27,7 @@ class RenderPassMTL final : public RenderPass { std::string label_; bool is_valid_ = false; - RenderPassMTL(id buffer, const RenderTarget& desc); + RenderPassMTL(id buffer, RenderTarget target); // |RenderPass| bool IsValid() const override; diff --git a/impeller/renderer/backend/metal/render_pass_mtl.mm b/impeller/renderer/backend/metal/render_pass_mtl.mm index 3737bf25cc8ce..399749b1b0081 100644 --- a/impeller/renderer/backend/metal/render_pass_mtl.mm +++ b/impeller/renderer/backend/metal/render_pass_mtl.mm @@ -92,10 +92,10 @@ static bool ConfigureStencilAttachment( return result; } -RenderPassMTL::RenderPassMTL(id buffer, - const RenderTarget& desc) - : buffer_(buffer), - desc_(ToMTLRenderPassDescriptor(desc)), +RenderPassMTL::RenderPassMTL(id buffer, RenderTarget target) + : RenderPass(std::move(target)), + buffer_(buffer), + desc_(ToMTLRenderPassDescriptor(GetRenderTarget())), transients_buffer_(HostBuffer::Create()) { if (!buffer_ || !desc_) { return; diff --git a/impeller/renderer/command_buffer.h b/impeller/renderer/command_buffer.h index 554d595c2412f..a1240badbfaeb 100644 --- a/impeller/renderer/command_buffer.h +++ b/impeller/renderer/command_buffer.h @@ -54,12 +54,13 @@ class CommandBuffer { //---------------------------------------------------------------------------- /// @brief Create a render pass to record render commands into. /// - /// @param[in] desc The description of the render pass. + /// @param[in] desc The description of the render target this pass will + /// target. /// /// @return A valid render pass or null. /// virtual std::shared_ptr CreateRenderPass( - const RenderTarget& desc) const = 0; + RenderTarget render_target) const = 0; protected: CommandBuffer(); diff --git a/impeller/renderer/render_pass.cc b/impeller/renderer/render_pass.cc index 93c4ead3bf638..411891c2c3f57 100644 --- a/impeller/renderer/render_pass.cc +++ b/impeller/renderer/render_pass.cc @@ -6,8 +6,17 @@ namespace impeller { -RenderPass::RenderPass() = default; +RenderPass::RenderPass(RenderTarget target) + : render_target_(std::move(target)) {} RenderPass::~RenderPass() = default; +const RenderTarget& RenderPass::GetRenderTarget() const { + return render_target_; +} + +ISize RenderPass::GetRenderTargetSize() const { + return render_target_.GetRenderTargetSize(); +} + } // namespace impeller diff --git a/impeller/renderer/render_pass.h b/impeller/renderer/render_pass.h index d0b2ee8c921f1..588250a631269 100644 --- a/impeller/renderer/render_pass.h +++ b/impeller/renderer/render_pass.h @@ -7,6 +7,7 @@ #include #include "impeller/renderer/command.h" +#include "impeller/renderer/render_target.h" namespace impeller { @@ -20,10 +21,16 @@ class Allocator; /// Render passes can be obtained from the command buffer in which /// the pass is meant to encode commands into. /// +/// @see `CommandBuffer` +/// class RenderPass { public: virtual ~RenderPass(); + const RenderTarget& GetRenderTarget() const; + + ISize GetRenderTargetSize() const; + virtual bool IsValid() const = 0; virtual void SetLabel(std::string label) = 0; @@ -52,9 +59,11 @@ class RenderPass { virtual bool EncodeCommands(Allocator& transients_allocator) const = 0; protected: - RenderPass(); + RenderPass(RenderTarget target); private: + const RenderTarget render_target_; + FML_DISALLOW_COPY_AND_ASSIGN(RenderPass); }; diff --git a/impeller/renderer/render_pass_descriptor.cc b/impeller/renderer/render_target.cc similarity index 89% rename from impeller/renderer/render_pass_descriptor.cc rename to impeller/renderer/render_target.cc index f8dbb732cdd41..db533e8674e85 100644 --- a/impeller/renderer/render_pass_descriptor.cc +++ b/impeller/renderer/render_target.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "impeller/renderer/render_pass_descriptor.h" +#include "impeller/renderer/render_target.h" #include "impeller/renderer/texture.h" @@ -29,6 +29,11 @@ std::optional RenderTarget::GetColorAttachmentSize(size_t index) const { return found->second.texture->GetSize(); } +ISize RenderTarget::GetRenderTargetSize() const { + auto size = GetColorAttachmentSize(0u); + return size.has_value() ? size.value() : ISize{}; +} + RenderTarget& RenderTarget::SetColorAttachment(ColorAttachment attachment, size_t index) { if (attachment) { diff --git a/impeller/renderer/render_pass_descriptor.h b/impeller/renderer/render_target.h similarity index 96% rename from impeller/renderer/render_pass_descriptor.h rename to impeller/renderer/render_target.h index 5ace1b2aca138..8a98442439bea 100644 --- a/impeller/renderer/render_pass_descriptor.h +++ b/impeller/renderer/render_target.h @@ -21,6 +21,8 @@ class RenderTarget { bool HasColorAttachment(size_t index) const; + ISize GetRenderTargetSize() const; + std::optional GetColorAttachmentSize(size_t index) const; RenderTarget& SetColorAttachment(ColorAttachment attachment, size_t index); diff --git a/impeller/renderer/renderer.cc b/impeller/renderer/renderer.cc index bc3e3e4657b15..f7e5662f99f50 100644 --- a/impeller/renderer/renderer.cc +++ b/impeller/renderer/renderer.cc @@ -51,7 +51,7 @@ bool Renderer::Render(const Surface& surface, return false; } - if (render_callback && !render_callback(surface, *render_pass)) { + if (render_callback && !render_callback(*render_pass)) { return false; } diff --git a/impeller/renderer/renderer.h b/impeller/renderer/renderer.h index ebd3930aec6cc..74e2d8c5222bf 100644 --- a/impeller/renderer/renderer.h +++ b/impeller/renderer/renderer.h @@ -21,8 +21,7 @@ class RenderPass; class Renderer { public: - using RenderCallback = - std::function; + using RenderCallback = std::function; Renderer(std::shared_ptr context); diff --git a/impeller/renderer/renderer_unittests.cc b/impeller/renderer/renderer_unittests.cc index d165aa7a3bb7a..a388851b76321 100644 --- a/impeller/renderer/renderer_unittests.cc +++ b/impeller/renderer/renderer_unittests.cc @@ -60,8 +60,7 @@ TEST_F(RendererTest, CanCreateBoxPrimitive) { ASSERT_TRUE(bridge && boston); auto sampler = context->GetSamplerLibrary()->GetSampler({}); ASSERT_TRUE(sampler); - Renderer::RenderCallback callback = [&](const Surface& surface, - RenderPass& pass) { + Renderer::RenderCallback callback = [&](RenderPass& pass) { Command cmd; cmd.label = "Box"; cmd.pipeline = box_pipeline; @@ -69,7 +68,7 @@ TEST_F(RendererTest, CanCreateBoxPrimitive) { cmd.BindVertices(vertex_buffer); VS::UniformBuffer uniforms; - uniforms.mvp = Matrix::MakeOrthographic(surface.GetSize()); + uniforms.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()); VS::BindUniformBuffer(cmd, pass.GetTransientsBuffer().EmplaceUniform(uniforms)); @@ -125,8 +124,7 @@ TEST_F(RendererTest, CanRenderMultiplePrimitives) { auto sampler = context->GetSamplerLibrary()->GetSampler({}); ASSERT_TRUE(sampler); - Renderer::RenderCallback callback = [&](const Surface& surface, - RenderPass& pass) { + Renderer::RenderCallback callback = [&](RenderPass& pass) { Command cmd; cmd.label = "Box"; cmd.pipeline = box_pipeline; @@ -149,7 +147,7 @@ TEST_F(RendererTest, CanRenderMultiplePrimitives) { for (size_t i = 0; i < 1; i++) { for (size_t j = 0; j < 1; j++) { VS::UniformBuffer uniforms; - uniforms.mvp = Matrix::MakeOrthographic(surface.GetSize()) * + uniforms.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) * Matrix::MakeTranslation({i * 50.0f, j * 50.0f, 0.0f}); VS::BindUniformBuffer( cmd, pass.GetTransientsBuffer().EmplaceUniform(uniforms)); @@ -301,8 +299,7 @@ TEST_F(RendererTest, CanRenderPath) { auto sampler = context->GetSamplerLibrary()->GetSampler({}); ASSERT_TRUE(sampler); - Renderer::RenderCallback callback = [&](const Surface& surface, - RenderPass& pass) { + Renderer::RenderCallback callback = [&](RenderPass& pass) { Command cmd; cmd.label = "Box"; cmd.pipeline = box_pipeline.WaitAndGet(); @@ -324,7 +321,7 @@ TEST_F(RendererTest, CanRenderPath) { cmd.winding = tessellator.GetFrontFaceWinding(); VS::UniformBuffer uniforms; - uniforms.mvp = Matrix::MakeOrthographic(surface.GetSize()); + uniforms.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()); VS::BindUniformBuffer(cmd, pass.GetTransientsBuffer().EmplaceUniform(uniforms)); if (!pass.AddCommand(cmd)) { diff --git a/impeller/renderer/surface.h b/impeller/renderer/surface.h index 7a7515ffe4029..db6fc2283a5fc 100644 --- a/impeller/renderer/surface.h +++ b/impeller/renderer/surface.h @@ -10,7 +10,7 @@ #include "flutter/fml/macros.h" #include "impeller/renderer/context.h" #include "impeller/renderer/render_pass.h" -#include "impeller/renderer/render_pass_descriptor.h" +#include "impeller/renderer/render_target.h" namespace impeller {