| // 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/renderer/pipeline.h" | |
| #include <optional> | |
| #include "compute_pipeline_descriptor.h" | |
| #include "impeller/base/promise.h" | |
| #include "impeller/renderer/compute_pipeline_descriptor.h" | |
| #include "impeller/renderer/context.h" | |
| #include "impeller/renderer/pipeline_library.h" | |
| #include "pipeline_descriptor.h" | |
| namespace impeller { | |
| template <typename T> | |
| Pipeline<T>::Pipeline(std::weak_ptr<PipelineLibrary> library, T desc) | |
| : library_(std::move(library)), desc_(std::move(desc)) {} | |
| template <typename T> | |
| Pipeline<T>::~Pipeline() = default; | |
| PipelineFuture<PipelineDescriptor> CreatePipelineFuture( | |
| const Context& context, | |
| std::optional<PipelineDescriptor> desc) { | |
| if (!context.IsValid()) { | |
| return {desc, RealizedFuture<std::shared_ptr<Pipeline<PipelineDescriptor>>>( | |
| nullptr)}; | |
| } | |
| return context.GetPipelineLibrary()->GetPipeline(std::move(desc)); | |
| } | |
| PipelineFuture<ComputePipelineDescriptor> CreatePipelineFuture( | |
| const Context& context, | |
| std::optional<ComputePipelineDescriptor> desc) { | |
| if (!context.IsValid()) { | |
| return { | |
| desc, | |
| RealizedFuture<std::shared_ptr<Pipeline<ComputePipelineDescriptor>>>( | |
| nullptr)}; | |
| } | |
| return context.GetPipelineLibrary()->GetPipeline(std::move(desc)); | |
| } | |
| template <typename T> | |
| const T& Pipeline<T>::GetDescriptor() const { | |
| return desc_; | |
| } | |
| template <typename T> | |
| PipelineFuture<T> Pipeline<T>::CreateVariant( | |
| std::function<void(T& desc)> descriptor_callback) const { | |
| if (!descriptor_callback) { | |
| return {std::nullopt, | |
| RealizedFuture<std::shared_ptr<Pipeline<T>>>(nullptr)}; | |
| } | |
| auto copied_desc = desc_; | |
| descriptor_callback(copied_desc); | |
| auto library = library_.lock(); | |
| if (!library) { | |
| VALIDATION_LOG << "The library from which this pipeline was created was " | |
| "already collected."; | |
| return {desc_, RealizedFuture<std::shared_ptr<Pipeline<T>>>(nullptr)}; | |
| } | |
| return library->GetPipeline(std::move(copied_desc)); | |
| } | |
| template class Pipeline<PipelineDescriptor>; | |
| template class Pipeline<ComputePipelineDescriptor>; | |
| } // namespace impeller |