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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "chrome/browser/android/vr_shell/vr_shell_renderer.h" 5 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <string> 9 #include <string>
10 10
11 #include "base/macros.h"
11 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
12 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
13 #include "chrome/browser/android/vr_shell/vr_gl_util.h" 14 #include "chrome/browser/android/vr_shell/vr_gl_util.h"
14 #include "ui/gfx/geometry/rect_f.h" 15 #include "ui/gfx/geometry/rect_f.h"
15 16
16 namespace { 17 namespace {
17 18
18 static constexpr float kHalfSize = 0.5f; 19 static constexpr float kHalfSize = 0.5f;
20
19 /* clang-format off */ 21 /* clang-format off */
20 static constexpr float kTextureQuadVertices[30] = { 22 static constexpr float kTexturedQuadVertices[8] = {
21 // x y z, u, v 23 // x y
22 -kHalfSize, kHalfSize, 0.0f, 0.0f, 0.0f, 24 -kHalfSize, kHalfSize,
23 -kHalfSize, -kHalfSize, 0.0f, 0.0f, 1.0f, 25 -kHalfSize, -kHalfSize,
24 kHalfSize, kHalfSize, 0.0f, 1.0f, 0.0f, 26 kHalfSize, kHalfSize,
25 -kHalfSize, -kHalfSize, 0.0f, 0.0f, 1.0f, 27 kHalfSize, -kHalfSize,
26 kHalfSize, -kHalfSize, 0.0f, 1.0f, 1.0f, 28 };
27 kHalfSize, kHalfSize, 0.0f, 1.0f, 0.0f }; 29
30 static constexpr GLushort kTexturedQuadIndices[6] = { 0, 1, 2, 1, 3, 2 };
28 /* clang-format on */ 31 /* clang-format on */
29 static constexpr size_t kTextureQuadVerticesSize = sizeof(float) * 30; 32
30 static constexpr size_t kTextureQuadDataStride = sizeof(float) * 5; 33 static constexpr int kTexturedQuadPositionDataSize = 2;
31 static constexpr int kPositionDataSize = 3;
32 static constexpr size_t kPositionDataOffset = 0;
33 static constexpr int kTextureCoordinateDataSize = 2;
34 static constexpr size_t kTextureCoordinateDataOffset = sizeof(float) * 3;
35 // Number of vertices passed to glDrawArrays().
36 static constexpr int kVerticesNumber = 6;
37 34
38 // Reticle constants 35 // Reticle constants
39 static constexpr float kRingDiameter = 1.0f; 36 static constexpr float kRingDiameter = 1.0f;
40 static constexpr float kInnerHole = 0.0f; 37 static constexpr float kInnerHole = 0.0f;
41 static constexpr float kInnerRingEnd = 0.177f; 38 static constexpr float kInnerRingEnd = 0.177f;
42 static constexpr float kInnerRingThickness = 0.14f; 39 static constexpr float kInnerRingThickness = 0.14f;
43 static constexpr float kMidRingEnd = 0.177f; 40 static constexpr float kMidRingEnd = 0.177f;
44 static constexpr float kMidRingOpacity = 0.22f; 41 static constexpr float kMidRingOpacity = 0.22f;
45 static constexpr float kReticleColor[] = {1.0f, 1.0f, 1.0f, 1.0f}; 42 static constexpr float kReticleColor[] = {1.0f, 1.0f, 1.0f, 1.0f};
46 43
(...skipping 22 matching lines...) Expand all
69 66
70 #define SHADER(Src) #Src 67 #define SHADER(Src) #Src
71 #define OEIE_SHADER(Src) "#extension GL_OES_EGL_image_external : require\n" #Src 68 #define OEIE_SHADER(Src) "#extension GL_OES_EGL_image_external : require\n" #Src
72 #define VOID_OFFSET(x) reinterpret_cast<void*>(x) 69 #define VOID_OFFSET(x) reinterpret_cast<void*>(x)
73 70
74 const char* GetShaderSource(vr_shell::ShaderID shader) { 71 const char* GetShaderSource(vr_shell::ShaderID shader) {
75 switch (shader) { 72 switch (shader) {
76 case vr_shell::ShaderID::EXTERNAL_TEXTURED_QUAD_VERTEX_SHADER: 73 case vr_shell::ShaderID::EXTERNAL_TEXTURED_QUAD_VERTEX_SHADER:
77 case vr_shell::ShaderID::RETICLE_VERTEX_SHADER: 74 case vr_shell::ShaderID::RETICLE_VERTEX_SHADER:
78 case vr_shell::ShaderID::LASER_VERTEX_SHADER: 75 case vr_shell::ShaderID::LASER_VERTEX_SHADER:
79 case vr_shell::ShaderID::CONTROLLER_VERTEX_SHADER:
80 case vr_shell::ShaderID::TEXTURED_QUAD_VERTEX_SHADER: 76 case vr_shell::ShaderID::TEXTURED_QUAD_VERTEX_SHADER:
81 return SHADER( 77 return SHADER(
82 /* clang-format off */ 78 /* clang-format off */
83 precision mediump float; 79 precision mediump float;
80 uniform mat4 u_ModelViewProjMatrix;
81 attribute vec4 a_Position;
82 varying vec2 v_TexCoordinate;
83
84 void main() {
85 v_TexCoordinate = vec2(0.5 + a_Position[0], 0.5 - a_Position[1]);
86 gl_Position = u_ModelViewProjMatrix * a_Position;
87 }
88 /* clang-format on */);
89 case vr_shell::ShaderID::CONTROLLER_VERTEX_SHADER:
90 return SHADER(
91 /* clang-format off */
92 precision mediump float;
84 uniform mat4 u_ModelViewProjMatrix; 93 uniform mat4 u_ModelViewProjMatrix;
85 attribute vec4 a_Position; 94 attribute vec4 a_Position;
86 attribute vec2 a_TexCoordinate; 95 attribute vec2 a_TexCoordinate;
87 varying vec2 v_TexCoordinate; 96 varying vec2 v_TexCoordinate;
88 97
89 void main() { 98 void main() {
90 v_TexCoordinate = a_TexCoordinate; 99 v_TexCoordinate = a_TexCoordinate;
91 gl_Position = u_ModelViewProjMatrix * a_Position; 100 gl_Position = u_ModelViewProjMatrix * a_Position;
92 } 101 }
93 /* clang-format on */); 102 /* clang-format on */);
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 327
319 program_handle_ = 328 program_handle_ =
320 CreateAndLinkProgram(vertex_shader_handle, fragment_shader_handle, error); 329 CreateAndLinkProgram(vertex_shader_handle, fragment_shader_handle, error);
321 CHECK(program_handle_) << error; 330 CHECK(program_handle_) << error;
322 331
323 // Once the program is linked the shader objects are no longer needed 332 // Once the program is linked the shader objects are no longer needed
324 glDeleteShader(vertex_shader_handle); 333 glDeleteShader(vertex_shader_handle);
325 glDeleteShader(fragment_shader_handle); 334 glDeleteShader(fragment_shader_handle);
326 335
327 position_handle_ = glGetAttribLocation(program_handle_, "a_Position"); 336 position_handle_ = glGetAttribLocation(program_handle_, "a_Position");
328 tex_coord_handle_ = glGetAttribLocation(program_handle_, "a_TexCoordinate");
329 } 337 }
330 338
331 BaseRenderer::~BaseRenderer() = default; 339 BaseRenderer::~BaseRenderer() = default;
332 340
333 BaseQuadRenderer::BaseQuadRenderer(ShaderID vertex_id, ShaderID fragment_id) 341 BaseQuadRenderer::BaseQuadRenderer(ShaderID vertex_id, ShaderID fragment_id)
334 : BaseRenderer(vertex_id, fragment_id) {} 342 : BaseRenderer(vertex_id, fragment_id) {}
335 343
336 GLuint BaseQuadRenderer::vertex_buffer_ = 0;
337
338 BaseQuadRenderer::~BaseQuadRenderer() = default; 344 BaseQuadRenderer::~BaseQuadRenderer() = default;
339 345
340 void BaseQuadRenderer::PrepareToDraw(GLuint view_proj_matrix_handle, 346 void BaseQuadRenderer::PrepareToDraw(GLuint view_proj_matrix_handle,
341 const gfx::Transform& view_proj_matrix) { 347 const gfx::Transform& view_proj_matrix) {
342 glUseProgram(program_handle_); 348 glUseProgram(program_handle_);
343 349
344 // Pass in model view project matrix. 350 // Pass in model view project matrix.
345 glUniformMatrix4fv(view_proj_matrix_handle, 1, false, 351 glUniformMatrix4fv(view_proj_matrix_handle, 1, false,
346 MatrixToGLArray(view_proj_matrix).data()); 352 MatrixToGLArray(view_proj_matrix).data());
347 353
348 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); 354 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
349 355
350 // Set up position attribute. 356 // Set up position attribute.
351 glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false, 357 glVertexAttribPointer(position_handle_, kTexturedQuadPositionDataSize,
352 kTextureQuadDataStride, 358 GL_FLOAT, false, 0, 0);
353 VOID_OFFSET(kPositionDataOffset));
354 glEnableVertexAttribArray(position_handle_); 359 glEnableVertexAttribArray(position_handle_);
355 360
356 // Set up texture coordinate attribute.
357 glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT,
358 false, kTextureQuadDataStride,
359 VOID_OFFSET(kTextureCoordinateDataOffset));
360 glEnableVertexAttribArray(tex_coord_handle_);
361
362 glEnable(GL_BLEND); 361 glEnable(GL_BLEND);
363 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 362 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
364 } 363 }
365 364
365 GLuint BaseQuadRenderer::vertex_buffer_ = 0;
366 GLuint BaseQuadRenderer::index_buffer_ = 0;
367
366 void BaseQuadRenderer::SetVertexBuffer() { 368 void BaseQuadRenderer::SetVertexBuffer() {
367 glGenBuffersARB(1, &vertex_buffer_); 369 GLuint buffers[2];
370 glGenBuffersARB(2, buffers);
371 vertex_buffer_ = buffers[0];
372 index_buffer_ = buffers[1];
373
368 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); 374 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
369 glBufferData(GL_ARRAY_BUFFER, kTextureQuadVerticesSize, kTextureQuadVertices, 375 glBufferData(GL_ARRAY_BUFFER,
370 GL_STATIC_DRAW); 376 arraysize(kTexturedQuadVertices) * sizeof(float),
377 kTexturedQuadVertices, GL_STATIC_DRAW);
378
379 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
380 glBufferData(GL_ELEMENT_ARRAY_BUFFER,
381 arraysize(kTexturedQuadIndices) * sizeof(GLushort),
382 kTexturedQuadIndices, GL_STATIC_DRAW);
371 } 383 }
372 384
373 ExternalTexturedQuadRenderer::ExternalTexturedQuadRenderer() 385 ExternalTexturedQuadRenderer::ExternalTexturedQuadRenderer()
374 : BaseQuadRenderer(EXTERNAL_TEXTURED_QUAD_VERTEX_SHADER, 386 : BaseQuadRenderer(EXTERNAL_TEXTURED_QUAD_VERTEX_SHADER,
375 EXTERNAL_TEXTURED_QUAD_FRAGMENT_SHADER) { 387 EXTERNAL_TEXTURED_QUAD_FRAGMENT_SHADER) {
376 model_view_proj_matrix_handle_ = 388 model_view_proj_matrix_handle_ =
377 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); 389 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
378 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); 390 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
379 copy_rect_uniform_handle_ = 391 copy_rect_uniform_handle_ =
380 glGetUniformLocation(program_handle_, "u_CopyRect"); 392 glGetUniformLocation(program_handle_, "u_CopyRect");
(...skipping 12 matching lines...) Expand all
393 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 405 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
394 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 406 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
395 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 407 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
396 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 408 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
397 409
398 glUniform1i(tex_uniform_handle_, 0); 410 glUniform1i(tex_uniform_handle_, 0);
399 glUniform4fv(copy_rect_uniform_handle_, 1, 411 glUniform4fv(copy_rect_uniform_handle_, 1,
400 reinterpret_cast<const float*>(&copy_rect)); 412 reinterpret_cast<const float*>(&copy_rect));
401 glUniform1f(opacity_handle_, opacity); 413 glUniform1f(opacity_handle_, opacity);
402 414
403 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); 415 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
416 glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
417 GL_UNSIGNED_SHORT, 0);
404 418
405 glDisableVertexAttribArray(position_handle_); 419 glDisableVertexAttribArray(position_handle_);
406 glDisableVertexAttribArray(tex_coord_handle_);
407 } 420 }
408 421
409 ExternalTexturedQuadRenderer::~ExternalTexturedQuadRenderer() = default; 422 ExternalTexturedQuadRenderer::~ExternalTexturedQuadRenderer() = default;
410 423
411 TexturedQuadRenderer::TexturedQuadRenderer() 424 TexturedQuadRenderer::TexturedQuadRenderer()
412 : BaseQuadRenderer(TEXTURED_QUAD_VERTEX_SHADER, 425 : BaseQuadRenderer(TEXTURED_QUAD_VERTEX_SHADER,
413 TEXTURED_QUAD_FRAGMENT_SHADER) { 426 TEXTURED_QUAD_FRAGMENT_SHADER) {
414 model_view_proj_matrix_handle_ = 427 model_view_proj_matrix_handle_ =
415 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); 428 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
416 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); 429 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
(...skipping 21 matching lines...) Expand all
438 451
439 int last_texture = 0; 452 int last_texture = 0;
440 float last_opacity = -1.0f; 453 float last_opacity = -1.0f;
441 454
442 // Set up GL state that doesn't change between draw calls. 455 // Set up GL state that doesn't change between draw calls.
443 glUseProgram(program_handle_); 456 glUseProgram(program_handle_);
444 457
445 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); 458 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
446 459
447 // Set up position attribute. 460 // Set up position attribute.
448 glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false, 461 glVertexAttribPointer(position_handle_, kTexturedQuadPositionDataSize,
449 kTextureQuadDataStride, 462 GL_FLOAT, false, 0, 0);
450 VOID_OFFSET(kPositionDataOffset));
451 glEnableVertexAttribArray(position_handle_); 463 glEnableVertexAttribArray(position_handle_);
452 464
453 // Set up texture coordinate attribute.
454 glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT,
455 false, kTextureQuadDataStride,
456 VOID_OFFSET(kTextureCoordinateDataOffset));
457 glEnableVertexAttribArray(tex_coord_handle_);
458
459 glEnable(GL_BLEND); 465 glEnable(GL_BLEND);
460 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 466 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
461 467
462 // Link texture data with texture unit. 468 // Link texture data with texture unit.
463 glActiveTexture(GL_TEXTURE0); 469 glActiveTexture(GL_TEXTURE0);
464 glUniform1i(tex_uniform_handle_, 0); 470 glUniform1i(tex_uniform_handle_, 0);
465 471
466 // TODO(bajones): This should eventually be changed to use instancing so that 472 // TODO(bajones): This should eventually be changed to use instancing so that
467 // the entire queue can be processed in one draw call. For now this still 473 // the entire queue can be processed in one draw call. For now this still
468 // significantly reduces the amount of state changes made per draw. 474 // significantly reduces the amount of state changes made per draw.
(...skipping 12 matching lines...) Expand all
481 } 487 }
482 488
483 // Pass in model view project matrix. 489 // Pass in model view project matrix.
484 glUniformMatrix4fv(model_view_proj_matrix_handle_, 1, false, 490 glUniformMatrix4fv(model_view_proj_matrix_handle_, 1, false,
485 MatrixToGLArray(quad.view_proj_matrix).data()); 491 MatrixToGLArray(quad.view_proj_matrix).data());
486 492
487 // Pass in the copy rect. 493 // Pass in the copy rect.
488 glUniform4fv(copy_rect_uniform_handle_, 1, 494 glUniform4fv(copy_rect_uniform_handle_, 1,
489 reinterpret_cast<const float*>(&quad.copy_rect)); 495 reinterpret_cast<const float*>(&quad.copy_rect));
490 496
491 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); 497 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
498 glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
499 GL_UNSIGNED_SHORT, 0);
492 500
493 quad_queue_.pop(); 501 quad_queue_.pop();
494 } 502 }
495 503
496 glDisableVertexAttribArray(position_handle_); 504 glDisableVertexAttribArray(position_handle_);
497 glDisableVertexAttribArray(tex_coord_handle_);
498 } 505 }
499 506
500 TexturedQuadRenderer::~TexturedQuadRenderer() = default; 507 TexturedQuadRenderer::~TexturedQuadRenderer() = default;
501 508
502 WebVrRenderer::WebVrRenderer() 509 WebVrRenderer::WebVrRenderer()
503 : BaseQuadRenderer(WEBVR_VERTEX_SHADER, WEBVR_FRAGMENT_SHADER) { 510 : BaseQuadRenderer(WEBVR_VERTEX_SHADER, WEBVR_FRAGMENT_SHADER) {
504 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); 511 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
505 } 512 }
506 513
507 // Draw the stereo WebVR frame 514 // Draw the stereo WebVR frame
508 void WebVrRenderer::Draw(int texture_handle) { 515 void WebVrRenderer::Draw(int texture_handle) {
509 glUseProgram(program_handle_); 516 glUseProgram(program_handle_);
510 517
511 // Bind vertex attributes 518 // Bind vertex attributes
512 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); 519 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
513 520
514 // Set up position attribute. 521 // Set up position attribute.
515 glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false, 522 glVertexAttribPointer(position_handle_, kTexturedQuadPositionDataSize,
516 kTextureQuadDataStride, 523 GL_FLOAT, false, 0, 0);
517 VOID_OFFSET(kPositionDataOffset));
518 glEnableVertexAttribArray(position_handle_); 524 glEnableVertexAttribArray(position_handle_);
519 525
520 // Set up texture coordinate attribute.
521 glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT,
522 false, kTextureQuadDataStride,
523 VOID_OFFSET(kTextureCoordinateDataOffset));
524 glEnableVertexAttribArray(tex_coord_handle_);
525
526 // Bind texture. This is a 1:1 pixel copy since the source surface 526 // Bind texture. This is a 1:1 pixel copy since the source surface
527 // and renderbuffer destination size are resized to match, so use 527 // and renderbuffer destination size are resized to match, so use
528 // GL_NEAREST. 528 // GL_NEAREST.
529 glActiveTexture(GL_TEXTURE0); 529 glActiveTexture(GL_TEXTURE0);
530 glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_handle); 530 glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_handle);
531 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 531 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
532 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 532 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
533 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 533 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
534 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 534 glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
535 glUniform1i(tex_uniform_handle_, 0); 535 glUniform1i(tex_uniform_handle_, 0);
536 536
537 // Blit texture to buffer 537 // Blit texture to buffer
538 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); 538 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
539 glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
540 GL_UNSIGNED_SHORT, 0);
539 541
540 glDisableVertexAttribArray(position_handle_); 542 glDisableVertexAttribArray(position_handle_);
541 glDisableVertexAttribArray(tex_coord_handle_);
542 } 543 }
543 544
544 // Note that we don't explicitly delete gl objects here, they're deleted 545 // Note that we don't explicitly delete gl objects here, they're deleted
545 // automatically when we call ShutdownGL, and deleting them here leads to 546 // automatically when we call ShutdownGL, and deleting them here leads to
546 // segfaults. 547 // segfaults.
547 WebVrRenderer::~WebVrRenderer() = default; 548 WebVrRenderer::~WebVrRenderer() = default;
548 549
549 ReticleRenderer::ReticleRenderer() 550 ReticleRenderer::ReticleRenderer()
550 : BaseQuadRenderer(RETICLE_VERTEX_SHADER, RETICLE_FRAGMENT_SHADER) { 551 : BaseQuadRenderer(RETICLE_VERTEX_SHADER, RETICLE_FRAGMENT_SHADER) {
551 model_view_proj_matrix_handle_ = 552 model_view_proj_matrix_handle_ =
(...skipping 16 matching lines...) Expand all
568 569
569 glUniform4f(color_handle_, kReticleColor[0], kReticleColor[1], 570 glUniform4f(color_handle_, kReticleColor[0], kReticleColor[1],
570 kReticleColor[2], kReticleColor[3]); 571 kReticleColor[2], kReticleColor[3]);
571 glUniform1f(ring_diameter_handle_, kRingDiameter); 572 glUniform1f(ring_diameter_handle_, kRingDiameter);
572 glUniform1f(inner_hole_handle_, kInnerHole); 573 glUniform1f(inner_hole_handle_, kInnerHole);
573 glUniform1f(inner_ring_end_handle_, kInnerRingEnd); 574 glUniform1f(inner_ring_end_handle_, kInnerRingEnd);
574 glUniform1f(inner_ring_thickness_handle_, kInnerRingThickness); 575 glUniform1f(inner_ring_thickness_handle_, kInnerRingThickness);
575 glUniform1f(mid_ring_end_handle_, kMidRingEnd); 576 glUniform1f(mid_ring_end_handle_, kMidRingEnd);
576 glUniform1f(mid_ring_opacity_handle_, kMidRingOpacity); 577 glUniform1f(mid_ring_opacity_handle_, kMidRingOpacity);
577 578
578 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); 579 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
580 glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
581 GL_UNSIGNED_SHORT, 0);
579 582
580 glDisableVertexAttribArray(position_handle_); 583 glDisableVertexAttribArray(position_handle_);
581 glDisableVertexAttribArray(tex_coord_handle_);
582 } 584 }
583 585
584 ReticleRenderer::~ReticleRenderer() = default; 586 ReticleRenderer::~ReticleRenderer() = default;
585 587
586 LaserRenderer::LaserRenderer() 588 LaserRenderer::LaserRenderer()
587 : BaseQuadRenderer(LASER_VERTEX_SHADER, LASER_FRAGMENT_SHADER) { 589 : BaseQuadRenderer(LASER_VERTEX_SHADER, LASER_FRAGMENT_SHADER) {
588 model_view_proj_matrix_handle_ = 590 model_view_proj_matrix_handle_ =
589 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); 591 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
590 texture_unit_handle_ = glGetUniformLocation(program_handle_, "texture_unit"); 592 texture_unit_handle_ = glGetUniformLocation(program_handle_, "texture_unit");
591 color_handle_ = glGetUniformLocation(program_handle_, "color"); 593 color_handle_ = glGetUniformLocation(program_handle_, "color");
(...skipping 21 matching lines...) Expand all
613 glActiveTexture(GL_TEXTURE0); 615 glActiveTexture(GL_TEXTURE0);
614 glBindTexture(GL_TEXTURE_2D, texture_data_handle_); 616 glBindTexture(GL_TEXTURE_2D, texture_data_handle_);
615 617
616 glUniform1i(texture_unit_handle_, 0); 618 glUniform1i(texture_unit_handle_, 0);
617 glUniform4f(color_handle_, kLaserColor[0], kLaserColor[1], kLaserColor[2], 619 glUniform4f(color_handle_, kLaserColor[0], kLaserColor[1], kLaserColor[2],
618 kLaserColor[3]); 620 kLaserColor[3]);
619 glUniform1f(fade_point_handle_, kFadePoint); 621 glUniform1f(fade_point_handle_, kFadePoint);
620 glUniform1f(fade_end_handle_, kFadeEnd); 622 glUniform1f(fade_end_handle_, kFadeEnd);
621 glUniform1f(opacity_handle_, opacity); 623 glUniform1f(opacity_handle_, opacity);
622 624
623 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); 625 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
626 glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
627 GL_UNSIGNED_SHORT, 0);
624 628
625 glDisableVertexAttribArray(position_handle_); 629 glDisableVertexAttribArray(position_handle_);
626 glDisableVertexAttribArray(tex_coord_handle_);
627 } 630 }
628 631
629 LaserRenderer::~LaserRenderer() = default; 632 LaserRenderer::~LaserRenderer() = default;
630 633
631 ControllerRenderer::ControllerRenderer() 634 ControllerRenderer::ControllerRenderer()
632 : BaseRenderer(CONTROLLER_VERTEX_SHADER, CONTROLLER_FRAGMENT_SHADER), 635 : BaseRenderer(CONTROLLER_VERTEX_SHADER, CONTROLLER_FRAGMENT_SHADER),
633 texture_handles_(VrControllerModel::STATE_COUNT) { 636 texture_handles_(VrControllerModel::STATE_COUNT) {
634 model_view_proj_matrix_handle_ = 637 model_view_proj_matrix_handle_ =
635 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); 638 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
639 tex_coord_handle_ = glGetAttribLocation(program_handle_, "a_TexCoordinate");
636 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); 640 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
637 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity"); 641 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity");
638 } 642 }
639 643
640 ControllerRenderer::~ControllerRenderer() = default; 644 ControllerRenderer::~ControllerRenderer() = default;
641 645
642 void ControllerRenderer::SetUp(std::unique_ptr<VrControllerModel> model) { 646 void ControllerRenderer::SetUp(std::unique_ptr<VrControllerModel> model) {
643 TRACE_EVENT0("gpu", "ControllerRenderer::SetUp"); 647 TRACE_EVENT0("gpu", "ControllerRenderer::SetUp");
644 glGenBuffersARB(1, &indices_buffer_); 648 glGenBuffersARB(1, &indices_buffer_);
645 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer_); 649 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer_);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 PrepareToDraw(model_view_proj_matrix_handle_, view_proj_matrix); 743 PrepareToDraw(model_view_proj_matrix_handle_, view_proj_matrix);
740 744
741 // Tell shader the grid size so that it can calculate the fading. 745 // Tell shader the grid size so that it can calculate the fading.
742 glUniform1f(scene_radius_handle_, kHalfSize); 746 glUniform1f(scene_radius_handle_, kHalfSize);
743 747
744 // Set the edge color to the fog color so that it seems to fade out. 748 // Set the edge color to the fog color so that it seems to fade out.
745 SetColorUniform(edge_color_handle_, edge_color); 749 SetColorUniform(edge_color_handle_, edge_color);
746 SetColorUniform(center_color_handle_, center_color); 750 SetColorUniform(center_color_handle_, center_color);
747 glUniform1f(opacity_handle_, opacity); 751 glUniform1f(opacity_handle_, opacity);
748 752
749 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); 753 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
754 glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
755 GL_UNSIGNED_SHORT, 0);
750 756
751 glDisableVertexAttribArray(position_handle_); 757 glDisableVertexAttribArray(position_handle_);
752 glDisableVertexAttribArray(tex_coord_handle_);
753 } 758 }
754 759
755 GradientQuadRenderer::~GradientQuadRenderer() = default; 760 GradientQuadRenderer::~GradientQuadRenderer() = default;
756 761
757 GradientGridRenderer::GradientGridRenderer() 762 GradientGridRenderer::GradientGridRenderer()
758 : BaseQuadRenderer(GRADIENT_QUAD_VERTEX_SHADER, 763 : BaseQuadRenderer(GRADIENT_QUAD_VERTEX_SHADER,
759 GRADIENT_GRID_FRAGMENT_SHADER) { 764 GRADIENT_GRID_FRAGMENT_SHADER) {
760 model_view_proj_matrix_handle_ = 765 model_view_proj_matrix_handle_ =
761 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); 766 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
762 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius"); 767 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius");
(...skipping 15 matching lines...) Expand all
778 // Tell shader the grid size so that it can calculate the fading. 783 // Tell shader the grid size so that it can calculate the fading.
779 glUniform1f(scene_radius_handle_, kHalfSize); 784 glUniform1f(scene_radius_handle_, kHalfSize);
780 glUniform1i(lines_count_handle_, gridline_count); 785 glUniform1i(lines_count_handle_, gridline_count);
781 786
782 // Set the edge color to the fog color so that it seems to fade out. 787 // Set the edge color to the fog color so that it seems to fade out.
783 SetColorUniform(edge_color_handle_, edge_color); 788 SetColorUniform(edge_color_handle_, edge_color);
784 SetColorUniform(center_color_handle_, center_color); 789 SetColorUniform(center_color_handle_, center_color);
785 SetColorUniform(grid_color_handle_, grid_color); 790 SetColorUniform(grid_color_handle_, grid_color);
786 glUniform1f(opacity_handle_, opacity); 791 glUniform1f(opacity_handle_, opacity);
787 792
788 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); 793 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
794 glDrawElements(GL_TRIANGLES, arraysize(kTexturedQuadIndices),
795 GL_UNSIGNED_SHORT, 0);
789 796
790 glDisableVertexAttribArray(position_handle_); 797 glDisableVertexAttribArray(position_handle_);
791 glDisableVertexAttribArray(tex_coord_handle_);
792 } 798 }
793 799
794 GradientGridRenderer::~GradientGridRenderer() = default; 800 GradientGridRenderer::~GradientGridRenderer() = default;
795 801
796 VrShellRenderer::VrShellRenderer() 802 VrShellRenderer::VrShellRenderer()
797 : external_textured_quad_renderer_( 803 : external_textured_quad_renderer_(
798 base::MakeUnique<ExternalTexturedQuadRenderer>()), 804 base::MakeUnique<ExternalTexturedQuadRenderer>()),
799 textured_quad_renderer_(base::MakeUnique<TexturedQuadRenderer>()), 805 textured_quad_renderer_(base::MakeUnique<TexturedQuadRenderer>()),
800 webvr_renderer_(base::MakeUnique<WebVrRenderer>()), 806 webvr_renderer_(base::MakeUnique<WebVrRenderer>()),
801 reticle_renderer_(base::MakeUnique<ReticleRenderer>()), 807 reticle_renderer_(base::MakeUnique<ReticleRenderer>()),
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 GradientGridRenderer* VrShellRenderer::GetGradientGridRenderer() { 868 GradientGridRenderer* VrShellRenderer::GetGradientGridRenderer() {
863 Flush(); 869 Flush();
864 return gradient_grid_renderer_.get(); 870 return gradient_grid_renderer_.get();
865 } 871 }
866 872
867 void VrShellRenderer::Flush() { 873 void VrShellRenderer::Flush() {
868 textured_quad_renderer_->Flush(); 874 textured_quad_renderer_->Flush();
869 } 875 }
870 876
871 } // namespace vr_shell 877 } // namespace vr_shell
OLDNEW
« 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