From e968f9a9ee5bebaff76e2e01c2c6850edab3614b Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Tue, 22 Jun 2021 12:43:14 -0700 Subject: [PATCH] Add support for primitive types. --- engine/src/flutter/impeller/compositor/BUILD.gn | 4 ++-- .../src/flutter/impeller/compositor/command.h | 2 ++ .../src/flutter/impeller/compositor/formats.h | 10 ++++++++++ .../flutter/impeller/compositor/formats_metal.h | 16 ++++++++++++++++ .../flutter/impeller/compositor/render_pass.mm | 2 +- .../src/flutter/impeller/compositor/renderer.mm | 4 ++++ .../src/flutter/impeller/compositor/surface.h | 8 +++++++- .../src/flutter/impeller/compositor/surface.mm | 14 +++++++++++++- ...{vertex_buffer.h => vertex_buffer_builder.h} | 0 ...ertex_buffer.mm => vertex_buffer_builder.mm} | 2 +- .../flutter/impeller/entity/entity_renderer.mm | 17 +++++++++++------ .../flutter/impeller/host/impeller_renderer.mm | 8 ++++++-- 12 files changed, 73 insertions(+), 14 deletions(-) rename engine/src/flutter/impeller/compositor/{vertex_buffer.h => vertex_buffer_builder.h} (100%) rename engine/src/flutter/impeller/compositor/{vertex_buffer.mm => vertex_buffer_builder.mm} (96%) diff --git a/engine/src/flutter/impeller/compositor/BUILD.gn b/engine/src/flutter/impeller/compositor/BUILD.gn index b5b5407222c..ea5e89187c3 100644 --- a/engine/src/flutter/impeller/compositor/BUILD.gn +++ b/engine/src/flutter/impeller/compositor/BUILD.gn @@ -52,8 +52,8 @@ impeller_component("compositor") { "surface.mm", "texture.h", "texture.mm", - "vertex_buffer.h", - "vertex_buffer.mm", + "vertex_buffer_builder.h", + "vertex_buffer_builder.mm", "vertex_descriptor.h", "vertex_descriptor.mm", ] diff --git a/engine/src/flutter/impeller/compositor/command.h b/engine/src/flutter/impeller/compositor/command.h index e7c058b0080..3e0a455d635 100644 --- a/engine/src/flutter/impeller/compositor/command.h +++ b/engine/src/flutter/impeller/compositor/command.h @@ -10,6 +10,7 @@ #include "flutter/fml/macros.h" #include "impeller/compositor/buffer_view.h" +#include "impeller/compositor/formats.h" #include "impeller/compositor/pipeline.h" namespace impeller { @@ -30,6 +31,7 @@ struct Command { BufferView index_buffer; size_t index_count = 0u; std::string label; + PrimitiveType primitive_type; constexpr operator bool() const { return pipeline && pipeline->IsValid(); } }; diff --git a/engine/src/flutter/impeller/compositor/formats.h b/engine/src/flutter/impeller/compositor/formats.h index 1b162db5882..986274185fb 100644 --- a/engine/src/flutter/impeller/compositor/formats.h +++ b/engine/src/flutter/impeller/compositor/formats.h @@ -56,6 +56,16 @@ enum class StoreAction { kStore, }; +enum class PrimitiveType { + kTriange, + kTriangeStrip, + kLine, + kLineStrip, + kPoint, + // Triangle fans are implementation dependent and need extra extensions + // checks. Hence, they are not supported here. +}; + enum class ColorWriteMask : uint64_t { kNone = 0, kRed = 1 << 0, diff --git a/engine/src/flutter/impeller/compositor/formats_metal.h b/engine/src/flutter/impeller/compositor/formats_metal.h index 5e7126f5a38..d68934f43ab 100644 --- a/engine/src/flutter/impeller/compositor/formats_metal.h +++ b/engine/src/flutter/impeller/compositor/formats_metal.h @@ -64,6 +64,22 @@ constexpr MTLBlendFactor ToMTLBlendFactor(BlendFactor type) { return MTLBlendFactorZero; }; +constexpr MTLPrimitiveType ToMTLPrimitiveType(PrimitiveType type) { + switch (type) { + case PrimitiveType::kTriange: + return MTLPrimitiveTypeTriangle; + case PrimitiveType::kTriangeStrip: + return MTLPrimitiveTypeTriangleStrip; + case PrimitiveType::kLine: + return MTLPrimitiveTypeLine; + case PrimitiveType::kLineStrip: + return MTLPrimitiveTypeLineStrip; + case PrimitiveType::kPoint: + return MTLPrimitiveTypePoint; + } + return MTLPrimitiveTypePoint; +} + constexpr MTLBlendOperation ToMTLBlendOperation(BlendOperation type) { switch (type) { case BlendOperation::kAdd: diff --git a/engine/src/flutter/impeller/compositor/render_pass.mm b/engine/src/flutter/impeller/compositor/render_pass.mm index f7566cdadd0..0d7f586d2e0 100644 --- a/engine/src/flutter/impeller/compositor/render_pass.mm +++ b/engine/src/flutter/impeller/compositor/render_pass.mm @@ -260,7 +260,7 @@ bool RenderPass::EncodeCommands(Allocator& allocator, } FML_DCHECK(command.index_count * sizeof(uint32_t) == command.index_buffer.range.length); - [pass drawIndexedPrimitives:MTLPrimitiveTypeTriangleStrip + [pass drawIndexedPrimitives:ToMTLPrimitiveType(command.primitive_type) indexCount:command.index_count indexType:MTLIndexTypeUInt32 indexBuffer:mtl_index_buffer diff --git a/engine/src/flutter/impeller/compositor/renderer.mm b/engine/src/flutter/impeller/compositor/renderer.mm index eb08cd0a2dc..20c0c4b42b0 100644 --- a/engine/src/flutter/impeller/compositor/renderer.mm +++ b/engine/src/flutter/impeller/compositor/renderer.mm @@ -53,6 +53,10 @@ bool Renderer::Render(const Surface& surface) { return false; } + if (!surface.Present()) { + return false; + } + if (!render_pass->FinishEncoding(*GetContext()->GetTransientsAllocator())) { return false; } diff --git a/engine/src/flutter/impeller/compositor/surface.h b/engine/src/flutter/impeller/compositor/surface.h index f4e01d25fa9..0d91604be14 100644 --- a/engine/src/flutter/impeller/compositor/surface.h +++ b/engine/src/flutter/impeller/compositor/surface.h @@ -6,6 +6,7 @@ #include +#include #include #include "flutter/fml/macros.h" @@ -16,16 +17,21 @@ namespace impeller { class Surface { public: - Surface(RenderPassDescriptor desc); + Surface(RenderPassDescriptor desc, + std::function present_callback); ~Surface(); + bool Present() const; + bool IsValid() const; const RenderPassDescriptor& GetRenderPassDescriptor() const; private: RenderPassDescriptor desc_; + std::function present_callback_; + bool is_valid_ = false; FML_DISALLOW_COPY_AND_ASSIGN(Surface); diff --git a/engine/src/flutter/impeller/compositor/surface.mm b/engine/src/flutter/impeller/compositor/surface.mm index b88c450d3db..dea5e3327a7 100644 --- a/engine/src/flutter/impeller/compositor/surface.mm +++ b/engine/src/flutter/impeller/compositor/surface.mm @@ -8,7 +8,9 @@ namespace impeller { -Surface::Surface(RenderPassDescriptor desc) : desc_(std::move(desc)) { +Surface::Surface(RenderPassDescriptor desc, + std::function present_callback) + : desc_(std::move(desc)), present_callback_(present_callback) { if (!desc_.HasColorAttachment(0)) { return; } @@ -17,6 +19,16 @@ Surface::Surface(RenderPassDescriptor desc) : desc_(std::move(desc)) { Surface::~Surface() = default; +bool Surface::Present() const { + auto callback = present_callback_; + + if (!callback) { + return true; + } + + return callback(); +} + bool Surface::IsValid() const { return is_valid_; } diff --git a/engine/src/flutter/impeller/compositor/vertex_buffer.h b/engine/src/flutter/impeller/compositor/vertex_buffer_builder.h similarity index 100% rename from engine/src/flutter/impeller/compositor/vertex_buffer.h rename to engine/src/flutter/impeller/compositor/vertex_buffer_builder.h diff --git a/engine/src/flutter/impeller/compositor/vertex_buffer.mm b/engine/src/flutter/impeller/compositor/vertex_buffer_builder.mm similarity index 96% rename from engine/src/flutter/impeller/compositor/vertex_buffer.mm rename to engine/src/flutter/impeller/compositor/vertex_buffer_builder.mm index e9ba41eb2ad..12c72d189a7 100644 --- a/engine/src/flutter/impeller/compositor/vertex_buffer.mm +++ b/engine/src/flutter/impeller/compositor/vertex_buffer_builder.mm @@ -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/compositor/vertex_buffer.h" +#include "impeller/compositor/vertex_buffer_builder.h" namespace impeller { diff --git a/engine/src/flutter/impeller/entity/entity_renderer.mm b/engine/src/flutter/impeller/entity/entity_renderer.mm index 51fb1004429..cec785103ee 100644 --- a/engine/src/flutter/impeller/entity/entity_renderer.mm +++ b/engine/src/flutter/impeller/entity/entity_renderer.mm @@ -3,8 +3,9 @@ // found in the LICENSE file. #include "impeller/entity/entity_renderer.h" + #include "impeller/compositor/command.h" -#include "impeller/compositor/vertex_buffer.h" +#include "impeller/compositor/vertex_buffer_builder.h" #include "impeller/primitives/box.frag.h" #include "impeller/primitives/box.vert.h" @@ -40,23 +41,27 @@ bool EntityRenderer::OnRender(RenderPass& pass) { shader::BoxVertexInfo::UniformBuffer uniforms; uniforms.mvp = Matrix::MakeOrthographic({800, 600}); - VertexBufferBuilder vertices; - vertices.AddVertices({ + VertexBufferBuilder vertex_builder; + vertex_builder.AddVertices({ {-0.5, 0.5, 1.0}, // {0.5, 0.5, 1.0}, // {0.5, -0.5, 1.0}, // + {0.5, -0.5, 1.0}, // {-0.5, -0.5, 1.0}, // + {-0.5, 0.5, 1.0}, // }); Command cmd; cmd.label = "Box"; cmd.pipeline = box_primitive_->GetPipeline(); cmd.vertex_bindings.buffers[0u] = - vertices.CreateVertexBuffer(pass.GetTransientsBuffer()); + vertex_builder.CreateVertexBuffer(pass.GetTransientsBuffer()); cmd.vertex_bindings.buffers[1u] = pass.GetTransientsBuffer().EmplaceUniform(uniforms); - cmd.index_buffer = vertices.CreateIndexBuffer(pass.GetTransientsBuffer()); - cmd.index_count = vertices.GetIndexCount(); + cmd.index_buffer = + vertex_builder.CreateIndexBuffer(pass.GetTransientsBuffer()); + cmd.index_count = vertex_builder.GetIndexCount(); + cmd.primitive_type = PrimitiveType::kTriange; if (!pass.RecordCommand(std::move(cmd))) { return false; } diff --git a/engine/src/flutter/impeller/host/impeller_renderer.mm b/engine/src/flutter/impeller/host/impeller_renderer.mm index d792bd9d779..a874a6f35c8 100644 --- a/engine/src/flutter/impeller/host/impeller_renderer.mm +++ b/engine/src/flutter/impeller/host/impeller_renderer.mm @@ -226,11 +226,15 @@ static const size_t kAlignedUniformsSize = (sizeof(Uniforms) & ~0xFF) + 0x100; - (void)drawInMTKView:(nonnull MTKView*)view { impeller::Surface surface( - impeller::FromMTLRenderPassDescriptor(view.currentRenderPassDescriptor)); + impeller::FromMTLRenderPassDescriptor(view.currentRenderPassDescriptor), + [drawable = view.currentDrawable]() { + [drawable present]; + return true; + }); if (!renderer_->Render(surface)) { FML_LOG(ERROR) << "Could not render."; } - + return; /// Per frame updates here dispatch_semaphore_wait(_inFlightSemaphore, DISPATCH_TIME_FOREVER);