Index: gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc |
index cdf2f302a07fd4919afb23073072133f7126250d..db94904b65154daae1e15cb8b4025f485221ee07 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc |
@@ -27,7 +27,7 @@ const GLfloat kTextureCoords[] = { 0.0f, 0.0f, |
1.0f, 1.0f, |
0.0f, 1.0f }; |
-const int kNumShaders = 7; |
+const int kNumShaders = 13; |
enum ShaderId { |
VERTEX_SHADER_POS_TEX, |
FRAGMENT_SHADER_TEX, |
@@ -35,7 +35,13 @@ enum ShaderId { |
FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA, |
FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA, |
FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y, |
- FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y |
+ FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y, |
+ FRAGMENT_SHADER_TEX_OES, |
+ FRAGMENT_SHADER_TEX_OES_FLIP_Y, |
+ FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA, |
+ FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA, |
+ FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA_FLIP_Y, |
+ FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA_FLIP_Y |
}; |
enum ProgramId { |
@@ -44,13 +50,19 @@ enum ProgramId { |
PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA, |
PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, |
PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY, |
- PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY |
+ PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY, |
+ PROGRAM_COPY_TEXTURE_OES, |
+ PROGRAM_COPY_TEXTURE_OES_FLIP_Y, |
+ PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA, |
+ PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA, |
+ PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA_FLIPY, |
+ PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA_FLIPY |
}; |
// Returns the correct program to evaluate the copy operation for |
// the CHROMIUM_flipy and premultiply alpha pixel store settings. |
ProgramId GetProgram(bool flip_y, bool premultiply_alpha, |
- bool unpremultiply_alpha) { |
+ bool unpremultiply_alpha, bool is_source_external_oes) { |
// If both pre-multiply and unpremultiply are requested, then perform no |
// alpha manipulation. |
if (premultiply_alpha && unpremultiply_alpha) { |
@@ -58,6 +70,25 @@ ProgramId GetProgram(bool flip_y, bool premultiply_alpha, |
unpremultiply_alpha = false; |
} |
+ if (is_source_external_oes) { |
+ if (flip_y && premultiply_alpha) |
+ return PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA_FLIPY; |
+ |
+ if (flip_y && unpremultiply_alpha) |
+ return PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA_FLIPY; |
+ |
+ if (flip_y) |
+ return PROGRAM_COPY_TEXTURE_OES_FLIP_Y; |
+ |
+ if (premultiply_alpha) |
+ return PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA; |
+ |
+ if (unpremultiply_alpha) |
+ return PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA; |
+ |
+ return PROGRAM_COPY_TEXTURE_OES; |
+ } |
+ |
if (flip_y && premultiply_alpha) |
return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY; |
@@ -135,6 +166,70 @@ const char* GetShaderSource(ShaderId shader) { |
if (gl_FragColor.a > 0.0) |
gl_FragColor.rgb /= gl_FragColor.a; |
}); |
+ case FRAGMENT_SHADER_TEX_OES: |
+ // Cannot use the SHADER() macro because of the '#' char |
+ return |
+ "#extension GL_OES_EGL_image_external : require\n" |
+ "precision mediump float;\n" |
+ "uniform samplerExternalOES u_texSampler;\n" |
+ "varying vec2 v_uv;\n" |
+ "void main(void) {\n" |
+ " gl_FragColor = texture2D(u_texSampler, v_uv.st);\n" |
+ "}\n"; |
+ case FRAGMENT_SHADER_TEX_OES_FLIP_Y: |
+ return |
+ "#extension GL_OES_EGL_image_external : require\n" |
+ "precision mediump float;\n" |
+ "uniform samplerExternalOES u_texSampler;\n" |
+ "varying vec2 v_uv;\n" |
+ "void main(void) {\n" |
+ " gl_FragColor =\n" |
+ " texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));\n" |
+ "}\n"; |
+ case FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA: |
+ return |
+ "#extension GL_OES_EGL_image_external : require\n" |
+ "precision mediump float;\n" |
+ "uniform samplerExternalOES u_texSampler;\n" |
+ "varying vec2 v_uv;\n" |
+ "void main(void) {\n" |
+ " gl_FragColor = texture2D(u_texSampler, v_uv.st);\n" |
+ " gl_FragColor.rgb *= gl_FragColor.a;\n" |
+ "}\n"; |
+ case FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA: |
+ return |
+ "#extension GL_OES_EGL_image_external : require\n" |
+ "precision mediump float;\n" |
+ "uniform samplerExternalOES u_texSampler;\n" |
+ "varying vec2 v_uv;\n" |
+ "void main(void) {\n" |
+ " gl_FragColor = texture2D(u_texSampler, v_uv.st);\n" |
+ " if (gl_FragColor.a > 0.0)\n" |
+ " gl_FragColor.rgb /= gl_FragColor.a;\n" |
+ "}\n"; |
+ case FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA_FLIP_Y: |
+ return |
+ "#extension GL_OES_EGL_image_external : require\n" |
+ "precision mediump float;\n" |
+ "uniform samplerExternalOES u_texSampler;\n" |
+ "varying vec2 v_uv;\n" |
+ "void main(void) {\n" |
+ " gl_FragColor =\n" |
+ " texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));\n" |
+ " gl_FragColor.rgb *= gl_FragColor.a;\n" |
+ "}\n"; |
+ case FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA_FLIP_Y: |
+ return |
+ "#extension GL_OES_EGL_image_external : require\n" |
+ "precision mediump float;\n" |
+ "uniform samplerExternalOES u_texSampler;\n" |
+ "varying vec2 v_uv;\n" |
+ "void main(void) {\n" |
+ " gl_FragColor =\n" |
+ " texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));\n" |
+ " if (gl_FragColor.a > 0.0)\n" |
+ " gl_FragColor.rgb /= gl_FragColor.a;\n" |
+ "}\n"; |
default: |
return 0; |
} |
@@ -221,13 +316,15 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTexture( |
GLint level, |
bool flip_y, |
bool premultiply_alpha, |
- bool unpremultiply_alpha) { |
+ bool unpremultiply_alpha, |
+ bool is_source_external_oes) { |
if (!initialized_) { |
DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
return; |
} |
- GLuint program = GetProgram(flip_y, premultiply_alpha, unpremultiply_alpha); |
+ GLuint program = GetProgram( |
+ flip_y, premultiply_alpha, unpremultiply_alpha, is_source_external_oes); |
glUseProgram(programs_[program]); |
#ifndef NDEBUG |
@@ -266,11 +363,13 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTexture( |
glActiveTexture(GL_TEXTURE0); |
glUniform1i(sampler_locations_[program], 0); |
- glBindTexture(GL_TEXTURE_2D, source_id); |
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ const GLenum source_target = |
+ is_source_external_oes ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D; |
+ glBindTexture(source_target, source_id); |
+ glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
+ glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
+ glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
glDisable(GL_DEPTH_TEST); |
glDisable(GL_SCISSOR_TEST); |
@@ -282,4 +381,3 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTexture( |
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
} |
- |