diff --git a/impeller/scene/scene_context.cc b/impeller/scene/scene_context.cc index 66c8b07db1989..baece932832a2 100644 --- a/impeller/scene/scene_context.cc +++ b/impeller/scene/scene_context.cc @@ -40,11 +40,24 @@ SceneContext::SceneContext(std::shared_ptr context) return; } - pipelines_[{PipelineKey{GeometryType::kUnskinned, MaterialType::kUnlit}}] = + auto unskinned_variant = MakePipelineVariants( *context_); - pipelines_[{PipelineKey{GeometryType::kSkinned, MaterialType::kUnlit}}] = + if (!unskinned_variant) { + FML_LOG(ERROR) << "Could not create unskinned pipeline variant."; + return; + } + pipelines_[{PipelineKey{GeometryType::kUnskinned, MaterialType::kUnlit}}] = + std::move(unskinned_variant); + + auto skinned_variant = MakePipelineVariants(*context_); + if (!skinned_variant) { + FML_LOG(ERROR) << "Could not create skinned pipeline variant."; + return; + } + pipelines_[{PipelineKey{GeometryType::kSkinned, MaterialType::kUnlit}}] = + std::move(skinned_variant); { impeller::TextureDescriptor texture_descriptor; diff --git a/impeller/scene/scene_context.h b/impeller/scene/scene_context.h index 615ec4a4be5ed..f85663b426770 100644 --- a/impeller/scene/scene_context.h +++ b/impeller/scene/scene_context.h @@ -67,9 +67,14 @@ class SceneContext { public: explicit PipelineVariantsT(Context& context) { auto desc = PipelineT::Builder::MakeDefaultPipelineDescriptor(context); + if (!desc.has_value()) { + is_valid_ = false; + return; + } // Apply default ContentContextOptions to the descriptor. SceneContextOptions{}.ApplyToPipelineDescriptor( - *context.GetCapabilities(), *desc); + /*capabilities=*/*context.GetCapabilities(), + /*desc=*/desc.value()); variants_[{}] = std::make_unique(context, desc); }; @@ -99,7 +104,10 @@ class SceneContext { return variant_pipeline; } + bool IsValid() const { return is_valid_; } + private: + bool is_valid_ = true; std::unordered_map, SceneContextOptions::Hash, @@ -108,10 +116,19 @@ class SceneContext { }; template + /// Creates a PipelineVariantsT for the given vertex and fragment shaders. + /// + /// If a pipeline could not be created, returns nullptr. std::unique_ptr MakePipelineVariants(Context& context) { + auto pipeline = + PipelineVariantsT>( + context); + if (!pipeline.IsValid()) { + return nullptr; + } return std::make_unique< PipelineVariantsT>>( - context); + std::move(pipeline)); } std::unordered_map