| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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*>(©_rect)); | 412 reinterpret_cast<const float*>(©_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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |