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 7951074d0453fedd5f9c2eba49fefdeb4030a37e..9024e0847ba19936fafddcd34b42759972c5b44c 100644 |
--- a/chrome/browser/android/vr_shell/vr_shell_renderer.cc |
+++ b/chrome/browser/android/vr_shell/vr_shell_renderer.cc |
@@ -75,6 +75,7 @@ const char* GetShaderSource(vr_shell::ShaderID 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::SKIA_QUAD_VERTEX_SHADER: |
return SHADER( |
/* clang-format off */ |
uniform mat4 u_ModelViewProjMatrix; |
@@ -119,6 +120,24 @@ const char* GetShaderSource(vr_shell::ShaderID shader) { |
gl_FragColor = vec4(color.xyz, color.w * opacity); |
} |
/* clang-format on */); |
+ case vr_shell::ShaderID::SKIA_QUAD_FRAGMENT_SHADER: |
+ return OEIE_SHADER( |
+ /* clang-format off */ |
+ precision highp float; |
+ uniform sampler2D u_Texture; |
+ uniform vec4 u_CopyRect; // rectangle |
+ varying vec2 v_TexCoordinate; |
+ uniform lowp vec4 color; |
+ uniform mediump float opacity; |
+ |
+ void main() { |
+ vec2 scaledTex = |
+ vec2(u_CopyRect[0] + v_TexCoordinate.x * u_CopyRect[2], |
+ u_CopyRect[1] + v_TexCoordinate.y * u_CopyRect[3]); |
+ lowp vec4 color = texture2D(u_Texture, scaledTex); |
+ gl_FragColor = vec4(color.xyz, color.w * opacity); |
+ } |
+ /* clang-format on */); |
case vr_shell::ShaderID::WEBVR_VERTEX_SHADER: |
return SHADER( |
/* clang-format off */ |
@@ -398,6 +417,71 @@ void TexturedQuadRenderer::Flush() { |
TexturedQuadRenderer::~TexturedQuadRenderer() = default; |
+SkiaQuadRenderer::SkiaQuadRenderer() |
+ : BaseQuadRenderer(SKIA_QUAD_VERTEX_SHADER, |
+ SKIA_QUAD_FRAGMENT_SHADER) { |
+ model_view_proj_matrix_handle_ = |
+ glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); |
+ tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); |
+ copy_rect_uniform_handle_ = |
+ glGetUniformLocation(program_handle_, "u_CopyRect"); |
+ opacity_handle_ = glGetUniformLocation(program_handle_, "opacity"); |
+} |
+ |
+void SkiaQuadRenderer::Draw(int texture_data_handle, |
cjgrant
2017/04/19 16:24:52
This is Flush(), refactored into a queue-less equi
|
+ const vr::Mat4f& view_proj_matrix, |
+ const gfx::RectF& copy_rect, |
+ float opacity) { |
+ TexturedQuad quad; |
+ quad.texture_data_handle = texture_data_handle; |
+ quad.view_proj_matrix = view_proj_matrix; |
+ quad.copy_rect = {copy_rect.x(), copy_rect.y(), copy_rect.width(), |
+ copy_rect.height()}; |
+ quad.opacity = opacity; |
+ |
+ // Set up GL state that doesn't change between draw calls. |
+ glUseProgram(program_handle_); |
+ |
+ glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); |
+ |
+ // Set up position attribute. |
+ glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false, |
+ kTextureQuadDataStride, |
+ VOID_OFFSET(kPositionDataOffset)); |
+ 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_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
+ |
+ // Link texture data with texture unit. |
+ glActiveTexture(GL_TEXTURE0); |
+ glUniform1i(tex_uniform_handle_, 0); |
+ |
+ glBindTexture(GL_TEXTURE_EXTERNAL_OES, quad.texture_data_handle); |
+ glUniform1f(opacity_handle_, quad.opacity); |
+ |
+ // Pass in model view project matrix. |
+ glUniformMatrix4fv(model_view_proj_matrix_handle_, 1, false, |
+ MatrixToGLArray(quad.view_proj_matrix).data()); |
+ |
+ // Pass in the copy rect. |
+ glUniform4fv(copy_rect_uniform_handle_, 1, |
+ reinterpret_cast<const float*>(&quad.copy_rect)); |
+ |
+ glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); |
+ |
+ glDisableVertexAttribArray(position_handle_); |
+ glDisableVertexAttribArray(tex_coord_handle_); |
+} |
+ |
+SkiaQuadRenderer::~SkiaQuadRenderer() = default; |
+ |
WebVrRenderer::WebVrRenderer() |
: BaseQuadRenderer(WEBVR_VERTEX_SHADER, WEBVR_FRAGMENT_SHADER) { |
tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); |