| Flutter Impeller |

Classes | Public Member Functions | List of all members
impeller::BufferBindingsGLES Class Reference

Sets up stage bindings for single draw call in the OpenGLES backend. More...

`#include <buffer_bindings_gles.h>`

## Public Member Functions
| BufferBindingsGLES ()
| ~BufferBindingsGLES ()
bool | RegisterVertexStageInput (const ProcTableGLES &gl, const std::vector< ShaderStageIOSlot > &inputs, const std::vector< ShaderStageBufferLayout > &layouts)
bool | ReadUniformsBindings (const ProcTableGLES &gl, GLuint program)
bool | BindVertexAttributes (const ProcTableGLES &gl, size_t binding, size_t vertex_offset)
bool | BindUniformData (const ProcTableGLES &gl, const std::vector< TextureAndSampler > &bound_textures, const std::vector< BufferResource > &bound_buffers, Range texture_range, Range buffer_range)
bool | UnbindVertexAttributes (const ProcTableGLES &gl)

## Detailed Description

Sets up stage bindings for single draw call in the OpenGLES backend.

Definition at line 28 of file buffer_bindings_gles.h.

## Constructor & Destructor Documentation

## ◆ BufferBindingsGLES()

impeller::BufferBindingsGLES::BufferBindingsGLES | ( |  | ) |
| default

## ◆ ~BufferBindingsGLES()

impeller::BufferBindingsGLES::~BufferBindingsGLES | ( |  | ) |
| default

## Member Function Documentation

## ◆ BindUniformData()

bool impeller::BufferBindingsGLES::BindUniformData | ( | const ProcTableGLES & | gl,
|  | const std::vector< TextureAndSampler > & | bound_textures,
|  | const std::vector< BufferResource > & | bound_buffers,
|  | Range | texture_range,
|  | Range | buffer_range
| ) |  |

Definition at line 222 of file buffer_bindings_gles.cc.

227 {
228 for (auto i = 0u; i < buffer_range.length; i++) {
229 if (!BindUniformBuffer(gl, bound_buffers[buffer_range.offset + i])) {
230 return false;
231 }
232 }
233 std::optional<size_t> next_unit_index =
234 BindTextures(gl, bound_textures, texture_range, ShaderStage::kVertex);
235 if (!next_unit_index.has_value()) {
236 return false;
237 }
238 if (!BindTextures(gl, bound_textures, texture_range, ShaderStage::kFragment,
239 *next_unit_index)
240 .has_value()) {
241 return false;
242 }
243
244 return true;
245 }
impeller::ShaderStage::kFragment
@ kFragment
impeller::ShaderStage::kVertex
@ kVertex

References impeller::kFragment, impeller::kVertex, impeller::Range::length, and impeller::Range::offset.

Referenced by impeller::EncodeCommandsInReactor(), and impeller::testing::TEST().

## ◆ BindVertexAttributes()

bool impeller::BufferBindingsGLES::BindVertexAttributes | ( | const ProcTableGLES & | gl,
|  | size_t | binding,
|  | size_t | vertex_offset
| ) |  |

Definition at line 194 of file buffer_bindings_gles.cc.

196 {
197 if (binding >= vertex_attrib_arrays_.size()) {
198 return false;
199 }
200
201 if (!gl.GetCapabilities()->IsES()) {
202 FML_DCHECK(vertex_array_object_ == 0);
203 gl.GenVertexArrays(1, &vertex_array_object_);
204 gl.BindVertexArray(vertex_array_object_);
205 }
206
207 for (const auto& array : vertex_attrib_arrays_[binding]) {
208 gl.EnableVertexAttribArray(array.index);
209 gl.VertexAttribPointer(array.index, // index
210 array.size, // size (must be 1, 2, 3, or 4)
211 array.type, // type
212 array.normalized, // normalized
213 array.stride, // stride
214 reinterpret_cast<const GLvoid*>(static_cast<GLsizei>(
215 vertex_offset + array.offset)) // pointer
216 );
217 }
218
219 return true;
220 }

References impeller::ProcTableGLES::GetCapabilities().

Referenced by impeller::BindVertexBuffer().

## ◆ ReadUniformsBindings()

bool impeller::BufferBindingsGLES::ReadUniformsBindings | ( | const ProcTableGLES & | gl,
|  | GLuint | program
| ) |  |

Definition at line 101 of file buffer_bindings_gles.cc.

102 {
103 if (!gl.IsProgram(program)) {
104 return false;
105 }
106 program_handle_ = program;
107 if (gl.GetDescription()->GetGlVersion().IsAtLeast(Version{3, 0, 0})) {
108 return ReadUniformsBindingsV3(gl, program);
109 }
110 return ReadUniformsBindingsV2(gl, program);
111 }

References impeller::ProcTableGLES::GetDescription(), impeller::DescriptionGLES::GetGlVersion(), and impeller::Version::IsAtLeast().

## ◆ RegisterVertexStageInput()

bool impeller::BufferBindingsGLES::RegisterVertexStageInput | ( | const ProcTableGLES & | gl,
|  | const std::vector< ShaderStageIOSlot > & | inputs,
|  | const std::vector< ShaderStageBufferLayout > & | layouts
| ) |  |

Definition at line 31 of file buffer_bindings_gles.cc.

34 {
35 std::vector<std::vector<VertexAttribPointer>> vertex_attrib_arrays(
36 layouts.size());
37 // Every layout corresponds to a vertex binding.
38 // As we record, separate the attributes into buckets for each layout in
39 // ascending order. We do this because later on, we'll need to associate each
40 // of the attributes with bound buffers corresponding to the binding.
41 for (auto layout_i = 0u; layout_i < layouts.size(); layout_i++) {
42 const auto& layout = layouts[layout_i];
43 for (const auto& input : p_inputs) {
44 if (input.binding != layout_i) {
45 continue;
46 }
47 VertexAttribPointer attrib;
48 attrib.index = input.location;
49 // Component counts must be 1, 2, 3 or 4. Do that validation now.
50 if (input.vec_size < 1u || input.vec_size > 4u) {
51 return false;
52 }
53 attrib.size = input.vec_size;
54 auto type = ToVertexAttribType(input.type);
55 if (!type.has_value()) {
56 return false;
57 }
58 attrib.type = type.value();
59 attrib.normalized = GL_FALSE;
60 attrib.offset = input.offset;
61 attrib.stride = layout.stride;
62 vertex_attrib_arrays[layout_i].push_back(attrib);
63 }
64 }
65 vertex_attrib_arrays_ = std::move(vertex_attrib_arrays);
66 return true;
67 }
type
GLenum type
Definition: blit_command_gles.cc:153
impeller::ToVertexAttribType
constexpr std::optional< GLenum > ToVertexAttribType(ShaderType type)
Definition: formats_gles.h:140

References impeller::ToVertexAttribType(), and type.

## ◆ UnbindVertexAttributes()

bool impeller::BufferBindingsGLES::UnbindVertexAttributes | ( | const ProcTableGLES & | gl | ) |

Definition at line 247 of file buffer_bindings_gles.cc.

247 {
248 for (const auto& array : vertex_attrib_arrays_) {
249 for (const auto& attribute : array) {
250 gl.DisableVertexAttribArray(attribute.index);
251 }
252 }
253 if (!gl.GetCapabilities()->IsES()) {
254 gl.DeleteVertexArrays(1, &vertex_array_object_);
255 vertex_array_object_ = 0;
256 }
257
258 return true;
259 }

References impeller::ProcTableGLES::GetCapabilities().

Referenced by impeller::EncodeCommandsInReactor().

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

- impeller/renderer/backend/gles/buffer_bindings_gles.h
- impeller/renderer/backend/gles/buffer_bindings_gles.cc