| Flutter Impeller |

pipeline.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "impeller/renderer/pipeline.h"
6 #include <optional>
7
8 #include "compute_pipeline_descriptor.h"
9 #include "impeller/base/promise.h"
10 #include "impeller/renderer/compute_pipeline_descriptor.h"
11 #include "impeller/renderer/context.h"
12 #include "impeller/renderer/pipeline_library.h"
13 #include "pipeline_descriptor.h"
14
15 namespace impeller {
16
17 template <typename T>
18 Pipeline<T>::Pipeline(std::weak_ptr<PipelineLibrary> library, T desc)
19 : library_(std::move(library)), desc_(std::move(desc)) {}
20
21 template <typename T>
22 Pipeline<T>::~Pipeline() = default;
23
24 PipelineFuture<PipelineDescriptor> CreatePipelineFuture(
25 const Context& context,
26 std::optional<PipelineDescriptor> desc) {
27 if (!context.IsValid()) {
28 return {desc, RealizedFuture<std::shared_ptr<Pipeline<PipelineDescriptor>>>(
29 nullptr)};
30 }
31
32 return context.GetPipelineLibrary()->GetPipeline(std::move(desc));
33 }
34
35 PipelineFuture<ComputePipelineDescriptor> CreatePipelineFuture(
36 const Context& context,
37 std::optional<ComputePipelineDescriptor> desc) {
38 if (!context.IsValid()) {
39 return {
40 desc,
41 RealizedFuture<std::shared_ptr<Pipeline<ComputePipelineDescriptor>>>(
42 nullptr)};
43 }
44
45 return context.GetPipelineLibrary()->GetPipeline(std::move(desc));
46 }
47
48 template <typename T>
49 const T& Pipeline<T>::GetDescriptor() const {
50 return desc_;
51 }
52
53 template <typename T>
54 PipelineFuture<T> Pipeline<T>::CreateVariant(
55 bool async,
56 std::function<void(T& desc)> descriptor_callback) const {
57 if (!descriptor_callback) {
58 return {std::nullopt,
59 RealizedFuture<std::shared_ptr<Pipeline<T>>>(nullptr)};
60 }
61
62 auto copied_desc = desc_;
63
64 descriptor_callback(copied_desc);
65
66 auto library = library_.lock();
67 if (!library) {
68 VALIDATION_LOG << "The library from which this pipeline was created was "
69 "already collected.";
70 return {desc_, RealizedFuture<std::shared_ptr<Pipeline<T>>>(nullptr)};
71 }
72
73 return library->GetPipeline(std::move(copied_desc), async);
74 }
75
76 template class Pipeline<PipelineDescriptor>;
77 template class Pipeline<ComputePipelineDescriptor>;
78
79 } // namespace impeller
impeller::Context
To do anything rendering related with Impeller, you need a context.
Definition: context.h:46
impeller::Context::GetPipelineLibrary
virtual std::shared_ptr< PipelineLibrary > GetPipelineLibrary() const =0
Returns the library of pipelines used by render or compute commands.
impeller::Context::IsValid
virtual bool IsValid() const =0
Determines if a context is valid. If the caller ever receives an invalid context, they must discard i...
impeller::Pipeline< PipelineDescriptor >
impeller::Pipeline::~Pipeline
virtual ~Pipeline()
impeller::Pipeline::CreateVariant
PipelineFuture< T > CreateVariant(bool async, std::function< void(T &desc)> descriptor_callback) const
Definition: pipeline.cc:54
impeller::Pipeline::Pipeline
Pipeline(std::weak_ptr< PipelineLibrary > library, T desc)
Definition: pipeline.cc:18
impeller::Pipeline::GetDescriptor
const T & GetDescriptor() const
Get the descriptor that was responsible for creating this pipeline. It may be copied and modified to ...
Definition: pipeline.cc:49
compute_pipeline_descriptor.h
impeller
Definition: allocation.cc:12
impeller::CreatePipelineFuture
PipelineFuture< PipelineDescriptor > CreatePipelineFuture(const Context &context, std::optional< PipelineDescriptor > desc)
Definition: pipeline.cc:24
std
Definition: comparable.h:95
pipeline.h
pipeline_descriptor.h
pipeline_library.h
promise.h
context.h
impeller::PipelineFuture
Definition: pipeline.h:26
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:91