5 #ifndef FLUTTER_IMPELLER_SCENE_SCENE_CONTEXT_H_
6 #define FLUTTER_IMPELLER_SCENE_SCENE_CONTEXT_H_
48 std::shared_ptr<Pipeline<PipelineDescriptor>>
GetPipeline(
57 class PipelineVariants {
59 virtual ~PipelineVariants() =
default;
61 virtual std::shared_ptr<Pipeline<PipelineDescriptor>>
GetPipeline(
66 template <
class PipelineT>
67 class PipelineVariantsT final :
public PipelineVariants {
69 explicit PipelineVariantsT(
Context& context) {
70 auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context);
71 if (!desc.has_value()) {
79 variants_[{}] = std::make_unique<PipelineT>(context, desc);
83 std::shared_ptr<Pipeline<PipelineDescriptor>>
GetPipeline(
86 if (
auto found = variants_.find(opts); found != variants_.end()) {
87 return found->second->WaitAndGet();
90 auto prototype = variants_.find({});
93 FML_CHECK(prototype != variants_.end());
95 auto variant_future = prototype->second->WaitAndGet()->CreateVariant(
98 opts.ApplyToPipelineDescriptor(*context.GetCapabilities(), desc);
100 SPrintF(
"%s V#%zu", desc.GetLabel().c_str(), variants_count));
102 auto variant = std::make_unique<PipelineT>(std::move(variant_future));
103 auto variant_pipeline = variant->WaitAndGet();
104 variants_[opts] = std::move(variant);
105 return variant_pipeline;
108 bool IsValid()
const {
return is_valid_; }
111 bool is_valid_ =
true;
113 std::unique_ptr<PipelineT>,
119 template <
typename VertexShader,
typename FragmentShader>
123 std::unique_ptr<PipelineVariants> MakePipelineVariants(
Context& context) {
125 PipelineVariantsT<RenderPipelineT<VertexShader, FragmentShader>>(
127 if (!pipeline.IsValid()) {
130 return std::make_unique<
131 PipelineVariantsT<RenderPipelineT<VertexShader, FragmentShader>>>(
132 std::move(pipeline));
136 std::unique_ptr<PipelineVariants>,
141 std::shared_ptr<Context> context_;
143 bool is_valid_ =
false;
146 std::shared_ptr<Texture> placeholder_texture_;
156 #endif // FLUTTER_IMPELLER_SCENE_SCENE_CONTEXT_H_