Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | List of all members
impeller::PipelineLibraryGLES Class Referencefinal

#include <pipeline_library_gles.h>

Inheritance diagram for impeller::PipelineLibraryGLES:
impeller::PipelineLibrary

Public Member Functions

 ~PipelineLibraryGLES () override
 
- Public Member Functions inherited from impeller::PipelineLibrary
virtual ~PipelineLibrary ()
 
PipelineFuture< PipelineDescriptorGetPipeline (std::optional< PipelineDescriptor > descriptor)
 
PipelineFuture< ComputePipelineDescriptorGetPipeline (std::optional< ComputePipelineDescriptor > descriptor)
 

Private Member Functions

bool IsValid () const override
 
PipelineFuture< PipelineDescriptorGetPipeline (PipelineDescriptor descriptor) override
 
PipelineFuture< ComputePipelineDescriptorGetPipeline (ComputePipelineDescriptor descriptor) override
 
void RemovePipelinesWithEntryPoint (std::shared_ptr< const ShaderFunction > function) override
 

Additional Inherited Members

- Protected Member Functions inherited from impeller::PipelineLibrary
 PipelineLibrary ()
 

Detailed Description

Definition at line 16 of file pipeline_library_gles.h.

Constructor & Destructor Documentation

◆ ~PipelineLibraryGLES()

impeller::PipelineLibraryGLES::~PipelineLibraryGLES ( )
overridedefault

Member Function Documentation

◆ GetPipeline() [1/2]

PipelineFuture< ComputePipelineDescriptor > impeller::PipelineLibraryGLES::GetPipeline ( ComputePipelineDescriptor  descriptor)
overrideprivatevirtual

Implements impeller::PipelineLibrary.

Definition at line 260 of file pipeline_library_gles.cc.

261 {
262 auto promise = std::make_shared<
263 std::promise<std::shared_ptr<Pipeline<ComputePipelineDescriptor>>>>();
264 // TODO(dnfield): implement compute for GLES.
265 promise->set_value(nullptr);
266 return {descriptor, promise->get_future()};
267}

◆ GetPipeline() [2/2]

PipelineFuture< PipelineDescriptor > impeller::PipelineLibraryGLES::GetPipeline ( PipelineDescriptor  descriptor)
overrideprivatevirtual

Implements impeller::PipelineLibrary.

Definition at line 183 of file pipeline_library_gles.cc.

184 {
185 if (auto found = pipelines_.find(descriptor); found != pipelines_.end()) {
186 return found->second;
187 }
188
189 if (!reactor_) {
190 return {
191 descriptor,
192 RealizedFuture<std::shared_ptr<Pipeline<PipelineDescriptor>>>(nullptr)};
193 }
194
195 auto vert_function = descriptor.GetEntrypointForStage(ShaderStage::kVertex);
196 auto frag_function = descriptor.GetEntrypointForStage(ShaderStage::kFragment);
197
198 if (!vert_function || !frag_function) {
200 << "Could not find stage entrypoint functions in pipeline descriptor.";
201 return {
202 descriptor,
203 RealizedFuture<std::shared_ptr<Pipeline<PipelineDescriptor>>>(nullptr)};
204 }
205
206 auto promise = std::make_shared<
207 std::promise<std::shared_ptr<Pipeline<PipelineDescriptor>>>>();
208 auto pipeline_future =
209 PipelineFuture<PipelineDescriptor>{descriptor, promise->get_future()};
210 pipelines_[descriptor] = pipeline_future;
211 auto weak_this = weak_from_this();
212
213 auto result = reactor_->AddOperation(
214 [promise, weak_this, reactor_ptr = reactor_, descriptor, vert_function,
215 frag_function](const ReactorGLES& reactor) {
216 auto strong_this = weak_this.lock();
217 if (!strong_this) {
218 promise->set_value(nullptr);
219 VALIDATION_LOG << "Library was collected before a pending pipeline "
220 "creation could finish.";
221 return;
222 }
223 auto pipeline = std::shared_ptr<PipelineGLES>(
224 new PipelineGLES(reactor_ptr, strong_this, descriptor));
225 auto program = reactor.GetGLHandle(pipeline->GetProgramHandle());
226 if (!program.has_value()) {
227 promise->set_value(nullptr);
228 VALIDATION_LOG << "Could not obtain program handle.";
229 return;
230 }
231 const auto link_result = LinkProgram(reactor, //
232 pipeline, //
233 vert_function, //
234 frag_function //
235 );
236 if (!link_result) {
237 promise->set_value(nullptr);
238 VALIDATION_LOG << "Could not link pipeline program.";
239 return;
240 }
241 if (!pipeline->BuildVertexDescriptor(reactor.GetProcTable(),
242 program.value())) {
243 promise->set_value(nullptr);
244 VALIDATION_LOG << "Could not build pipeline vertex descriptors.";
245 return;
246 }
247 if (!pipeline->IsValid()) {
248 promise->set_value(nullptr);
249 VALIDATION_LOG << "Pipeline validation checks failed.";
250 return;
251 }
252 promise->set_value(std::move(pipeline));
253 });
255
256 return pipeline_future;
257}
GAsyncResult * result
#define FML_CHECK(condition)
Definition logging.h:85
static bool LinkProgram(const ReactorGLES &reactor, const std::shared_ptr< PipelineGLES > &pipeline, const std::shared_ptr< const ShaderFunction > &vert_function, const std::shared_ptr< const ShaderFunction > &frag_function)
#define VALIDATION_LOG
Definition validation.h:73

◆ IsValid()

bool impeller::PipelineLibraryGLES::IsValid ( ) const
overrideprivatevirtual

Implements impeller::PipelineLibrary.

Definition at line 178 of file pipeline_library_gles.cc.

178 {
179 return reactor_ != nullptr;
180}

◆ RemovePipelinesWithEntryPoint()

void impeller::PipelineLibraryGLES::RemovePipelinesWithEntryPoint ( std::shared_ptr< const ShaderFunction function)
overrideprivatevirtual

Implements impeller::PipelineLibrary.

Definition at line 270 of file pipeline_library_gles.cc.

271 {
272 fml::erase_if(pipelines_, [&](auto item) {
273 return item->first.GetEntrypointForStage(function->GetStage())
274 ->IsEqual(*function);
275 });
276}
Dart_NativeFunction function
Definition fuchsia.cc:51
void erase_if(Collection &container, std::function< bool(typename Collection::iterator)> predicate)
Definition container.h:16

The documentation for this class was generated from the following files: