Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2187)

Unified Diff: cc/output/geometry_binding.cc

Issue 595593002: Splitting of layers for correct intersections (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/output/geometry_binding.cc
diff --git a/cc/output/geometry_binding.cc b/cc/output/geometry_binding.cc
index b8c9759618551d9327f858af423d366624d51276..0fd72787a716024ebe5fc6d5a55dc8bb63706b00 100644
--- a/cc/output/geometry_binding.cc
+++ b/cc/output/geometry_binding.cc
@@ -3,7 +3,6 @@
// 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"
@@ -11,20 +10,15 @@
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];
- };
+ const gfx::RectF& quad_vertex_rect,
+ size_t buffer_size)
+ : gl_(gl),
+ quad_vertices_vbo_(0),
+ quad_elements_vbo_(0),
+ quad_vertex_rect_(quad_vertex_rect),
+ initialized_(false) {
+ Quad quads[buffer_size];
+ QuadIndex quad_indexes[buffer_size];
COMPILE_ASSERT(sizeof(Quad) == 24 * sizeof(float), // NOLINT(runtime/sizeof)
struct_is_densely_packed);
@@ -32,17 +26,40 @@ GeometryBinding::GeometryBinding(gpu::gles2::GLES2Interface* gl,
sizeof(QuadIndex) == 6 * sizeof(uint16_t), // NOLINT(runtime/sizeof)
struct_is_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};
+ // XXX: Should check for OUT_OF_MEMORY here
+ GLC(gl_, gl_->GenBuffers(1, &quad_vertices_vbo_));
+ GLC(gl_, gl_->GenBuffers(1, &quad_elements_vbo_));
+
+ GLC(gl_, gl_->BindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo_));
+ GLC(gl_,
+ gl_->BufferData(GL_ARRAY_BUFFER, sizeof(quads), quads, GL_DYNAMIC_DRAW));
+
+ GLC(gl_, gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_));
+ GLC(gl_,
+ gl_->BufferData(GL_ELEMENT_ARRAY_BUFFER,
+ sizeof(quad_indexes),
+ quad_indexes,
+ GL_DYNAMIC_DRAW));
+
+ InitializeBaseQuads(buffer_size);
+}
+
+void GeometryBinding::InitializeBaseQuads(size_t buffer_size) {
+ Quad quad_list[buffer_size];
+ QuadIndex quad_index_list[buffer_size];
+ for (size_t i = 0; i < buffer_size; 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, 0.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 = {
@@ -51,19 +68,8 @@ GeometryBinding::GeometryBinding(gpu::gles2::GLES2Interface* gl,
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));
+ SetBuffers<Quad, QuadIndex>(
+ quad_list, quad_index_list, 0, 0, buffer_size, buffer_size);
}
GeometryBinding::~GeometryBinding() {
@@ -111,4 +117,29 @@ void GeometryBinding::PrepareForDraw() {
GLC(gl_, gl_->EnableVertexAttribArray(TriangleIndexAttribLocation()));
}
+GeometryBindingQuad::GeometryBindingQuad(gpu::gles2::GLES2Interface* gl,
+ const gfx::RectF& quad_vertex_rect)
+ : GeometryBinding(gl, quad_vertex_rect, 1) {
+}
+
+void GeometryBindingQuad::InitializeCustomQuad(const gfx::QuadF& quad) {
enne (OOO) 2014/09/24 17:35:30 Can the GeometryBinding stuff become two classes,
+ float uv[] = {0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
+ InitializeCustomQuadWithUVs(quad, uv);
+}
+
+void GeometryBindingQuad::InitializeCustomQuadWithUVs(const gfx::QuadF& quad,
+ float uv[8]) {
+ Vertex v0 = {{quad.p1().x(), quad.p1().y(), 0.0f}, {uv[0], uv[1]}, 0.0f};
+ Vertex v1 = {{quad.p2().x(), quad.p2().y(), 0.0f}, {uv[2], uv[3]}, 1.0f};
+ Vertex v2 = {{quad.p3().x(), quad.p3().y(), 0.0f}, {uv[4], uv[5]}, 2.0f};
+ Vertex v3 = {{quad.p4().x(), quad.p4().y(), 0.0f}, {uv[6], uv[7]}, 3.0f};
+
+ Quad local_quad = {v0, v1, v2, v3};
+ QuadIndex quad_index = {{static_cast<uint16>(0), static_cast<uint16>(1),
+ static_cast<uint16>(2), static_cast<uint16>(3),
+ static_cast<uint16>(0), static_cast<uint16>(2)}};
+
+ SetBuffers<Quad, QuadIndex>(&local_quad, &quad_index, 0, 0, 1, 1);
+}
+
} // namespace cc
« no previous file with comments | « cc/output/geometry_binding.h ('k') | cc/output/gl_renderer.h » ('j') | cc/output/gl_renderer.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698