diff --git a/engine/src/flutter/impeller/compiler/code_gen_template.h b/engine/src/flutter/impeller/compiler/code_gen_template.h index 259bdd98a4d..ade82b13e8c 100644 --- a/engine/src/flutter/impeller/compiler/code_gen_template.h +++ b/engine/src/flutter/impeller/compiler/code_gen_template.h @@ -17,6 +17,7 @@ namespace impeller { namespace shader { struct {{camel_case(shader_name)}}{{camel_case(shader_stage)}}Info { + static constexpr std::string_view kLabel = "{{camel_case(shader_name)}}"; static constexpr std::string_view kEntrypointName = "{{entrypoint}}"; static constexpr ShaderStage kShaderStage = {{to_shader_stage(shader_stage)}}; diff --git a/engine/src/flutter/impeller/impeller/compositor/context.mm b/engine/src/flutter/impeller/impeller/compositor/context.mm index 702e9a4ffa1..cbba8d7c5bd 100644 --- a/engine/src/flutter/impeller/impeller/compositor/context.mm +++ b/engine/src/flutter/impeller/impeller/compositor/context.mm @@ -64,4 +64,8 @@ id Context::GetTransferQueue() const { return transfer_queue_; } +std::shared_ptr Context::GetShaderLibrary() const { + return shader_library_; +} + } // namespace impeller diff --git a/engine/src/flutter/impeller/impeller/compositor/pipeline_builder.h b/engine/src/flutter/impeller/impeller/compositor/pipeline_builder.h index 0afa12fdb44..5db78f14642 100644 --- a/engine/src/flutter/impeller/impeller/compositor/pipeline_builder.h +++ b/engine/src/flutter/impeller/impeller/compositor/pipeline_builder.h @@ -4,7 +4,10 @@ #pragma once +#include #include +#include +#include #include "flutter/fml/macros.h" #include "impeller/compositor/pipeline_descriptor.h" @@ -19,19 +22,21 @@ class PipelineBuilder { ~PipelineBuilder(); - PipelineBuilder& SetLabel(); + PipelineBuilder& SetLabel(const std::string_view& label); - PipelineBuilder& SetSampleCountCount(size_t samples); + PipelineBuilder& SetSampleCount(size_t samples); - PipelineBuilder& SetVertexFunction(std::shared_ptr function); - - PipelineBuilder& SetFragmentFunction( - std::shared_ptr function); + PipelineBuilder& AddStageEntrypoint(std::shared_ptr function); PipelineBuilder& SetVertexDescriptor( std::shared_ptr vertex_descriptor); private: + std::string label_; + size_t sample_count_ = 1; + std::unordered_map> entrypoints_; + std::shared_ptr vertex_descriptor_; + FML_DISALLOW_COPY_AND_ASSIGN(PipelineBuilder); }; diff --git a/engine/src/flutter/impeller/impeller/compositor/pipeline_builder.mm b/engine/src/flutter/impeller/impeller/compositor/pipeline_builder.mm index 4f954b6da68..cc603842852 100644 --- a/engine/src/flutter/impeller/impeller/compositor/pipeline_builder.mm +++ b/engine/src/flutter/impeller/impeller/compositor/pipeline_builder.mm @@ -10,4 +10,35 @@ PipelineBuilder::PipelineBuilder() = default; PipelineBuilder::~PipelineBuilder() = default; +PipelineBuilder& PipelineBuilder::SetLabel(const std::string_view& label) { + label_ = {label.data(), label.size()}; + return *this; +} + +PipelineBuilder& PipelineBuilder::SetSampleCount(size_t samples) { + sample_count_ = samples; + return *this; +} + +PipelineBuilder& PipelineBuilder::AddStageEntrypoint( + std::shared_ptr function) { + if (!function) { + return *this; + } + + if (function->GetStage() == ShaderStage::kUnknown) { + return *this; + } + + entrypoints_[function->GetStage()] = std::move(function); + + return *this; +} + +PipelineBuilder& PipelineBuilder::SetVertexDescriptor( + std::shared_ptr vertex_descriptor) { + vertex_descriptor_ = std::move(vertex_descriptor); + return *this; +} + } // namespace impeller diff --git a/engine/src/flutter/impeller/impeller/compositor/shader_library.h b/engine/src/flutter/impeller/impeller/compositor/shader_library.h index 03e592a75ff..3a7daed01c4 100644 --- a/engine/src/flutter/impeller/impeller/compositor/shader_library.h +++ b/engine/src/flutter/impeller/impeller/compositor/shader_library.h @@ -8,6 +8,7 @@ #include #include +#include #include "flutter/fml/macros.h" #include "impeller/shader_glue/shader_types.h" @@ -37,7 +38,7 @@ class ShaderLibrary { public: ~ShaderLibrary(); - std::shared_ptr GetFunction(const std::string& name, + std::shared_ptr GetFunction(const std::string_view& name, ShaderStage stage); private: diff --git a/engine/src/flutter/impeller/impeller/compositor/shader_library.mm b/engine/src/flutter/impeller/impeller/compositor/shader_library.mm index 821ebc50d88..70d90d8e7c0 100644 --- a/engine/src/flutter/impeller/impeller/compositor/shader_library.mm +++ b/engine/src/flutter/impeller/impeller/compositor/shader_library.mm @@ -20,9 +20,9 @@ ShaderLibrary::ShaderLibrary(id library) : library_(library) {} ShaderLibrary::~ShaderLibrary() = default; std::shared_ptr ShaderLibrary::GetFunction( - const std::string& name, + const std::string_view& name, ShaderStage stage) { - auto function = [library_ newFunctionWithName:@(name.c_str())]; + auto function = [library_ newFunctionWithName:@(name.data())]; if (!function) { return nullptr; } diff --git a/engine/src/flutter/impeller/impeller/primitives/BUILD.gn b/engine/src/flutter/impeller/impeller/primitives/BUILD.gn index 699b5d167b7..c871d10def2 100644 --- a/engine/src/flutter/impeller/impeller/primitives/BUILD.gn +++ b/engine/src/flutter/impeller/impeller/primitives/BUILD.gn @@ -14,8 +14,8 @@ impeller_shaders("impeller_shaders") { impeller_component("primitives") { sources = [ - "box.cc", "box.h", + "box.mm", ] public_deps = [ "../compositor" ] diff --git a/engine/src/flutter/impeller/impeller/primitives/box.cc b/engine/src/flutter/impeller/impeller/primitives/box.cc deleted file mode 100644 index aa8e1b179ec..00000000000 --- a/engine/src/flutter/impeller/impeller/primitives/box.cc +++ /dev/null @@ -1,14 +0,0 @@ -// 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/box.h" - -#include "box.frag.h" -#include "box.vert.h" - -namespace impeller { - -void RenderBox() {} - -} // namespace impeller diff --git a/engine/src/flutter/impeller/impeller/primitives/box.h b/engine/src/flutter/impeller/impeller/primitives/box.h index 5e558de1d31..08a079f08bc 100644 --- a/engine/src/flutter/impeller/impeller/primitives/box.h +++ b/engine/src/flutter/impeller/impeller/primitives/box.h @@ -2,8 +2,10 @@ // 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" + namespace impeller { -void RenderBox(); +void RenderBox(std::shared_ptr context); } // namespace impeller diff --git a/engine/src/flutter/impeller/impeller/primitives/box.mm b/engine/src/flutter/impeller/impeller/primitives/box.mm new file mode 100644 index 00000000000..8e5895cf937 --- /dev/null +++ b/engine/src/flutter/impeller/impeller/primitives/box.mm @@ -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/primitives/box.h" + +#include "box.frag.h" +#include "box.vert.h" +#include "impeller/compositor/pipeline_builder.h" + +namespace impeller { + +void RenderBox(std::shared_ptr context) { + PipelineBuilder builder; + + auto fragment_function = context->GetShaderLibrary()->GetFunction( + shader::BoxFragmentInfo::kEntrypointName, ShaderStage::kFragment); + auto vertex_function = context->GetShaderLibrary()->GetFunction( + shader::BoxVertexInfo::kEntrypointName, ShaderStage::kVertex); + + builder.AddStageEntrypoint(vertex_function); + builder.AddStageEntrypoint(fragment_function); + builder.SetLabel(shader::BoxVertexInfo::kLabel); +} + +} // namespace impeller