| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0d038533c07ee853991b9894c68af7410cae036b
|
| --- /dev/null
|
| +++ b/chrome/browser/android/vr_shell/vr_shell_renderer.cc
|
| @@ -0,0 +1,125 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/android/vr_shell/vr_shell_renderer.h"
|
| +
|
| +#include "chrome/browser/android/vr_shell/vr_util.h"
|
| +
|
| +namespace vr_shell {
|
| +
|
| +namespace {
|
| +
|
| +const float kHalfHeight = 0.5f;
|
| +const float kHalfWidth = 0.5f;
|
| +const float kTextureQuadPosition[18] = {
|
| + -kHalfWidth, kHalfHeight, 0.0f, -kHalfWidth, -kHalfHeight, 0.0f,
|
| + kHalfWidth, kHalfHeight, 0.0f, -kHalfWidth, -kHalfHeight, 0.0f,
|
| + kHalfWidth, -kHalfHeight, 0.0f, kHalfWidth, kHalfHeight, 0.0f
|
| +};
|
| +const int kPositionDataSize = 3;
|
| +// Number of vertices passed to glDrawArrays().
|
| +const int kVerticesNumber = 6;
|
| +
|
| +const float kTexturedQuadTextureCoordinates[12] = {
|
| + 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
|
| + 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f
|
| +};
|
| +const int kTextureCoordinateDataSize = 2;
|
| +
|
| +const GLchar* kTexturedQuadVertexShader =
|
| + "uniform mat4 u_CombinedMatrix;\n"
|
| + "attribute vec4 a_Position;\n"
|
| + "attribute vec2 a_TexCoordinate;\n"
|
| + "varying vec2 v_TexCoordinate;\n"
|
| + "\n"
|
| + "void main() {\n"
|
| + " v_TexCoordinate = a_TexCoordinate;\n"
|
| + " gl_Position = u_CombinedMatrix * a_Position;\n"
|
| + "}\n";
|
| +
|
| +const GLchar* kTexturedQuadFragmentShader =
|
| + "#extension GL_OES_EGL_image_external : require\n"
|
| + "precision highp float;\n"
|
| + "uniform samplerExternalOES u_Texture;\n"
|
| + "varying vec2 v_TexCoordinate;\n"
|
| + "\n"
|
| + "void main() {\n"
|
| + " vec4 texture = texture2D(u_Texture, v_TexCoordinate);\n"
|
| + " gl_FragColor = vec4(texture.r, texture.g, texture.b, 1.0);\n"
|
| + "}\n";
|
| +
|
| +} // namespace
|
| +
|
| +TexturedQuadRenderer::TexturedQuadRenderer() {
|
| + std::string error;
|
| + vertex_shader_handle_ =
|
| + CompileShader(GL_VERTEX_SHADER, kTexturedQuadVertexShader, error);
|
| + if (vertex_shader_handle_ == 0) {
|
| + LOG(ERROR) << error;
|
| + exit(1);
|
| + }
|
| + fragment_shader_handle_ =
|
| + CompileShader(GL_FRAGMENT_SHADER, kTexturedQuadFragmentShader, error);
|
| + if (fragment_shader_handle_ == 0) {
|
| + LOG(ERROR) << error;
|
| + exit(1);
|
| + }
|
| +
|
| + program_handle_ = CreateAndLinkProgram(
|
| + vertex_shader_handle_, fragment_shader_handle_, 4, nullptr, error);
|
| + if (program_handle_ == 0) {
|
| + LOG(ERROR) << error;
|
| + exit(1);
|
| + }
|
| + combined_matrix_handle_ =
|
| + glGetUniformLocation(program_handle_, "u_CombinedMatrix");
|
| + texture_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
|
| + position_handle_ = glGetAttribLocation(program_handle_, "a_Position");
|
| + texture_coordinate_handle_ =
|
| + glGetAttribLocation(program_handle_, "a_TexCoordinate");
|
| +}
|
| +
|
| +void TexturedQuadRenderer::Draw(int texture_data_handle,
|
| + const gvr::Mat4f& combined_matrix) {
|
| + glUseProgram(program_handle_);
|
| +
|
| + // Pass in model view project matrix.
|
| + glUniformMatrix4fv(combined_matrix_handle_, 1, false,
|
| + MatrixToGLArray(combined_matrix).data());
|
| +
|
| + // Pass in texture coordinate.
|
| + glVertexAttribPointer(texture_coordinate_handle_, kTextureCoordinateDataSize,
|
| + GL_FLOAT, false, 0, kTexturedQuadTextureCoordinates);
|
| + glEnableVertexAttribArray(texture_coordinate_handle_);
|
| +
|
| + glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false, 0,
|
| + kTextureQuadPosition);
|
| + glEnableVertexAttribArray(position_handle_);
|
| +
|
| + // Link texture data with texture unit.
|
| + glActiveTexture(GL_TEXTURE0);
|
| + glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_data_handle);
|
| + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
| + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
| + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
| + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| + glUniform1i(texture_uniform_handle_, 0);
|
| +
|
| + glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
|
| +
|
| + glDisableVertexAttribArray(position_handle_);
|
| + glDisableVertexAttribArray(texture_coordinate_handle_);
|
| +}
|
| +
|
| +TexturedQuadRenderer::~TexturedQuadRenderer() {
|
| + glDeleteShader(vertex_shader_handle_);
|
| + glDeleteShader(fragment_shader_handle_);
|
| +}
|
| +
|
| +VrShellRenderer::VrShellRenderer()
|
| + : textured_quad_renderer_(new TexturedQuadRenderer) {}
|
| +
|
| +VrShellRenderer::~VrShellRenderer() {}
|
| +
|
| +} // namespace vr_shell
|
|
|