From b36aba2dbb2d3c4a66ebc155e9c43525d6093708 Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Mon, 21 Jun 2021 13:25:08 -0700 Subject: [PATCH] Fix uniform alignment on a per platform basis. --- .../src/flutter/impeller/compositor/BUILD.gn | 2 ++ .../flutter/impeller/compositor/host_buffer.h | 7 ++++++ .../flutter/impeller/compositor/platform.h | 24 +++++++++++++++++++ .../flutter/impeller/compositor/platform.mm | 11 +++++++++ .../flutter/impeller/compositor/render_pass.h | 3 +++ .../impeller/compositor/render_pass.mm | 10 ++++++++ .../impeller/entity/entity_renderer.mm | 10 ++++---- 7 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 engine/src/flutter/impeller/compositor/platform.h create mode 100644 engine/src/flutter/impeller/compositor/platform.mm diff --git a/engine/src/flutter/impeller/compositor/BUILD.gn b/engine/src/flutter/impeller/compositor/BUILD.gn index 513852ee7b4..b5b5407222c 100644 --- a/engine/src/flutter/impeller/compositor/BUILD.gn +++ b/engine/src/flutter/impeller/compositor/BUILD.gn @@ -34,6 +34,8 @@ impeller_component("compositor") { "pipeline_descriptor.mm", "pipeline_library.h", "pipeline_library.mm", + "platform.h", + "platform.mm", "range.cc", "range.h", "render_pass.h", diff --git a/engine/src/flutter/impeller/compositor/host_buffer.h b/engine/src/flutter/impeller/compositor/host_buffer.h index 75cd731ec23..8ac5fc77bc4 100644 --- a/engine/src/flutter/impeller/compositor/host_buffer.h +++ b/engine/src/flutter/impeller/compositor/host_buffer.h @@ -12,6 +12,7 @@ #include "flutter/fml/macros.h" #include "impeller/compositor/buffer.h" #include "impeller/compositor/buffer_view.h" +#include "impeller/compositor/platform.h" namespace impeller { @@ -29,6 +30,12 @@ class HostBuffer final : public std::enable_shared_from_this, size_t GetReservedLength() const; + template >> + [[nodiscard]] BufferView EmplaceUniform(const T& t) { + return Emplace(reinterpret_cast(&t), sizeof(T), + std::max(alignof(T), DefaultUniformAlignment())); + } + template >> [[nodiscard]] BufferView Emplace(const T& t) { return Emplace(reinterpret_cast(&t), sizeof(T), alignof(T)); diff --git a/engine/src/flutter/impeller/compositor/platform.h b/engine/src/flutter/impeller/compositor/platform.h new file mode 100644 index 00000000000..9044c8b78bc --- /dev/null +++ b/engine/src/flutter/impeller/compositor/platform.h @@ -0,0 +1,24 @@ +// 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. + +#pragma once + +#include + +#include "flutter/fml/build_config.h" +#include "flutter/fml/macros.h" + +namespace impeller { + +constexpr size_t DefaultUniformAlignment() { +#if OS_IOS + return 16u; +#elif OS_MACOSX + return 256u; +#else +#error "Unsupported platform". +#endif +} + +} // namespace impeller diff --git a/engine/src/flutter/impeller/compositor/platform.mm b/engine/src/flutter/impeller/compositor/platform.mm new file mode 100644 index 00000000000..1ce3def0ad6 --- /dev/null +++ b/engine/src/flutter/impeller/compositor/platform.mm @@ -0,0 +1,11 @@ +// 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 "impeller/compositor/platform.h" + +namespace impeller { + +// + +} // namespace impeller diff --git a/engine/src/flutter/impeller/compositor/render_pass.h b/engine/src/flutter/impeller/compositor/render_pass.h index e3ad6cbfd6d..877746110e9 100644 --- a/engine/src/flutter/impeller/compositor/render_pass.h +++ b/engine/src/flutter/impeller/compositor/render_pass.h @@ -71,6 +71,8 @@ class RenderPass { bool IsValid() const; + void SetLabel(std::string label); + HostBuffer& GetTransientsBuffer(); [[nodiscard]] bool RecordCommand(Command command); @@ -84,6 +86,7 @@ class RenderPass { MTLRenderPassDescriptor* desc_ = nil; std::vector commands_; std::shared_ptr transients_buffer_; + std::string label_; 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 6ec92c0a11d..cffd28d2a2f 100644 --- a/engine/src/flutter/impeller/compositor/render_pass.mm +++ b/engine/src/flutter/impeller/compositor/render_pass.mm @@ -137,14 +137,24 @@ bool RenderPass::IsValid() const { return is_valid_; } +void RenderPass::SetLabel(std::string label) { + label_ = std::move(label); +} + bool RenderPass::FinishEncoding(Allocator& transients_allocator) const { if (!IsValid()) { return false; } auto pass = [buffer_ renderCommandEncoderWithDescriptor:desc_]; + if (!pass) { return false; } + + if (!label_.empty()) { + [pass setLabel:@(label_.c_str())]; + } + // Success or failure, the pass must end. The buffer can only process one pass // at a time. fml::ScopedCleanupClosure auto_end([pass]() { [pass endEncoding]; }); diff --git a/engine/src/flutter/impeller/entity/entity_renderer.mm b/engine/src/flutter/impeller/entity/entity_renderer.mm index 03aecd113e1..42659daa9ad 100644 --- a/engine/src/flutter/impeller/entity/entity_renderer.mm +++ b/engine/src/flutter/impeller/entity/entity_renderer.mm @@ -36,6 +36,8 @@ bool EntityRenderer::OnIsValid() const { } bool EntityRenderer::OnRender(RenderPass& pass) { + pass.SetLabel("EntityRenderer"); + shader::BoxVertexInfo::UniformBuffer uniforms; uniforms.mvp = Matrix::MakeOrthographic({800, 600}); VertexBufferBuilder vertices; @@ -47,14 +49,14 @@ bool EntityRenderer::OnRender(RenderPass& pass) { }); Command cmd; - cmd.label = "Simple Box"; + cmd.label = "Box"; cmd.pipeline = box_primitive_->GetPipeline(); - cmd.vertex_bindings - .buffers[shader::BoxVertexInfo::kUniformUniformBuffer.location] = - pass.GetTransientsBuffer().Emplace(uniforms); cmd.vertex_bindings .buffers[shader::BoxVertexInfo::kInputVertexPosition.location] = vertices.CreateVertexBuffer(pass.GetTransientsBuffer()); + cmd.vertex_bindings + .buffers[shader::BoxVertexInfo::kUniformUniformBuffer.location] = + pass.GetTransientsBuffer().EmplaceUniform(uniforms); cmd.index_buffer = vertices.CreateIndexBuffer(pass.GetTransientsBuffer()); cmd.index_count = vertices.GetIndexCount(); if (!pass.RecordCommand(std::move(cmd))) {