| 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 3679a1ea6833b43fe51e392faeac5630b11bfe8a..f69715bdabfd8f4092d0f1106ef76b89a3cb26c1 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
|
| @@ -28,7 +28,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,
|
| @@ -36,7 +36,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 {
|
| @@ -45,13 +51,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) {
|
| @@ -59,6 +71,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;
|
|
|
| @@ -136,6 +167,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;
|
| }
|
| @@ -224,7 +319,8 @@ void CopyTextureCHROMIUMResourceManager::Destroy() {
|
|
|
| void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
|
| const gles2::GLES2Decoder* decoder,
|
| - GLenum target,
|
| + GLenum source_target,
|
| + GLenum dest_target,
|
| GLuint source_id,
|
| GLuint dest_id,
|
| GLint level,
|
| @@ -233,12 +329,16 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
|
| bool flip_y,
|
| bool premultiply_alpha,
|
| bool unpremultiply_alpha) {
|
| + DCHECK(source_target == GL_TEXTURE_2D ||
|
| + source_target == GL_TEXTURE_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,
|
| + source_target == GL_TEXTURE_EXTERNAL_OES);
|
| glUseProgram(programs_[program]);
|
|
|
| #ifndef NDEBUG
|
| @@ -260,7 +360,7 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
|
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
| glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer_);
|
| - glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target,
|
| + glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, dest_target,
|
| dest_id, level);
|
|
|
| #ifndef NDEBUG
|
| @@ -283,11 +383,11 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
|
|
|
| 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);
|
| + 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);
|
|
|