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

Unified Diff: chrome/browser/android/vr_shell/vr_shell_renderer.cc

Issue 2970663006: [vr] Use ELEMENT_ARRAY_BUFFERS for quads in VrShellRenderer (Closed)
Patch Set: Created 3 years, 5 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
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell_renderer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/android/vr_shell/vr_shell_renderer.cc
diff --git a/chrome/browser/android/vr_shell/vr_shell_renderer.cc b/chrome/browser/android/vr_shell/vr_shell_renderer.cc
index f43a98a58d743956a603cf99ca6aa90a39231d21..cde75103d65e4c1a3757799f8cddf9f6a8bb96a5 100644
--- a/chrome/browser/android/vr_shell/vr_shell_renderer.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_renderer.cc
@@ -8,6 +8,7 @@
#include <algorithm>
#include <string>
+#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/trace_event/trace_event.h"
#include "chrome/browser/android/vr_shell/vr_gl_util.h"
@@ -16,24 +17,20 @@
namespace {
static constexpr float kHalfSize = 0.5f;
+
/* clang-format off */
-static constexpr float kTextureQuadVertices[30] = {
- // x y z, u, v
- -kHalfSize, kHalfSize, 0.0f, 0.0f, 0.0f,
- -kHalfSize, -kHalfSize, 0.0f, 0.0f, 1.0f,
- kHalfSize, kHalfSize, 0.0f, 1.0f, 0.0f,
- -kHalfSize, -kHalfSize, 0.0f, 0.0f, 1.0f,
- kHalfSize, -kHalfSize, 0.0f, 1.0f, 1.0f,
- kHalfSize, kHalfSize, 0.0f, 1.0f, 0.0f };
+static constexpr float kTexturedQuadVertices[8] = {
+ // x y
+ -kHalfSize, kHalfSize,
+ -kHalfSize, -kHalfSize,
+ kHalfSize, kHalfSize,
+ kHalfSize, -kHalfSize,
+};
+
+static constexpr GLushort kTexturedQuadIndices[6] = { 0, 1, 2, 1, 3, 2 };
/* clang-format on */
-static constexpr size_t kTextureQuadVerticesSize = sizeof(float) * 30;
-static constexpr size_t kTextureQuadDataStride = sizeof(float) * 5;
-static constexpr int kPositionDataSize = 3;
-static constexpr size_t kPositionDataOffset = 0;
-static constexpr int kTextureCoordinateDataSize = 2;
-static constexpr size_t kTextureCoordinateDataOffset = sizeof(float) * 3;
-// Number of vertices passed to glDrawArrays().
-static constexpr int kVerticesNumber = 6;
+
+static constexpr int kTexturedQuadPositionDataSize = 2;
// Reticle constants
static constexpr float kRingDiameter = 1.0f;
@@ -76,8 +73,20 @@ const char* GetShaderSource(vr_shell::ShaderID shader) {
case vr_shell::ShaderID::EXTERNAL_TEXTURED_QUAD_VERTEX_SHADER:
case vr_shell::ShaderID::RETICLE_VERTEX_SHADER:
case vr_shell::ShaderID::LASER_VERTEX_SHADER:
- case vr_shell::ShaderID::CONTROLLER_VERTEX_SHADER:
case vr_shell::ShaderID::TEXTURED_QUAD_VERTEX_SHADER:
+ return SHADER(
+ /* clang-format off */
+ precision mediump float;
+ uniform mat4 u_ModelViewProjMatrix;
+ attribute vec4 a_Position;
+ varying vec2 v_TexCoordinate;
+
+ void main() {
+ v_TexCoordinate = vec2(0.5 + a_Position[0], 0.5 - a_Position[1]);
+ gl_Position = u_ModelViewProjMatrix * a_Position;
+ }
+ /* clang-format on */);
+ case vr_shell::ShaderID::CONTROLLER_VERTEX_SHADER:
return SHADER(
/* clang-format off */
precision mediump float;
@@ -325,7 +334,6 @@ BaseRenderer::BaseRenderer(ShaderID vertex_id, ShaderID fragment_id) {
glDeleteShader(fragment_shader_handle);
position_handle_ = glGetAttribLocation(program_handle_, "a_Position");
- tex_coord_handle_ = glGetAttribLocation(program_handle_, "a_TexCoordinate");
}
BaseRenderer::~BaseRenderer() = default;
@@ -333,8 +341,6 @@ BaseRenderer::~BaseRenderer() = default;
BaseQuadRenderer::BaseQuadRenderer(ShaderID vertex_id, ShaderID fragment_id)
: BaseRenderer(vertex_id, fragment_id) {}
-GLuint BaseQuadRenderer::vertex_buffer_ = 0;
-
BaseQuadRenderer::~BaseQuadRenderer() = default;
void BaseQuadRenderer::PrepareToDraw(GLuint view_proj_matrix_handle,
@@ -348,26 +354,32 @@ void BaseQuadRenderer::PrepareToDraw(GLuint view_proj_matrix_handle,
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
// Set up position attribute.
- glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false,
- kTextureQuadDataStride,
- VOID_OFFSET(kPositionDataOffset));
+ glVertexAttribPointer(position_handle_, kTexturedQuadPositionDataSize,
+ GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(position_handle_);
- // Set up texture coordinate attribute.
- glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT,
- false, kTextureQuadDataStride,
- VOID_OFFSET(kTextureCoordinateDataOffset));
- glEnableVertexAttribArray(tex_coord_handle_);
-
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
}
+GLuint BaseQuadRenderer::vertex_buffer_ = 0;
+GLuint BaseQuadRenderer::index_buffer_ = 0;
+
void BaseQuadRenderer::SetVertexBuffer() {
- glGenBuffersARB(1, &vertex_buffer_);
+ GLuint buffers[2];
+ glGenBuffersARB(2, buffers);
+ vertex_buffer_ = buffers[0];
+ index_buffer_ = buffers[1];
+
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
- glBufferData(GL_ARRAY_BUFFER, kTextureQuadVerticesSize, kTextureQuadVertices,
- GL_STATIC_DRAW);
+ glBufferData(GL_ARRAY_BUFFER,
+ arraysize(kTexturedQuadVertices) * sizeof(float),
+ kTexturedQuadVertices, GL_STATIC_DRAW);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER,
+ arraysize(kTexturedQuadIndices) * sizeof(GLushort),
+ kTexturedQuadIndices, GL_STATIC_DRAW);
}
ExternalTexturedQuadRenderer::ExternalTexturedQuadRenderer()
@@ -400,10 +412,11 @@ void ExternalTexturedQuadRenderer::Draw(int texture_data_handle,
reinterpret_cast<const float*>(&copy_rect));
glUniform1f(opacity_handle_, opacity);
- glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
+ glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
+ GL_UNSIGNED_SHORT, 0);
glDisableVertexAttribArray(position_handle_);
- glDisableVertexAttribArray(tex_coord_handle_);
}
ExternalTexturedQuadRenderer::~ExternalTexturedQuadRenderer() = default;
@@ -445,17 +458,10 @@ void TexturedQuadRenderer::Flush() {
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
// Set up position attribute.
- glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false,
- kTextureQuadDataStride,
- VOID_OFFSET(kPositionDataOffset));
+ glVertexAttribPointer(position_handle_, kTexturedQuadPositionDataSize,
+ GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(position_handle_);
- // Set up texture coordinate attribute.
- glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT,
- false, kTextureQuadDataStride,
- VOID_OFFSET(kTextureCoordinateDataOffset));
- glEnableVertexAttribArray(tex_coord_handle_);
-
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
@@ -488,13 +494,14 @@ void TexturedQuadRenderer::Flush() {
glUniform4fv(copy_rect_uniform_handle_, 1,
reinterpret_cast<const float*>(&quad.copy_rect));
- glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
+ glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
+ GL_UNSIGNED_SHORT, 0);
quad_queue_.pop();
}
glDisableVertexAttribArray(position_handle_);
- glDisableVertexAttribArray(tex_coord_handle_);
}
TexturedQuadRenderer::~TexturedQuadRenderer() = default;
@@ -512,17 +519,10 @@ void WebVrRenderer::Draw(int texture_handle) {
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
// Set up position attribute.
- glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false,
- kTextureQuadDataStride,
- VOID_OFFSET(kPositionDataOffset));
+ glVertexAttribPointer(position_handle_, kTexturedQuadPositionDataSize,
+ GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(position_handle_);
- // Set up texture coordinate attribute.
- glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT,
- false, kTextureQuadDataStride,
- VOID_OFFSET(kTextureCoordinateDataOffset));
- glEnableVertexAttribArray(tex_coord_handle_);
-
// Bind texture. This is a 1:1 pixel copy since the source surface
// and renderbuffer destination size are resized to match, so use
// GL_NEAREST.
@@ -535,10 +535,11 @@ void WebVrRenderer::Draw(int texture_handle) {
glUniform1i(tex_uniform_handle_, 0);
// Blit texture to buffer
- glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
+ glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
+ GL_UNSIGNED_SHORT, 0);
glDisableVertexAttribArray(position_handle_);
- glDisableVertexAttribArray(tex_coord_handle_);
}
// Note that we don't explicitly delete gl objects here, they're deleted
@@ -575,10 +576,11 @@ void ReticleRenderer::Draw(const gfx::Transform& view_proj_matrix) {
glUniform1f(mid_ring_end_handle_, kMidRingEnd);
glUniform1f(mid_ring_opacity_handle_, kMidRingOpacity);
- glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
+ glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
+ GL_UNSIGNED_SHORT, 0);
glDisableVertexAttribArray(position_handle_);
- glDisableVertexAttribArray(tex_coord_handle_);
}
ReticleRenderer::~ReticleRenderer() = default;
@@ -620,10 +622,11 @@ void LaserRenderer::Draw(float opacity,
glUniform1f(fade_end_handle_, kFadeEnd);
glUniform1f(opacity_handle_, opacity);
- glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
+ glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
+ GL_UNSIGNED_SHORT, 0);
glDisableVertexAttribArray(position_handle_);
- glDisableVertexAttribArray(tex_coord_handle_);
}
LaserRenderer::~LaserRenderer() = default;
@@ -633,6 +636,7 @@ ControllerRenderer::ControllerRenderer()
texture_handles_(VrControllerModel::STATE_COUNT) {
model_view_proj_matrix_handle_ =
glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
+ tex_coord_handle_ = glGetAttribLocation(program_handle_, "a_TexCoordinate");
tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity");
}
@@ -746,10 +750,11 @@ void GradientQuadRenderer::Draw(const gfx::Transform& view_proj_matrix,
SetColorUniform(center_color_handle_, center_color);
glUniform1f(opacity_handle_, opacity);
- glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
+ glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
+ GL_UNSIGNED_SHORT, 0);
glDisableVertexAttribArray(position_handle_);
- glDisableVertexAttribArray(tex_coord_handle_);
}
GradientQuadRenderer::~GradientQuadRenderer() = default;
@@ -785,10 +790,11 @@ void GradientGridRenderer::Draw(const gfx::Transform& view_proj_matrix,
SetColorUniform(grid_color_handle_, grid_color);
glUniform1f(opacity_handle_, opacity);
- glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
+ glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
+ GL_UNSIGNED_SHORT, 0);
glDisableVertexAttribArray(position_handle_);
- glDisableVertexAttribArray(tex_coord_handle_);
}
GradientGridRenderer::~GradientGridRenderer() = default;
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell_renderer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698