Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1006)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc

Issue 10535174: Addition of unpremultiply setting to GL_CHROMIUM_copy_texture. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698