1 // Copyright 2011 The Chromium 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.
5 #include "cc/output/geometry_binding.h"
7 #include "cc/output/gl_renderer.h" // For the GLC() macro.
8 #include "gpu/command_buffer/client/gles2_interface.h"
9 #include "third_party/khronos/GLES2/gl2.h"
10 #include "ui/gfx/rect_f.h"
14 GeometryBinding::GeometryBinding(gpu::gles2::GLES2Interface
* gl
,
15 const gfx::RectF
& quad_vertex_rect
)
16 : gl_(gl
), quad_vertices_vbo_(0), quad_elements_vbo_(0) {
20 // Index of the vertex, divide by 4 to have the matrix for this quad.
24 Vertex v0
, v1
, v2
, v3
;
30 COMPILE_ASSERT(sizeof(Quad
) == 24 * sizeof(float), // NOLINT(runtime/sizeof)
31 struct_is_densely_packed
);
33 sizeof(QuadIndex
) == 6 * sizeof(uint16_t), // NOLINT(runtime/sizeof)
34 struct_is_densely_packed
);
37 QuadIndex quad_index_list
[8];
38 for (int i
= 0; i
< 8; i
++) {
39 Vertex v0
= {{quad_vertex_rect
.x(), quad_vertex_rect
.bottom(), 0.0f
, },
40 {0.0f
, 1.0f
, }, i
* 4.0f
+ 0.0f
};
41 Vertex v1
= {{quad_vertex_rect
.x(), quad_vertex_rect
.y(), 0.0f
, },
42 {0.0f
, 0.0f
, }, i
* 4.0f
+ 1.0f
};
43 Vertex v2
= {{quad_vertex_rect
.right(), quad_vertex_rect
.y(), 0.0f
, },
44 {1.0f
, .0f
, }, i
* 4.0f
+ 2.0f
};
45 Vertex v3
= {{quad_vertex_rect
.right(), quad_vertex_rect
.bottom(), 0.0f
, },
46 {1.0f
, 1.0f
, }, i
* 4.0f
+ 3.0f
};
47 Quad x
= {v0
, v1
, v2
, v3
};
50 {static_cast<uint16
>(0 + 4 * i
), static_cast<uint16
>(1 + 4 * i
),
51 static_cast<uint16
>(2 + 4 * i
), static_cast<uint16
>(3 + 4 * i
),
52 static_cast<uint16
>(0 + 4 * i
), static_cast<uint16
>(2 + 4 * i
)}};
53 quad_index_list
[i
] = y
;
56 gl_
->GenBuffers(1, &quad_vertices_vbo_
);
57 gl_
->GenBuffers(1, &quad_elements_vbo_
);
58 GLC(gl_
, gl_
->BindBuffer(GL_ARRAY_BUFFER
, quad_vertices_vbo_
));
61 GL_ARRAY_BUFFER
, sizeof(quad_list
), quad_list
, GL_STATIC_DRAW
));
62 GLC(gl_
, gl_
->BindBuffer(GL_ELEMENT_ARRAY_BUFFER
, quad_elements_vbo_
));
64 gl_
->BufferData(GL_ELEMENT_ARRAY_BUFFER
,
65 sizeof(quad_index_list
),
70 GeometryBinding::~GeometryBinding() {
71 gl_
->DeleteBuffers(1, &quad_vertices_vbo_
);
72 gl_
->DeleteBuffers(1, &quad_elements_vbo_
);
75 void GeometryBinding::PrepareForDraw() {
76 GLC(gl_
, gl_
->BindBuffer(GL_ELEMENT_ARRAY_BUFFER
, quad_elements_vbo_
));
78 GLC(gl_
, gl_
->BindBuffer(GL_ARRAY_BUFFER
, quad_vertices_vbo_
));
79 // OpenGL defines the last parameter to VertexAttribPointer as type
80 // "const GLvoid*" even though it is actually an offset into the buffer
81 // object's data store and not a pointer to the client's address space.
82 const void* offsets
[3] = {
83 0, reinterpret_cast<const void*>(
84 3 * sizeof(float)), // NOLINT(runtime/sizeof)
85 reinterpret_cast<const void*>(5 *
86 sizeof(float)), // NOLINT(runtime/sizeof)
90 gl_
->VertexAttribPointer(PositionAttribLocation(),
94 6 * sizeof(float), // NOLINT(runtime/sizeof)
97 gl_
->VertexAttribPointer(TexCoordAttribLocation(),
101 6 * sizeof(float), // NOLINT(runtime/sizeof)
104 gl_
->VertexAttribPointer(TriangleIndexAttribLocation(),
108 6 * sizeof(float), // NOLINT(runtime/sizeof)
110 GLC(gl_
, gl_
->EnableVertexAttribArray(PositionAttribLocation()));
111 GLC(gl_
, gl_
->EnableVertexAttribArray(TexCoordAttribLocation()));
112 GLC(gl_
, gl_
->EnableVertexAttribArray(TriangleIndexAttribLocation()));