| 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 a0afcd04db920ad6ee5fc61f6bacb012d6f15c15..f04c51fc27b10153406a9a9e949448e999082709 100644 | 
| --- a/chrome/browser/android/vr_shell/vr_shell_renderer.cc | 
| +++ b/chrome/browser/android/vr_shell/vr_shell_renderer.cc | 
| @@ -27,18 +27,13 @@ static constexpr float kTexturedQuadTextureCoordinates[12] = | 
|  | 
| static constexpr int kTextureCoordinateDataSize = 2; | 
|  | 
| -static constexpr float kWebVrVertices[32] = { | 
| +static constexpr float kWebVrVertices[16] = { | 
| //   x     y    u,   v | 
| -    -1.f,  1.f, 0.f, 0.f, // Left Eye | 
| +    -1.f,  1.f, 0.f, 0.f, | 
| -1.f, -1.f, 0.f, 1.f, | 
| -     0.f, -1.f, 1.f, 1.f, | 
| -     0.f,  1.f, 1.f, 0.f, | 
| - | 
| -     0.f,  1.f, 0.f, 0.f, // Right Eye | 
| -     0.f, -1.f, 0.f, 1.f, | 
| 1.f, -1.f, 1.f, 1.f, | 
| 1.f,  1.f, 1.f, 0.f }; | 
| -static constexpr int kWebVrVerticesSize = sizeof(float) * 32; | 
| +static constexpr int kWebVrVerticesSize = sizeof(float) * 16; | 
|  | 
| // Reticle constants | 
| static constexpr float kRingDiameter = 1.0f; | 
| @@ -103,14 +98,13 @@ const char* GetShaderSource(vr_shell::ShaderID shader) { | 
| }); | 
| case vr_shell::ShaderID::WEBVR_VERTEX_SHADER: | 
| return SHADER( | 
| -          attribute vec2 a_Position; | 
| -          attribute vec2 a_TexCoordinate; | 
| -          uniform vec4 u_SrcRect; | 
| +          attribute vec4 a_Position; | 
| varying vec2 v_TexCoordinate; | 
|  | 
| void main() { | 
| -            v_TexCoordinate = u_SrcRect.xy + (a_TexCoordinate * u_SrcRect.zw); | 
| -            gl_Position = vec4(a_Position, 0.0, 1.0); | 
| +            // Pack the texcoord into the position to avoid state changes. | 
| +            v_TexCoordinate = a_Position.zw; | 
| +            gl_Position = vec4(a_Position.xy, 0.0, 1.0); | 
| }); | 
| case vr_shell::ShaderID::WEBVR_FRAGMENT_SHADER: | 
| return OEIE_SHADER( | 
| @@ -259,11 +253,7 @@ TexturedQuadRenderer::~TexturedQuadRenderer() = default; | 
|  | 
| WebVrRenderer::WebVrRenderer() : | 
| BaseRenderer(WEBVR_VERTEX_SHADER, WEBVR_FRAGMENT_SHADER) { | 
| -  left_bounds_ = { 0.0f, 0.0f, 0.5f, 1.0f }; | 
| -  right_bounds_ = { 0.5f, 0.0f, 0.5f, 1.0f }; | 
| - | 
| tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); | 
| -  src_rect_uniform_handle_ = glGetUniformLocation(program_handle_, "u_SrcRect"); | 
|  | 
| // TODO(bajones): Figure out why this need to be restored. | 
| GLint old_buffer; | 
| @@ -289,12 +279,9 @@ void WebVrRenderer::Draw(int texture_handle) { | 
| glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); | 
|  | 
| glEnableVertexAttribArray(position_handle_); | 
| -  glEnableVertexAttribArray(tex_coord_handle_); | 
|  | 
| -  glVertexAttribPointer(position_handle_, POSITION_ELEMENTS, GL_FLOAT, false, | 
| -      VERTEX_STRIDE, VOID_OFFSET(POSITION_OFFSET)); | 
| -  glVertexAttribPointer(tex_coord_handle_, TEXCOORD_ELEMENTS, GL_FLOAT, false, | 
| -      VERTEX_STRIDE, VOID_OFFSET(TEXCOORD_OFFSET)); | 
| +  glVertexAttribPointer(position_handle_, VERTEX_ELEMENTS, GL_FLOAT, false, | 
| +      VERTEX_STRIDE, VOID_OFFSET(VERTEX_OFFSET)); | 
|  | 
| // Bind texture. Ideally this should be a 1:1 pixel copy. (Or even more | 
| // ideally, a zero copy reuse of the texture.) For now, we're using an | 
| @@ -305,33 +292,18 @@ void WebVrRenderer::Draw(int texture_handle) { | 
| glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_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_LINEAR); | 
| +  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 
| +  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 
| glUniform1i(tex_uniform_handle_, 0); | 
|  | 
| -  // TODO(bajones): Should be able handle both eyes in a single draw call. | 
| -  // Left eye | 
| -  glUniform4fv(src_rect_uniform_handle_, 1, (float*)(&left_bounds_)); | 
| +  // Blit texture to buffer | 
| glDrawArrays(GL_TRIANGLE_FAN, 0, 4); | 
|  | 
| -  // Right eye | 
| -  glUniform4fv(src_rect_uniform_handle_, 1, (float*)(&right_bounds_)); | 
| -  glDrawArrays(GL_TRIANGLE_FAN, 4, 4); | 
| - | 
| glDisableVertexAttribArray(position_handle_); | 
| -  glDisableVertexAttribArray(tex_coord_handle_); | 
|  | 
| glBindBuffer(GL_ARRAY_BUFFER, old_buffer); | 
| } | 
|  | 
| -void WebVrRenderer::UpdateTextureBounds(int eye, const gvr::Rectf& bounds) { | 
| -  if (eye == 0) { | 
| -    left_bounds_ = bounds; | 
| -  } else if (eye == 1) { | 
| -    right_bounds_ = bounds; | 
| -  } | 
| -} | 
| - | 
| // Note that we don't explicitly delete gl objects here, they're deleted | 
| // automatically when we call ClearGLBindings, and deleting them here leads to | 
| // segfaults. | 
|  |