From be69b42bf9c60a0ee8dce8bd3100e9f1506fb42d Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Sun, 6 Jun 2021 16:29:48 -0700 Subject: [PATCH] Multi-encodable render passes. --- .../impeller/compositor/formats_metal.mm | 11 +-------- .../flutter/impeller/compositor/render_pass.h | 5 +++- .../impeller/compositor/render_pass.mm | 24 ++++++++++++------- .../flutter/impeller/compositor/renderer.mm | 7 ++++++ .../src/flutter/impeller/compositor/surface.h | 2 ++ .../flutter/impeller/compositor/surface.mm | 8 +++++-- .../src/flutter/impeller/compositor/texture.h | 3 +++ .../flutter/impeller/compositor/texture.mm | 5 ++++ engine/src/flutter/impeller/geometry/size.h | 13 ++++++++++ .../impeller/host/impeller_renderer.mm | 1 + 10 files changed, 57 insertions(+), 22 deletions(-) diff --git a/engine/src/flutter/impeller/compositor/formats_metal.mm b/engine/src/flutter/impeller/compositor/formats_metal.mm index f83a054a02b..69a29192261 100644 --- a/engine/src/flutter/impeller/compositor/formats_metal.mm +++ b/engine/src/flutter/impeller/compositor/formats_metal.mm @@ -80,19 +80,10 @@ MTLDepthStencilDescriptor* ToMTLDepthStencilDescriptor( static bool ConfigureRenderPassAttachment( RenderPassAttachment& attachment, MTLRenderPassAttachmentDescriptor* desc) { - if (!attachment) { - return false; - } - - if (!desc.texture) { - return false; - } - attachment.texture = std::make_shared(desc.texture); attachment.load_action = FromMTLLoadAction(desc.loadAction); attachment.store_action = FromMTLStoreAction(desc.storeAction); - - return true; + return attachment; } static ColorRenderPassAttachment FromMTLRenderPassColorAttachmentDescriptor( diff --git a/engine/src/flutter/impeller/compositor/render_pass.h b/engine/src/flutter/impeller/compositor/render_pass.h index b5ab8e713f8..2c3bda7d0ab 100644 --- a/engine/src/flutter/impeller/compositor/render_pass.h +++ b/engine/src/flutter/impeller/compositor/render_pass.h @@ -68,10 +68,13 @@ class RenderPass { bool IsValid() const; + bool Encode() const; + private: friend class CommandBuffer; - id pass_ = nil; + id buffer_ = nil; + MTLRenderPassDescriptor* desc_ = nil; bool is_valid_ = false; RenderPass(id buffer, const RenderPassDescriptor& desc); diff --git a/engine/src/flutter/impeller/compositor/render_pass.mm b/engine/src/flutter/impeller/compositor/render_pass.mm index 0850266035c..a84f645c7fd 100644 --- a/engine/src/flutter/impeller/compositor/render_pass.mm +++ b/engine/src/flutter/impeller/compositor/render_pass.mm @@ -114,17 +114,11 @@ MTLRenderPassDescriptor* RenderPassDescriptor::ToMTLRenderPassDescriptor() } RenderPass::RenderPass(id buffer, - const RenderPassDescriptor& desc) { - auto descriptor = desc.ToMTLRenderPassDescriptor(); - if (!descriptor) { + const RenderPassDescriptor& desc) + : buffer_(buffer), desc_(desc.ToMTLRenderPassDescriptor()) { + if (!buffer_ || !desc_) { return; } - - pass_ = [buffer renderCommandEncoderWithDescriptor:descriptor]; - if (!pass_) { - return; - } - is_valid_ = true; } @@ -134,4 +128,16 @@ bool RenderPass::IsValid() const { return is_valid_; } +bool RenderPass::Encode() const { + if (!IsValid()) { + return false; + } + auto pass = [buffer_ renderCommandEncoderWithDescriptor:desc_]; + if (!pass) { + return false; + } + [pass endEncoding]; + return true; +} + } // namespace impeller diff --git a/engine/src/flutter/impeller/compositor/renderer.mm b/engine/src/flutter/impeller/compositor/renderer.mm index 6ca114d36a1..942e1c5af48 100644 --- a/engine/src/flutter/impeller/compositor/renderer.mm +++ b/engine/src/flutter/impeller/compositor/renderer.mm @@ -43,6 +43,13 @@ bool Renderer::Render(const Surface& surface) { return false; } + auto render_pass = + command_buffer->CreateRenderPass(surface.GetRenderPassDescriptor()); + if (!render_pass) { + return false; + } + render_pass->Encode(); + ::dispatch_semaphore_wait(frames_in_flight_sema_, DISPATCH_TIME_FOREVER); command_buffer->Commit( diff --git a/engine/src/flutter/impeller/compositor/surface.h b/engine/src/flutter/impeller/compositor/surface.h index 496443cbeed..f4e01d25fa9 100644 --- a/engine/src/flutter/impeller/compositor/surface.h +++ b/engine/src/flutter/impeller/compositor/surface.h @@ -22,6 +22,8 @@ class Surface { bool IsValid() const; + const RenderPassDescriptor& GetRenderPassDescriptor() const; + private: RenderPassDescriptor desc_; bool is_valid_ = false; diff --git a/engine/src/flutter/impeller/compositor/surface.mm b/engine/src/flutter/impeller/compositor/surface.mm index 009333a1373..b88c450d3db 100644 --- a/engine/src/flutter/impeller/compositor/surface.mm +++ b/engine/src/flutter/impeller/compositor/surface.mm @@ -8,8 +8,8 @@ namespace impeller { -Surface::Surface(RenderPassDescriptor desc) { - if (desc.HasColorAttachment(0)) { +Surface::Surface(RenderPassDescriptor desc) : desc_(std::move(desc)) { + if (!desc_.HasColorAttachment(0)) { return; } is_valid_ = true; @@ -21,4 +21,8 @@ bool Surface::IsValid() const { return is_valid_; } +const RenderPassDescriptor& Surface::GetRenderPassDescriptor() const { + return desc_; +} + } // namespace impeller diff --git a/engine/src/flutter/impeller/compositor/texture.h b/engine/src/flutter/impeller/compositor/texture.h index 7827c98c94a..e986184bcae 100644 --- a/engine/src/flutter/impeller/compositor/texture.h +++ b/engine/src/flutter/impeller/compositor/texture.h @@ -7,6 +7,7 @@ #include #include "flutter/fml/macros.h" +#include "impeller/geometry/size.h" namespace impeller { @@ -16,6 +17,8 @@ class Texture { ~Texture(); + Size GetSize() const; + id GetMTLTexture() const; private: diff --git a/engine/src/flutter/impeller/compositor/texture.mm b/engine/src/flutter/impeller/compositor/texture.mm index 69e1d4a8d66..fec9cf47c6c 100644 --- a/engine/src/flutter/impeller/compositor/texture.mm +++ b/engine/src/flutter/impeller/compositor/texture.mm @@ -10,6 +10,11 @@ Texture::Texture(id texture) : texture_(texture) {} Texture::~Texture() = default; +Size Texture::GetSize() const { + return {static_cast(texture_.width), + static_cast(texture_.height)}; +} + id Texture::GetMTLTexture() const { return texture_; } diff --git a/engine/src/flutter/impeller/geometry/size.h b/engine/src/flutter/impeller/geometry/size.h index 0ff85993fa4..6df32feeb8f 100644 --- a/engine/src/flutter/impeller/geometry/size.h +++ b/engine/src/flutter/impeller/geometry/size.h @@ -4,6 +4,7 @@ #pragma once +#include #include namespace impeller { @@ -16,6 +17,11 @@ struct Size { constexpr Size(double width, double height) : width(width), height(height) {} + static constexpr Size Infinite() { + return Size{std::numeric_limits::max(), + std::numeric_limits::max()}; + } + /* * Operator overloads */ @@ -46,6 +52,13 @@ struct Size { }; } + constexpr Size Intersection(const Size& o) const { + return { + std::min(width, o.width), + std::min(height, o.height), + }; + } + constexpr bool IsZero() const { return width * height == 0.0; } constexpr bool IsPositive() const { return width * height > 0.0; } diff --git a/engine/src/flutter/impeller/host/impeller_renderer.mm b/engine/src/flutter/impeller/host/impeller_renderer.mm index c9e654f11d2..d792bd9d779 100644 --- a/engine/src/flutter/impeller/host/impeller_renderer.mm +++ b/engine/src/flutter/impeller/host/impeller_renderer.mm @@ -230,6 +230,7 @@ static const size_t kAlignedUniformsSize = (sizeof(Uniforms) & ~0xFF) + 0x100; if (!renderer_->Render(surface)) { FML_LOG(ERROR) << "Could not render."; } + /// Per frame updates here dispatch_semaphore_wait(_inFlightSemaphore, DISPATCH_TIME_FOREVER);