|  | // Copyright 2011 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "cc/output/geometry_binding.h" | 
|  |  | 
|  | #include "cc/output/gl_renderer.h"  // For the GLC() macro. | 
|  | #include "gpu/command_buffer/client/gles2_interface.h" | 
|  | #include "ui/gfx/geometry/rect_f.h" | 
|  |  | 
|  | namespace cc { | 
|  |  | 
|  | GeometryBinding::GeometryBinding(gpu::gles2::GLES2Interface* gl, | 
|  | const gfx::RectF& quad_vertex_rect) | 
|  | : gl_(gl), quad_vertices_vbo_(0), quad_elements_vbo_(0) { | 
|  | struct Vertex { | 
|  | float a_position[3]; | 
|  | float a_texCoord[2]; | 
|  | // Index of the vertex, divide by 4 to have the matrix for this quad. | 
|  | float a_index; | 
|  | }; | 
|  | struct Quad { | 
|  | Vertex v0, v1, v2, v3; | 
|  | }; | 
|  | struct QuadIndex { | 
|  | uint16 data[6]; | 
|  | }; | 
|  |  | 
|  | static_assert(sizeof(Quad) == 24 * sizeof(float), | 
|  | "struct Quad should be densely packed"); | 
|  | static_assert(sizeof(QuadIndex) == 6 * sizeof(uint16_t), | 
|  | "struct QuadIndex should be densely packed"); | 
|  |  | 
|  | Quad quad_list[8]; | 
|  | QuadIndex quad_index_list[8]; | 
|  | for (int i = 0; i < 8; i++) { | 
|  | Vertex v0 = {{quad_vertex_rect.x(), quad_vertex_rect.bottom(), 0.0f, }, | 
|  | {0.0f, 1.0f, }, i * 4.0f + 0.0f}; | 
|  | Vertex v1 = {{quad_vertex_rect.x(), quad_vertex_rect.y(), 0.0f, }, | 
|  | {0.0f, 0.0f, }, i * 4.0f + 1.0f}; | 
|  | Vertex v2 = {{quad_vertex_rect.right(), quad_vertex_rect.y(), 0.0f, }, | 
|  | {1.0f, .0f, }, i * 4.0f + 2.0f}; | 
|  | Vertex v3 = {{quad_vertex_rect.right(), quad_vertex_rect.bottom(), 0.0f, }, | 
|  | {1.0f, 1.0f, }, i * 4.0f + 3.0f}; | 
|  | Quad x = {v0, v1, v2, v3}; | 
|  | quad_list[i] = x; | 
|  | QuadIndex y = { | 
|  | {static_cast<uint16>(0 + 4 * i), static_cast<uint16>(1 + 4 * i), | 
|  | static_cast<uint16>(2 + 4 * i), static_cast<uint16>(3 + 4 * i), | 
|  | static_cast<uint16>(0 + 4 * i), static_cast<uint16>(2 + 4 * i)}}; | 
|  | quad_index_list[i] = y; | 
|  | } | 
|  |  | 
|  | gl_->GenBuffers(1, &quad_vertices_vbo_); | 
|  | gl_->GenBuffers(1, &quad_elements_vbo_); | 
|  | GLC(gl_, gl_->BindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo_)); | 
|  | GLC(gl_, | 
|  | gl_->BufferData( | 
|  | GL_ARRAY_BUFFER, sizeof(quad_list), quad_list, GL_STATIC_DRAW)); | 
|  | GLC(gl_, gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_)); | 
|  | GLC(gl_, | 
|  | gl_->BufferData(GL_ELEMENT_ARRAY_BUFFER, | 
|  | sizeof(quad_index_list), | 
|  | quad_index_list, | 
|  | GL_STATIC_DRAW)); | 
|  | } | 
|  |  | 
|  | GeometryBinding::~GeometryBinding() { | 
|  | gl_->DeleteBuffers(1, &quad_vertices_vbo_); | 
|  | gl_->DeleteBuffers(1, &quad_elements_vbo_); | 
|  | } | 
|  |  | 
|  | void GeometryBinding::PrepareForDraw() { | 
|  | GLC(gl_, gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_)); | 
|  |  | 
|  | GLC(gl_, gl_->BindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo_)); | 
|  | // OpenGL defines the last parameter to VertexAttribPointer as type | 
|  | // "const GLvoid*" even though it is actually an offset into the buffer | 
|  | // object's data store and not a pointer to the client's address space. | 
|  | const void* offsets[3] = { | 
|  | 0, | 
|  | reinterpret_cast<const void*>(3 * sizeof(float)), | 
|  | reinterpret_cast<const void*>(5 * sizeof(float)), | 
|  | }; | 
|  |  | 
|  | GLC(gl_, gl_->VertexAttribPointer(PositionAttribLocation(), 3, GL_FLOAT, | 
|  | false, 6 * sizeof(float), offsets[0])); | 
|  | GLC(gl_, gl_->VertexAttribPointer(TexCoordAttribLocation(), 2, GL_FLOAT, | 
|  | false, 6 * sizeof(float), offsets[1])); | 
|  | GLC(gl_, gl_->VertexAttribPointer(TriangleIndexAttribLocation(), 1, GL_FLOAT, | 
|  | false, 6 * sizeof(float), offsets[2])); | 
|  | GLC(gl_, gl_->EnableVertexAttribArray(PositionAttribLocation())); | 
|  | GLC(gl_, gl_->EnableVertexAttribArray(TexCoordAttribLocation())); | 
|  | GLC(gl_, gl_->EnableVertexAttribArray(TriangleIndexAttribLocation())); | 
|  | } | 
|  |  | 
|  | }  // namespace cc |