Flutter Impeller
pipeline_gles.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 
6 
7 namespace impeller {
8 
9 PipelineGLES::PipelineGLES(std::shared_ptr<ReactorGLES> reactor,
10  std::weak_ptr<PipelineLibrary> library,
11  const PipelineDescriptor& desc,
12  std::shared_ptr<UniqueHandleGLES> handle)
13  : Pipeline(std::move(library), desc),
14  reactor_(std::move(reactor)),
15  handle_(std::move(handle)),
16  is_valid_(handle_->IsValid()) {
17  if (is_valid_) {
18  reactor_->SetDebugLabel(handle_->Get(), GetDescriptor().GetLabel());
19  }
20 }
21 
22 // |Pipeline|
23 PipelineGLES::~PipelineGLES() = default;
24 
25 // |Pipeline|
26 bool PipelineGLES::IsValid() const {
27  return is_valid_;
28 }
29 
30 const HandleGLES& PipelineGLES::GetProgramHandle() const {
31  return handle_->Get();
32 }
33 
34 const std::shared_ptr<UniqueHandleGLES> PipelineGLES::GetSharedHandle() const {
35  return handle_;
36 }
37 
38 BufferBindingsGLES* PipelineGLES::GetBufferBindings() const {
39  return buffer_bindings_.get();
40 }
41 
42 bool PipelineGLES::BuildVertexDescriptor(const ProcTableGLES& gl,
43  GLuint program) {
44  if (buffer_bindings_) {
45  return false;
46  }
47  auto vtx_desc = std::make_unique<BufferBindingsGLES>();
48  if (!vtx_desc->RegisterVertexStageInput(
49  gl, GetDescriptor().GetVertexDescriptor()->GetStageInputs(),
50  GetDescriptor().GetVertexDescriptor()->GetStageLayouts())) {
51  return false;
52  }
53  if (!vtx_desc->ReadUniformsBindings(gl, program)) {
54  return false;
55  }
56  buffer_bindings_ = std::move(vtx_desc);
57  return true;
58 }
59 
60 [[nodiscard]] bool PipelineGLES::BindProgram() const {
61  if (!handle_->IsValid()) {
62  return false;
63  }
64  auto handle = reactor_->GetGLHandle(handle_->Get());
65  if (!handle.has_value()) {
66  return false;
67  }
68  reactor_->GetProcTable().UseProgram(handle.value());
69  return true;
70 }
71 
72 [[nodiscard]] bool PipelineGLES::UnbindProgram() const {
73  if (reactor_) {
74  reactor_->GetProcTable().UseProgram(0u);
75  }
76  return true;
77 }
78 
79 } // namespace impeller
Sets up stage bindings for single draw call in the OpenGLES backend.
Represents a handle to an underlying OpenGL object. Unlike OpenGL object handles, these handles can b...
Definition: handle_gles.h:37
Definition: comparable.h:95