Chromium Code Reviews| Index: gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc |
| =================================================================== |
| --- gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc (revision 141671) |
| +++ gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc (working copy) |
| @@ -27,34 +27,45 @@ |
| 1.0f, 1.0f, |
| 0.0f, 1.0f }; |
| -const int kNumShaders = 5; |
| +const int kNumShaders = 7; |
| enum ShaderId { |
| VERTEX_SHADER_POS_TEX, |
| FRAGMENT_SHADER_TEX, |
| FRAGMENT_SHADER_TEX_FLIP_Y, |
| FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA, |
| - FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y |
| + FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA, |
| + FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y, |
| + FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y |
| }; |
| enum ProgramId { |
| PROGRAM_COPY_TEXTURE, |
| PROGRAM_COPY_TEXTURE_FLIP_Y, |
| PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA, |
| - PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY |
| + PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, |
| + PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY, |
| + PROGRAM_COPY_TEXTURE_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) { |
| +ProgramId GetProgram(bool flip_y, bool premultiply_alpha, |
| + bool unpremultiply_alpha) { |
| if (flip_y && premultiply_alpha) |
| return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY; |
| + if (flip_y && unpremultiply_alpha) |
| + return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY; |
| + |
| if (flip_y) |
| return PROGRAM_COPY_TEXTURE_FLIP_Y; |
| if (premultiply_alpha) |
| return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA; |
| + if (unpremultiply_alpha) |
| + return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA; |
| + |
| return PROGRAM_COPY_TEXTURE; |
| } |
| @@ -91,6 +102,14 @@ |
| gl_FragColor = texture2D(u_texSampler, v_uv.st); |
| gl_FragColor.rgb *= gl_FragColor.a; |
| }); |
| + case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA: |
| + return SHADER( |
| + uniform sampler2D u_texSampler; |
| + varying vec2 v_uv; |
| + void main(void) { |
| + gl_FragColor = texture2D(u_texSampler, v_uv.st); |
| + gl_FragColor.rgb /= gl_FragColor.a; |
|
greggman
2012/06/15 00:11:45
IF the spec actually says that can terminate maybe
Jeff Timanus
2012/06/18 14:50:24
Straight from the spec:
Similarly, treatment of
|
| + }); |
| case FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y: |
| return SHADER( |
| uniform sampler2D u_texSampler; |
| @@ -99,6 +118,14 @@ |
| gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); |
| gl_FragColor.rgb *= gl_FragColor.a; |
| }); |
| + case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y: |
| + return SHADER( |
| + uniform sampler2D u_texSampler; |
| + varying vec2 v_uv; |
| + void main(void) { |
| + gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); |
| + gl_FragColor.rgb /= gl_FragColor.a; |
| + }); |
| default: |
| return 0; |
| } |
| @@ -184,13 +211,14 @@ |
| GLuint dest_id, |
| GLint level, |
| bool flip_y, |
| - bool premultiply_alpha) { |
| + bool premultiply_alpha, |
| + bool unpremultiply_alpha) { |
| if (!initialized_) { |
| DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
| return; |
| } |
| - GLuint program = GetProgram(flip_y, premultiply_alpha); |
| + GLuint program = GetProgram(flip_y, premultiply_alpha, unpremultiply_alpha); |
| glUseProgram(programs_[program]); |
| #ifndef NDEBUG |