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

Side by Side 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, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/output/geometry_binding.h" 5 #include "cc/output/geometry_binding.h"
6
7 #include "cc/output/gl_renderer.h" // For the GLC() macro. 6 #include "cc/output/gl_renderer.h" // For the GLC() macro.
8 #include "gpu/command_buffer/client/gles2_interface.h" 7 #include "gpu/command_buffer/client/gles2_interface.h"
9 #include "ui/gfx/geometry/rect_f.h" 8 #include "ui/gfx/geometry/rect_f.h"
10 9
11 namespace cc { 10 namespace cc {
12 11
13 GeometryBinding::GeometryBinding(gpu::gles2::GLES2Interface* gl, 12 GeometryBinding::GeometryBinding(gpu::gles2::GLES2Interface* gl,
14 const gfx::RectF& quad_vertex_rect) 13 const gfx::RectF& quad_vertex_rect,
15 : gl_(gl), quad_vertices_vbo_(0), quad_elements_vbo_(0) { 14 size_t buffer_size)
16 struct Vertex { 15 : gl_(gl),
17 float a_position[3]; 16 quad_vertices_vbo_(0),
18 float a_texCoord[2]; 17 quad_elements_vbo_(0),
19 // Index of the vertex, divide by 4 to have the matrix for this quad. 18 quad_vertex_rect_(quad_vertex_rect),
20 float a_index; 19 initialized_(false) {
21 }; 20 Quad quads[buffer_size];
22 struct Quad { 21 QuadIndex quad_indexes[buffer_size];
23 Vertex v0, v1, v2, v3;
24 };
25 struct QuadIndex {
26 uint16 data[6];
27 };
28 22
29 COMPILE_ASSERT(sizeof(Quad) == 24 * sizeof(float), // NOLINT(runtime/sizeof) 23 COMPILE_ASSERT(sizeof(Quad) == 24 * sizeof(float), // NOLINT(runtime/sizeof)
30 struct_is_densely_packed); 24 struct_is_densely_packed);
31 COMPILE_ASSERT( 25 COMPILE_ASSERT(
32 sizeof(QuadIndex) == 6 * sizeof(uint16_t), // NOLINT(runtime/sizeof) 26 sizeof(QuadIndex) == 6 * sizeof(uint16_t), // NOLINT(runtime/sizeof)
33 struct_is_densely_packed); 27 struct_is_densely_packed);
34 28
35 Quad quad_list[8]; 29 // XXX: Should check for OUT_OF_MEMORY here
36 QuadIndex quad_index_list[8]; 30 GLC(gl_, gl_->GenBuffers(1, &quad_vertices_vbo_));
37 for (int i = 0; i < 8; i++) { 31 GLC(gl_, gl_->GenBuffers(1, &quad_elements_vbo_));
38 Vertex v0 = {{quad_vertex_rect.x(), quad_vertex_rect.bottom(), 0.0f, }, 32
39 {0.0f, 1.0f, }, i * 4.0f + 0.0f}; 33 GLC(gl_, gl_->BindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo_));
40 Vertex v1 = {{quad_vertex_rect.x(), quad_vertex_rect.y(), 0.0f, }, 34 GLC(gl_,
41 {0.0f, 0.0f, }, i * 4.0f + 1.0f}; 35 gl_->BufferData(GL_ARRAY_BUFFER, sizeof(quads), quads, GL_DYNAMIC_DRAW));
42 Vertex v2 = {{quad_vertex_rect.right(), quad_vertex_rect.y(), 0.0f, }, 36
43 {1.0f, .0f, }, i * 4.0f + 2.0f}; 37 GLC(gl_, gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_));
44 Vertex v3 = {{quad_vertex_rect.right(), quad_vertex_rect.bottom(), 0.0f, }, 38 GLC(gl_,
45 {1.0f, 1.0f, }, i * 4.0f + 3.0f}; 39 gl_->BufferData(GL_ELEMENT_ARRAY_BUFFER,
40 sizeof(quad_indexes),
41 quad_indexes,
42 GL_DYNAMIC_DRAW));
43
44 InitializeBaseQuads(buffer_size);
45 }
46
47 void GeometryBinding::InitializeBaseQuads(size_t buffer_size) {
48 Quad quad_list[buffer_size];
49 QuadIndex quad_index_list[buffer_size];
50 for (size_t i = 0; i < buffer_size; i++) {
51 Vertex v0 = {{quad_vertex_rect_.x(), quad_vertex_rect_.bottom(), 0.0f},
52 {0.0f, 1.0f},
53 i * 4.0f + 0.0f};
54 Vertex v1 = {{quad_vertex_rect_.x(), quad_vertex_rect_.y(), 0.0f},
55 {0.0f, 0.0f},
56 i * 4.0f + 1.0f};
57 Vertex v2 = {{quad_vertex_rect_.right(), quad_vertex_rect_.y(), 0.0f},
58 {1.0f, 0.0f},
59 i * 4.0f + 2.0f};
60 Vertex v3 = {{quad_vertex_rect_.right(), quad_vertex_rect_.bottom(), 0.0f},
61 {1.0f, 1.0f},
62 i * 4.0f + 3.0f};
46 Quad x = {v0, v1, v2, v3}; 63 Quad x = {v0, v1, v2, v3};
47 quad_list[i] = x; 64 quad_list[i] = x;
48 QuadIndex y = { 65 QuadIndex y = {
49 {static_cast<uint16>(0 + 4 * i), static_cast<uint16>(1 + 4 * i), 66 {static_cast<uint16>(0 + 4 * i), static_cast<uint16>(1 + 4 * i),
50 static_cast<uint16>(2 + 4 * i), static_cast<uint16>(3 + 4 * i), 67 static_cast<uint16>(2 + 4 * i), static_cast<uint16>(3 + 4 * i),
51 static_cast<uint16>(0 + 4 * i), static_cast<uint16>(2 + 4 * i)}}; 68 static_cast<uint16>(0 + 4 * i), static_cast<uint16>(2 + 4 * i)}};
52 quad_index_list[i] = y; 69 quad_index_list[i] = y;
53 } 70 }
54 71 SetBuffers<Quad, QuadIndex>(
55 gl_->GenBuffers(1, &quad_vertices_vbo_); 72 quad_list, quad_index_list, 0, 0, buffer_size, buffer_size);
56 gl_->GenBuffers(1, &quad_elements_vbo_);
57 GLC(gl_, gl_->BindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo_));
58 GLC(gl_,
59 gl_->BufferData(
60 GL_ARRAY_BUFFER, sizeof(quad_list), quad_list, GL_STATIC_DRAW));
61 GLC(gl_, gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_));
62 GLC(gl_,
63 gl_->BufferData(GL_ELEMENT_ARRAY_BUFFER,
64 sizeof(quad_index_list),
65 quad_index_list,
66 GL_STATIC_DRAW));
67 } 73 }
68 74
69 GeometryBinding::~GeometryBinding() { 75 GeometryBinding::~GeometryBinding() {
70 gl_->DeleteBuffers(1, &quad_vertices_vbo_); 76 gl_->DeleteBuffers(1, &quad_vertices_vbo_);
71 gl_->DeleteBuffers(1, &quad_elements_vbo_); 77 gl_->DeleteBuffers(1, &quad_elements_vbo_);
72 } 78 }
73 79
74 void GeometryBinding::PrepareForDraw() { 80 void GeometryBinding::PrepareForDraw() {
75 GLC(gl_, gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_)); 81 GLC(gl_, gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_));
76 82
(...skipping 27 matching lines...) Expand all
104 1, 110 1,
105 GL_FLOAT, 111 GL_FLOAT,
106 false, 112 false,
107 6 * sizeof(float), // NOLINT(runtime/sizeof) 113 6 * sizeof(float), // NOLINT(runtime/sizeof)
108 offsets[2])); 114 offsets[2]));
109 GLC(gl_, gl_->EnableVertexAttribArray(PositionAttribLocation())); 115 GLC(gl_, gl_->EnableVertexAttribArray(PositionAttribLocation()));
110 GLC(gl_, gl_->EnableVertexAttribArray(TexCoordAttribLocation())); 116 GLC(gl_, gl_->EnableVertexAttribArray(TexCoordAttribLocation()));
111 GLC(gl_, gl_->EnableVertexAttribArray(TriangleIndexAttribLocation())); 117 GLC(gl_, gl_->EnableVertexAttribArray(TriangleIndexAttribLocation()));
112 } 118 }
113 119
120 GeometryBindingQuad::GeometryBindingQuad(gpu::gles2::GLES2Interface* gl,
121 const gfx::RectF& quad_vertex_rect)
122 : GeometryBinding(gl, quad_vertex_rect, 1) {
123 }
124
125 void GeometryBindingQuad::InitializeCustomQuad(const gfx::QuadF& quad) {
enne (OOO) 2014/09/24 17:35:30 Can the GeometryBinding stuff become two classes,
126 float uv[] = {0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
127 InitializeCustomQuadWithUVs(quad, uv);
128 }
129
130 void GeometryBindingQuad::InitializeCustomQuadWithUVs(const gfx::QuadF& quad,
131 float uv[8]) {
132 Vertex v0 = {{quad.p1().x(), quad.p1().y(), 0.0f}, {uv[0], uv[1]}, 0.0f};
133 Vertex v1 = {{quad.p2().x(), quad.p2().y(), 0.0f}, {uv[2], uv[3]}, 1.0f};
134 Vertex v2 = {{quad.p3().x(), quad.p3().y(), 0.0f}, {uv[4], uv[5]}, 2.0f};
135 Vertex v3 = {{quad.p4().x(), quad.p4().y(), 0.0f}, {uv[6], uv[7]}, 3.0f};
136
137 Quad local_quad = {v0, v1, v2, v3};
138 QuadIndex quad_index = {{static_cast<uint16>(0), static_cast<uint16>(1),
139 static_cast<uint16>(2), static_cast<uint16>(3),
140 static_cast<uint16>(0), static_cast<uint16>(2)}};
141
142 SetBuffers<Quad, QuadIndex>(&local_quad, &quad_index, 0, 0, 1, 1);
143 }
144
114 } // namespace cc 145 } // namespace cc
OLDNEW
« 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