From ddcc21abdc44fba869a9e629a3cd1c3240d3de99 Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Fri, 4 Jun 2021 16:27:02 -0700 Subject: [PATCH] Start on the entity model. --- .../src/flutter/impeller/compositor/BUILD.gn | 4 +++ .../src/flutter/impeller/compositor/command.h | 32 +++++++++++++++++++ .../flutter/impeller/compositor/command.mm | 7 ++++ .../flutter/impeller/compositor/renderer.h | 11 +++++-- .../flutter/impeller/compositor/renderer.mm | 3 +- .../src/flutter/impeller/compositor/sampler.h | 21 ++++++++++++ .../box.h => compositor/sampler.mm} | 6 ++-- engine/src/flutter/impeller/entity/BUILD.gn | 7 +++- engine/src/flutter/impeller/entity/entity.h | 2 +- .../flutter/impeller/entity/entity_renderer.h | 29 +++++++++++++++++ .../impeller/entity/entity_renderer.mm | 23 +++++++++++++ engine/src/flutter/impeller/host/BUILD.gn | 1 + .../impeller/host/impeller_renderer.mm | 26 +++++++-------- engine/src/flutter/impeller/image/BUILD.gn | 2 ++ .../src/flutter/impeller/primitives/BUILD.gn | 6 ++-- .../impeller/primitives/box_primitive.h | 26 +++++++++++++++ .../primitives/{box.mm => box_primitive.mm} | 17 +++++++--- .../flutter/impeller/primitives/primitive.h | 31 ++++++++++++++++++ .../flutter/impeller/primitives/primitive.mm | 18 +++++++++++ 19 files changed, 242 insertions(+), 30 deletions(-) create mode 100644 engine/src/flutter/impeller/compositor/command.h create mode 100644 engine/src/flutter/impeller/compositor/command.mm create mode 100644 engine/src/flutter/impeller/compositor/sampler.h rename engine/src/flutter/impeller/{primitives/box.h => compositor/sampler.mm} (67%) create mode 100644 engine/src/flutter/impeller/entity/entity_renderer.h create mode 100644 engine/src/flutter/impeller/entity/entity_renderer.mm create mode 100644 engine/src/flutter/impeller/primitives/box_primitive.h rename engine/src/flutter/impeller/primitives/{box.mm => box_primitive.mm} (82%) create mode 100644 engine/src/flutter/impeller/primitives/primitive.h create mode 100644 engine/src/flutter/impeller/primitives/primitive.mm diff --git a/engine/src/flutter/impeller/compositor/BUILD.gn b/engine/src/flutter/impeller/compositor/BUILD.gn index 8ed28803c7a..6bc76c7c2a5 100644 --- a/engine/src/flutter/impeller/compositor/BUILD.gn +++ b/engine/src/flutter/impeller/compositor/BUILD.gn @@ -10,6 +10,8 @@ impeller_component("compositor") { "allocator.mm", "buffer.h", "buffer.mm", + "command.h", + "command.mm", "comparable.cc", "comparable.h", "context.h", @@ -30,6 +32,8 @@ impeller_component("compositor") { "render_pass.mm", "renderer.h", "renderer.mm", + "sampler.h", + "sampler.mm", "shader_function.h", "shader_function.mm", "shader_library.h", diff --git a/engine/src/flutter/impeller/compositor/command.h b/engine/src/flutter/impeller/compositor/command.h new file mode 100644 index 00000000000..c4d0d8da368 --- /dev/null +++ b/engine/src/flutter/impeller/compositor/command.h @@ -0,0 +1,32 @@ +// 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 + +#include "flutter/fml/macros.h" +#include "impeller/compositor/buffer.h" +#include "impeller/compositor/pipeline.h" + +namespace impeller { + +class Texture; +class Sampler; + +struct Bindings { + std::map buffers; + std::map> textures; + std::map> samplers; +}; + +struct Command { + std::shared_ptr pipeline; + Bindings vertex_bindings; + Bindings fragment_bindings; + BufferView index_buffer; +}; + +} // namespace impeller diff --git a/engine/src/flutter/impeller/compositor/command.mm b/engine/src/flutter/impeller/compositor/command.mm new file mode 100644 index 00000000000..95f37c799ff --- /dev/null +++ b/engine/src/flutter/impeller/compositor/command.mm @@ -0,0 +1,7 @@ +// 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/command.h" + +namespace impeller {} // namespace impeller diff --git a/engine/src/flutter/impeller/compositor/renderer.h b/engine/src/flutter/impeller/compositor/renderer.h index 3afa9392423..bf199e6fb73 100644 --- a/engine/src/flutter/impeller/compositor/renderer.h +++ b/engine/src/flutter/impeller/compositor/renderer.h @@ -15,9 +15,7 @@ namespace impeller { class Renderer { public: - Renderer(std::string shaders_directory); - - ~Renderer(); + virtual ~Renderer(); bool IsValid() const; @@ -27,6 +25,13 @@ class Renderer { std::shared_ptr GetContext() const; + protected: + Renderer(std::string shaders_directory); + + virtual bool OnRender() = 0; + + virtual bool OnSurfaceSizeDidChange(Size size) = 0; + private: std::shared_ptr context_; std::unique_ptr surface_; diff --git a/engine/src/flutter/impeller/compositor/renderer.mm b/engine/src/flutter/impeller/compositor/renderer.mm index 0b5cf2696b5..6cba3970752 100644 --- a/engine/src/flutter/impeller/compositor/renderer.mm +++ b/engine/src/flutter/impeller/compositor/renderer.mm @@ -38,7 +38,8 @@ bool Renderer::SurfaceSizeDidChange(Size size) { } size_ = size; - return true; + + return OnSurfaceSizeDidChange(size_); } bool Renderer::Render() { diff --git a/engine/src/flutter/impeller/compositor/sampler.h b/engine/src/flutter/impeller/compositor/sampler.h new file mode 100644 index 00000000000..de73319410c --- /dev/null +++ b/engine/src/flutter/impeller/compositor/sampler.h @@ -0,0 +1,21 @@ +// 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 "flutter/fml/macros.h" + +namespace impeller { + +class Sampler { + public: + Sampler(); + + ~Sampler(); + + private: + FML_DISALLOW_COPY_AND_ASSIGN(Sampler); +}; + +} // namespace impeller diff --git a/engine/src/flutter/impeller/primitives/box.h b/engine/src/flutter/impeller/compositor/sampler.mm similarity index 67% rename from engine/src/flutter/impeller/primitives/box.h rename to engine/src/flutter/impeller/compositor/sampler.mm index 32b27760067..14678d946a1 100644 --- a/engine/src/flutter/impeller/primitives/box.h +++ b/engine/src/flutter/impeller/compositor/sampler.mm @@ -2,10 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "impeller/compositor/context.h" +#include "impeller/compositor/sampler.h" namespace impeller { -bool RenderBox(std::shared_ptr context); +Sampler::Sampler() = default; + +Sampler::~Sampler() = default; } // namespace impeller diff --git a/engine/src/flutter/impeller/entity/BUILD.gn b/engine/src/flutter/impeller/entity/BUILD.gn index b3372f09020..66d048226bd 100644 --- a/engine/src/flutter/impeller/entity/BUILD.gn +++ b/engine/src/flutter/impeller/entity/BUILD.gn @@ -8,7 +8,12 @@ impeller_component("entity") { sources = [ "entity.cc", "entity.h", + "entity_renderer.h", + "entity_renderer.mm", ] - public_deps = [ "../image" ] + public_deps = [ + "../compositor", + "../image", + ] } diff --git a/engine/src/flutter/impeller/entity/entity.h b/engine/src/flutter/impeller/entity/entity.h index dc2561458e7..1ab3047e15e 100644 --- a/engine/src/flutter/impeller/entity/entity.h +++ b/engine/src/flutter/impeller/entity/entity.h @@ -4,7 +4,7 @@ #pragma once -#include "impeller/entity/color.h" +#include "impeller/geometry/color.h" #include "impeller/geometry/matrix.h" #include "impeller/geometry/path.h" #include "impeller/geometry/rect.h" diff --git a/engine/src/flutter/impeller/entity/entity_renderer.h b/engine/src/flutter/impeller/entity/entity_renderer.h new file mode 100644 index 00000000000..07113c77865 --- /dev/null +++ b/engine/src/flutter/impeller/entity/entity_renderer.h @@ -0,0 +1,29 @@ +// 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 "flutter/fml/macros.h" +#include "impeller/compositor/renderer.h" +#include "impeller/entity/entity.h" + +namespace impeller { + +class EntityRenderer final : public Renderer { + public: + EntityRenderer(std::string shaders_directory); + + ~EntityRenderer() override; + + private: + std::shared_ptr root_; + + bool OnRender() override; + + bool OnSurfaceSizeDidChange(Size size) override; + + FML_DISALLOW_COPY_AND_ASSIGN(EntityRenderer); +}; + +} // namespace impeller diff --git a/engine/src/flutter/impeller/entity/entity_renderer.mm b/engine/src/flutter/impeller/entity/entity_renderer.mm new file mode 100644 index 00000000000..914e364f20f --- /dev/null +++ b/engine/src/flutter/impeller/entity/entity_renderer.mm @@ -0,0 +1,23 @@ +// 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/entity/entity_renderer.h" + +namespace impeller { + +EntityRenderer::EntityRenderer(std::string shaders_directory) + : Renderer(std::move(shaders_directory)), + root_(std::make_shared()) {} + +EntityRenderer::~EntityRenderer() = default; + +bool EntityRenderer::OnRender() { + return false; +} + +bool EntityRenderer::OnSurfaceSizeDidChange(Size size) { + return false; +} + +} // namespace impeller diff --git a/engine/src/flutter/impeller/host/BUILD.gn b/engine/src/flutter/impeller/host/BUILD.gn index 7a371705668..dcde833a589 100644 --- a/engine/src/flutter/impeller/host/BUILD.gn +++ b/engine/src/flutter/impeller/host/BUILD.gn @@ -46,6 +46,7 @@ executable("host") { deps = [ ":impeller_host_fixtures", ":impeller_host_shaders", + "../entity", "../primitives", "//flutter/fml", ] diff --git a/engine/src/flutter/impeller/host/impeller_renderer.mm b/engine/src/flutter/impeller/host/impeller_renderer.mm index 7129193df18..1617193e863 100644 --- a/engine/src/flutter/impeller/host/impeller_renderer.mm +++ b/engine/src/flutter/impeller/host/impeller_renderer.mm @@ -4,17 +4,15 @@ #import #import - -#import "assets_location.h" -#include "flutter/fml/logging.h" -#import "impeller/compositor/renderer.h" -#import "impeller/primitives/box.h" -#import "impeller_renderer.h" -#import "shaders_location.h" -// Include header shared between C code here, which executes Metal API commands, -// and .metal files #import "ShaderTypes.h" +#include "assets_location.h" +#include "flutter/fml/logging.h" +#include "impeller/entity/entity_renderer.h" +#include "impeller/primitives/box_primitive.h" +#include "impeller_renderer.h" +#include "shaders_location.h" + static const NSUInteger kMaxBuffersInFlight = 3; static const size_t kAlignedUniformsSize = (sizeof(Uniforms) & ~0xFF) + 0x100; @@ -53,17 +51,13 @@ static const size_t kAlignedUniformsSize = (sizeof(Uniforms) & ~0xFF) + 0x100; [self _loadAssets]; } - renderer_ = std::make_unique( + renderer_ = std::make_unique( impeller::ImpellerShadersDirectory()); if (!renderer_->IsValid()) { FML_LOG(ERROR) << "Impeller Renderer is not valid."; } - if (!impeller::RenderBox(renderer_->GetContext())) { - FML_LOG(ERROR) << "Could not render box."; - } - return self; } @@ -233,7 +227,9 @@ static const size_t kAlignedUniformsSize = (sizeof(Uniforms) & ~0xFF) + 0x100; } - (void)drawInMTKView:(nonnull MTKView*)view { - renderer_->Render(); + if (!renderer_->Render()) { + FML_LOG(ERROR) << "Could not render."; + } /// Per frame updates here dispatch_semaphore_wait(_inFlightSemaphore, DISPATCH_TIME_FOREVER); diff --git a/engine/src/flutter/impeller/image/BUILD.gn b/engine/src/flutter/impeller/image/BUILD.gn index eb0cb3c46f9..aff4b5104c3 100644 --- a/engine/src/flutter/impeller/image/BUILD.gn +++ b/engine/src/flutter/impeller/image/BUILD.gn @@ -12,5 +12,7 @@ impeller_component("image") { "image_result.h", ] + deps = [ "../third_party/stb" ] + public_deps = [ "../geometry" ] } diff --git a/engine/src/flutter/impeller/primitives/BUILD.gn b/engine/src/flutter/impeller/primitives/BUILD.gn index c871d10def2..da8d8fa95fe 100644 --- a/engine/src/flutter/impeller/primitives/BUILD.gn +++ b/engine/src/flutter/impeller/primitives/BUILD.gn @@ -14,8 +14,10 @@ impeller_shaders("impeller_shaders") { impeller_component("primitives") { sources = [ - "box.h", - "box.mm", + "box_primitive.h", + "box_primitive.mm", + "primitive.h", + "primitive.mm", ] public_deps = [ "../compositor" ] diff --git a/engine/src/flutter/impeller/primitives/box_primitive.h b/engine/src/flutter/impeller/primitives/box_primitive.h new file mode 100644 index 00000000000..90718994033 --- /dev/null +++ b/engine/src/flutter/impeller/primitives/box_primitive.h @@ -0,0 +1,26 @@ +// 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/context.h" +#include "impeller/primitives/primitive.h" + +namespace impeller { + +class BoxPrimitive final : public Primitive { + public: + BoxPrimitive(std::shared_ptr context); + + ~BoxPrimitive() override; + + virtual bool Encode(RenderPass& pass) const override; + + private: + bool is_valid_ = false; + + FML_DISALLOW_COPY_AND_ASSIGN(BoxPrimitive); +}; + +bool RenderBox(std::shared_ptr context); + +} // namespace impeller diff --git a/engine/src/flutter/impeller/primitives/box.mm b/engine/src/flutter/impeller/primitives/box_primitive.mm similarity index 82% rename from engine/src/flutter/impeller/primitives/box.mm rename to engine/src/flutter/impeller/primitives/box_primitive.mm index f303313df59..cbe58937474 100644 --- a/engine/src/flutter/impeller/primitives/box.mm +++ b/engine/src/flutter/impeller/primitives/box_primitive.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/primitives/box.h" +#include "impeller/primitives/box_primitive.h" #include @@ -15,7 +15,8 @@ namespace impeller { -bool RenderBox(std::shared_ptr context) { +BoxPrimitive::BoxPrimitive(std::shared_ptr context) + : Primitive(context) { PipelineDescriptor desc; desc.SetLabel(shader::BoxVertexInfo::kLabel); @@ -34,7 +35,7 @@ bool RenderBox(std::shared_ptr context) { if (!vertex_descriptor->SetStageInputs( shader::BoxVertexInfo::kAllShaderStageInputs)) { FML_LOG(ERROR) << "Could not configure vertex descriptor."; - return false; + return; } desc.SetVertexDescriptor(std::move(vertex_descriptor)); } @@ -43,10 +44,16 @@ bool RenderBox(std::shared_ptr context) { context->GetPipelineLibrary()->GetRenderPipeline(std::move(desc)).get(); if (!pipeline) { FML_LOG(ERROR) << "Could not create the render pipeline."; - return false; + return; } - return true; + is_valid_ = true; +} + +BoxPrimitive::~BoxPrimitive() = default; + +bool BoxPrimitive::Encode(RenderPass& pass) const { + return false; } } // namespace impeller diff --git a/engine/src/flutter/impeller/primitives/primitive.h b/engine/src/flutter/impeller/primitives/primitive.h new file mode 100644 index 00000000000..916342b755b --- /dev/null +++ b/engine/src/flutter/impeller/primitives/primitive.h @@ -0,0 +1,31 @@ +// 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/macros.h" +#include "impeller/compositor/context.h" +#include "impeller/compositor/render_pass.h" + +namespace impeller { + +class Primitive { + public: + Primitive(std::shared_ptr); + + virtual ~Primitive(); + + std::shared_ptr GetContext() const; + + virtual bool Encode(RenderPass& pass) const = 0; + + private: + std::shared_ptr context_; + + FML_DISALLOW_COPY_AND_ASSIGN(Primitive); +}; + +} // namespace impeller diff --git a/engine/src/flutter/impeller/primitives/primitive.mm b/engine/src/flutter/impeller/primitives/primitive.mm new file mode 100644 index 00000000000..ef24844db99 --- /dev/null +++ b/engine/src/flutter/impeller/primitives/primitive.mm @@ -0,0 +1,18 @@ +// 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/primitives/primitive.h" + +namespace impeller { + +Primitive::Primitive(std::shared_ptr context) + : context_(std::move(context)) {} + +Primitive::~Primitive() = default; + +std::shared_ptr Primitive::GetContext() const { + return context_; +} + +} // namespace impeller