Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "gpu/command_buffer/common/types.h" | 8 #include "gpu/command_buffer/common/types.h" |
| 9 #include "gpu/command_buffer/service/gl_utils.h" | 9 #include "gpu/command_buffer/service/gl_utils.h" |
| 10 | 10 |
| 11 #define SHADER0(Src) \ | 11 #define SHADER0(Src) \ |
| 12 "#ifdef GL_ES\n"\ | 12 "#ifdef GL_ES\n"\ |
| 13 "precision mediump float;\n"\ | 13 "precision mediump float;\n"\ |
| 14 "#endif\n"\ | 14 "#endif\n"\ |
| 15 #Src | 15 #Src |
| 16 #define SHADER(Src) SHADER0(Src) | 16 #define SHADER(Src) SHADER0(Src) |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 const GLfloat kQuadVertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, | 20 const GLfloat kQuadVertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, |
| 21 1.0f, -1.0f, 0.0f, 1.0f, | 21 1.0f, -1.0f, 0.0f, 1.0f, |
| 22 1.0f, 1.0f, 0.0f, 1.0f, | 22 1.0f, 1.0f, 0.0f, 1.0f, |
| 23 -1.0f, 1.0f, 0.0f, 1.0f }; | 23 -1.0f, 1.0f, 0.0f, 1.0f }; |
| 24 | 24 |
| 25 const GLfloat kTextureCoords[] = { 0.0f, 0.0f, | 25 const GLfloat kTextureCoords[] = { 0.0f, 0.0f, |
| 26 1.0f, 0.0f, | 26 1.0f, 0.0f, |
| 27 1.0f, 1.0f, | 27 1.0f, 1.0f, |
| 28 0.0f, 1.0f }; | 28 0.0f, 1.0f }; |
| 29 | 29 |
| 30 const int kNumShaders = 5; | 30 const int kNumShaders = 6; |
|
apatrick_chromium
2012/06/14 21:06:29
7
Jeff Timanus
2012/06/14 22:54:14
Done.
| |
| 31 enum ShaderId { | 31 enum ShaderId { |
| 32 VERTEX_SHADER_POS_TEX, | 32 VERTEX_SHADER_POS_TEX, |
| 33 FRAGMENT_SHADER_TEX, | 33 FRAGMENT_SHADER_TEX, |
| 34 FRAGMENT_SHADER_TEX_FLIP_Y, | 34 FRAGMENT_SHADER_TEX_FLIP_Y, |
| 35 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA, | 35 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA, |
| 36 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y | 36 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA, |
| 37 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y, | |
| 38 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y | |
| 37 }; | 39 }; |
| 38 | 40 |
| 39 enum ProgramId { | 41 enum ProgramId { |
| 40 PROGRAM_COPY_TEXTURE, | 42 PROGRAM_COPY_TEXTURE, |
| 41 PROGRAM_COPY_TEXTURE_FLIP_Y, | 43 PROGRAM_COPY_TEXTURE_FLIP_Y, |
| 42 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA, | 44 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA, |
| 43 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY | 45 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, |
| 46 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY, | |
| 47 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY | |
| 44 }; | 48 }; |
| 45 | 49 |
| 46 // Returns the correct program to evaluate the copy operation for | 50 // Returns the correct program to evaluate the copy operation for |
| 47 // the CHROMIUM_flipy and premultiply alpha pixel store settings. | 51 // the CHROMIUM_flipy and premultiply alpha pixel store settings. |
| 48 ProgramId GetProgram(bool flip_y, bool premultiply_alpha) { | 52 ProgramId GetProgram(bool flip_y, bool premultiply_alpha, |
| 53 bool unpremultiply_alpha) { | |
| 49 if (flip_y && premultiply_alpha) | 54 if (flip_y && premultiply_alpha) |
| 50 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY; | 55 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY; |
| 51 | 56 |
| 57 if (flip_y && unpremultiply_alpha) | |
| 58 return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY; | |
| 59 | |
| 52 if (flip_y) | 60 if (flip_y) |
| 53 return PROGRAM_COPY_TEXTURE_FLIP_Y; | 61 return PROGRAM_COPY_TEXTURE_FLIP_Y; |
| 54 | 62 |
| 55 if (premultiply_alpha) | 63 if (premultiply_alpha) |
| 56 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA; | 64 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA; |
| 57 | 65 |
| 66 if (unpremultiply_alpha) | |
| 67 return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA; | |
| 68 | |
| 58 return PROGRAM_COPY_TEXTURE; | 69 return PROGRAM_COPY_TEXTURE; |
| 59 } | 70 } |
| 60 | 71 |
| 61 const char* GetShaderSource(ShaderId shader) { | 72 const char* GetShaderSource(ShaderId shader) { |
| 62 switch (shader) { | 73 switch (shader) { |
| 63 case VERTEX_SHADER_POS_TEX: | 74 case VERTEX_SHADER_POS_TEX: |
| 64 return SHADER( | 75 return SHADER( |
| 65 attribute vec4 a_position; | 76 attribute vec4 a_position; |
| 66 attribute vec2 a_texCoord; | 77 attribute vec2 a_texCoord; |
| 67 varying vec2 v_uv; | 78 varying vec2 v_uv; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 84 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); | 95 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); |
| 85 }); | 96 }); |
| 86 case FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA: | 97 case FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA: |
| 87 return SHADER( | 98 return SHADER( |
| 88 uniform sampler2D u_texSampler; | 99 uniform sampler2D u_texSampler; |
| 89 varying vec2 v_uv; | 100 varying vec2 v_uv; |
| 90 void main(void) { | 101 void main(void) { |
| 91 gl_FragColor = texture2D(u_texSampler, v_uv.st); | 102 gl_FragColor = texture2D(u_texSampler, v_uv.st); |
| 92 gl_FragColor.rgb *= gl_FragColor.a; | 103 gl_FragColor.rgb *= gl_FragColor.a; |
| 93 }); | 104 }); |
| 105 case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA: | |
| 106 return SHADER( | |
| 107 uniform sampler2D u_texSampler; | |
| 108 varying vec2 v_uv; | |
| 109 void main(void) { | |
| 110 gl_FragColor = texture2D(u_texSampler, v_uv.st); | |
| 111 gl_FragColor.rgb /= gl_FragColor.a; | |
|
apatrick_chromium
2012/06/14 21:06:29
GLSL ES spec says:
Treatment of conditions such a
Jeff Timanus
2012/06/14 22:54:14
I think that's ok. Unpremultiplying a buffer with
| |
| 112 }); | |
| 94 case FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y: | 113 case FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y: |
| 95 return SHADER( | 114 return SHADER( |
| 96 uniform sampler2D u_texSampler; | 115 uniform sampler2D u_texSampler; |
| 97 varying vec2 v_uv; | 116 varying vec2 v_uv; |
| 98 void main(void) { | 117 void main(void) { |
| 99 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); | 118 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); |
| 100 gl_FragColor.rgb *= gl_FragColor.a; | 119 gl_FragColor.rgb *= gl_FragColor.a; |
| 101 }); | 120 }); |
| 121 case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y: | |
| 122 return SHADER( | |
| 123 uniform sampler2D u_texSampler; | |
| 124 varying vec2 v_uv; | |
| 125 void main(void) { | |
| 126 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); | |
| 127 gl_FragColor.rgb /= gl_FragColor.a; | |
| 128 }); | |
| 102 default: | 129 default: |
| 103 return 0; | 130 return 0; |
| 104 } | 131 } |
| 105 } | 132 } |
| 106 | 133 |
| 107 } // namespace | 134 } // namespace |
| 108 | 135 |
| 109 void CopyTextureCHROMIUMResourceManager::Initialize() { | 136 void CopyTextureCHROMIUMResourceManager::Initialize() { |
| 110 COMPILE_ASSERT( | 137 COMPILE_ASSERT( |
| 111 kVertexPositionAttrib == 0u || kVertexTextureAttrib == 0u, | 138 kVertexPositionAttrib == 0u || kVertexTextureAttrib == 0u, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 177 | 204 |
| 178 glDeleteBuffersARB(2, buffer_ids_); | 205 glDeleteBuffersARB(2, buffer_ids_); |
| 179 } | 206 } |
| 180 | 207 |
| 181 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( | 208 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( |
| 182 GLenum target, | 209 GLenum target, |
| 183 GLuint source_id, | 210 GLuint source_id, |
| 184 GLuint dest_id, | 211 GLuint dest_id, |
| 185 GLint level, | 212 GLint level, |
| 186 bool flip_y, | 213 bool flip_y, |
| 187 bool premultiply_alpha) { | 214 bool premultiply_alpha, |
| 215 bool unpremultiply_alpha) { | |
| 188 if (!initialized_) { | 216 if (!initialized_) { |
| 189 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; | 217 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
| 190 return; | 218 return; |
| 191 } | 219 } |
| 192 | 220 |
| 193 GLuint program = GetProgram(flip_y, premultiply_alpha); | 221 GLuint program = GetProgram(flip_y, premultiply_alpha, unpremultiply_alpha); |
| 194 glUseProgram(programs_[program]); | 222 glUseProgram(programs_[program]); |
| 195 | 223 |
| 196 #ifndef NDEBUG | 224 #ifndef NDEBUG |
| 197 glValidateProgram(programs_[program]); | 225 glValidateProgram(programs_[program]); |
| 198 GLint validation_status; | 226 GLint validation_status; |
| 199 glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status); | 227 glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status); |
| 200 if (GL_TRUE != validation_status) { | 228 if (GL_TRUE != validation_status) { |
| 201 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; | 229 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; |
| 202 return; | 230 return; |
| 203 } | 231 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 239 glDisable(GL_SCISSOR_TEST); | 267 glDisable(GL_SCISSOR_TEST); |
| 240 glDisable(GL_STENCIL_TEST); | 268 glDisable(GL_STENCIL_TEST); |
| 241 glDisable(GL_CULL_FACE); | 269 glDisable(GL_CULL_FACE); |
| 242 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | 270 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); |
| 243 glDepthMask(GL_FALSE); | 271 glDepthMask(GL_FALSE); |
| 244 glDisable(GL_BLEND); | 272 glDisable(GL_BLEND); |
| 245 | 273 |
| 246 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); | 274 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
| 247 } | 275 } |
| 248 | 276 |
| OLD | NEW |