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

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

Issue 11973010: AndroidVDA by using Android's MediaCodec API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: using CopyTextureCHROMIUMResourceManager Created 7 years, 10 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
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 = 7; 30 const int kNumShaders = 13;
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_UNPREMULTIPLY_ALPHA, 36 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA,
37 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y, 37 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y,
38 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y 38 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y,
39 FRAGMENT_SHADER_TEX_OES,
40 FRAGMENT_SHADER_TEX_OES_FLIP_Y,
41 FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA,
42 FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA,
43 FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA_FLIP_Y,
44 FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA_FLIP_Y
39 }; 45 };
40 46
41 enum ProgramId { 47 enum ProgramId {
42 PROGRAM_COPY_TEXTURE, 48 PROGRAM_COPY_TEXTURE,
43 PROGRAM_COPY_TEXTURE_FLIP_Y, 49 PROGRAM_COPY_TEXTURE_FLIP_Y,
44 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA, 50 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA,
45 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, 51 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA,
46 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY, 52 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY,
47 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY 53 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY,
54 PROGRAM_COPY_TEXTURE_OES,
55 PROGRAM_COPY_TEXTURE_OES_FLIP_Y,
56 PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA,
57 PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA,
58 PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA_FLIPY,
59 PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA_FLIPY
48 }; 60 };
49 61
50 // Returns the correct program to evaluate the copy operation for 62 // Returns the correct program to evaluate the copy operation for
51 // the CHROMIUM_flipy and premultiply alpha pixel store settings. 63 // the CHROMIUM_flipy and premultiply alpha pixel store settings.
52 ProgramId GetProgram(bool flip_y, bool premultiply_alpha, 64 ProgramId GetProgram(bool flip_y, bool premultiply_alpha,
53 bool unpremultiply_alpha) { 65 bool unpremultiply_alpha, bool is_source_external_oes) {
54 // If both pre-multiply and unpremultiply are requested, then perform no 66 // If both pre-multiply and unpremultiply are requested, then perform no
55 // alpha manipulation. 67 // alpha manipulation.
56 if (premultiply_alpha && unpremultiply_alpha) { 68 if (premultiply_alpha && unpremultiply_alpha) {
57 premultiply_alpha = false; 69 premultiply_alpha = false;
58 unpremultiply_alpha = false; 70 unpremultiply_alpha = false;
59 } 71 }
60 72
73 if (is_source_external_oes) {
74 if (flip_y && premultiply_alpha)
75 return PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA_FLIPY;
76
77 if (flip_y && unpremultiply_alpha)
78 return PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA_FLIPY;
79
80 if (flip_y)
81 return PROGRAM_COPY_TEXTURE_OES_FLIP_Y;
82
83 if (premultiply_alpha)
84 return PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA;
85
86 if (unpremultiply_alpha)
87 return PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA;
88
89 return PROGRAM_COPY_TEXTURE_OES;
90 }
91
61 if (flip_y && premultiply_alpha) 92 if (flip_y && premultiply_alpha)
62 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY; 93 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY;
63 94
64 if (flip_y && unpremultiply_alpha) 95 if (flip_y && unpremultiply_alpha)
65 return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY; 96 return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY;
66 97
67 if (flip_y) 98 if (flip_y)
68 return PROGRAM_COPY_TEXTURE_FLIP_Y; 99 return PROGRAM_COPY_TEXTURE_FLIP_Y;
69 100
70 if (premultiply_alpha) 101 if (premultiply_alpha)
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 }); 159 });
129 case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y: 160 case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y:
130 return SHADER( 161 return SHADER(
131 uniform sampler2D u_texSampler; 162 uniform sampler2D u_texSampler;
132 varying vec2 v_uv; 163 varying vec2 v_uv;
133 void main(void) { 164 void main(void) {
134 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); 165 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));
135 if (gl_FragColor.a > 0.0) 166 if (gl_FragColor.a > 0.0)
136 gl_FragColor.rgb /= gl_FragColor.a; 167 gl_FragColor.rgb /= gl_FragColor.a;
137 }); 168 });
169 case FRAGMENT_SHADER_TEX_OES:
170 // Cannot use the SHADER() macro because of the '#' char
171 return
172 "#extension GL_OES_EGL_image_external : require\n"
173 "precision mediump float;\n"
174 "uniform samplerExternalOES u_texSampler;\n"
175 "varying vec2 v_uv;\n"
176 "void main(void) {\n"
177 " gl_FragColor = texture2D(u_texSampler, v_uv.st);\n"
178 "}\n";
179 case FRAGMENT_SHADER_TEX_OES_FLIP_Y:
180 return
181 "#extension GL_OES_EGL_image_external : require\n"
182 "precision mediump float;\n"
183 "uniform samplerExternalOES u_texSampler;\n"
184 "varying vec2 v_uv;\n"
185 "void main(void) {\n"
186 " gl_FragColor =\n"
187 " texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));\n"
188 "}\n";
189 case FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA:
190 return
191 "#extension GL_OES_EGL_image_external : require\n"
192 "precision mediump float;\n"
193 "uniform samplerExternalOES u_texSampler;\n"
194 "varying vec2 v_uv;\n"
195 "void main(void) {\n"
196 " gl_FragColor = texture2D(u_texSampler, v_uv.st);\n"
197 " gl_FragColor.rgb *= gl_FragColor.a;\n"
198 "}\n";
199 case FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA:
200 return
201 "#extension GL_OES_EGL_image_external : require\n"
202 "precision mediump float;\n"
203 "uniform samplerExternalOES u_texSampler;\n"
204 "varying vec2 v_uv;\n"
205 "void main(void) {\n"
206 " gl_FragColor = texture2D(u_texSampler, v_uv.st);\n"
207 " if (gl_FragColor.a > 0.0)\n"
208 " gl_FragColor.rgb /= gl_FragColor.a;\n"
209 "}\n";
210 case FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA_FLIP_Y:
211 return
212 "#extension GL_OES_EGL_image_external : require\n"
213 "precision mediump float;\n"
214 "uniform samplerExternalOES u_texSampler;\n"
215 "varying vec2 v_uv;\n"
216 "void main(void) {\n"
217 " gl_FragColor =\n"
218 " texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));\n"
219 " gl_FragColor.rgb *= gl_FragColor.a;\n"
220 "}\n";
221 case FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA_FLIP_Y:
222 return
223 "#extension GL_OES_EGL_image_external : require\n"
224 "precision mediump float;\n"
225 "uniform samplerExternalOES u_texSampler;\n"
226 "varying vec2 v_uv;\n"
227 "void main(void) {\n"
228 " gl_FragColor =\n"
229 " texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));\n"
230 " if (gl_FragColor.a > 0.0)\n"
231 " gl_FragColor.rgb /= gl_FragColor.a;\n"
232 "}\n";
138 default: 233 default:
139 return 0; 234 return 0;
140 } 235 }
141 } 236 }
142 237
143 } // namespace 238 } // namespace
144 239
145 void CopyTextureCHROMIUMResourceManager::Initialize() { 240 void CopyTextureCHROMIUMResourceManager::Initialize() {
146 COMPILE_ASSERT( 241 COMPILE_ASSERT(
147 kVertexPositionAttrib == 0u || kVertexTextureAttrib == 0u, 242 kVertexPositionAttrib == 0u || kVertexTextureAttrib == 0u,
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 glDeleteBuffersARB(2, buffer_ids_); 309 glDeleteBuffersARB(2, buffer_ids_);
215 } 310 }
216 311
217 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( 312 void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
218 GLenum target, 313 GLenum target,
219 GLuint source_id, 314 GLuint source_id,
220 GLuint dest_id, 315 GLuint dest_id,
221 GLint level, 316 GLint level,
222 bool flip_y, 317 bool flip_y,
223 bool premultiply_alpha, 318 bool premultiply_alpha,
224 bool unpremultiply_alpha) { 319 bool unpremultiply_alpha,
320 bool is_source_external_oes) {
225 if (!initialized_) { 321 if (!initialized_) {
226 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; 322 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager.";
227 return; 323 return;
228 } 324 }
229 325
230 GLuint program = GetProgram(flip_y, premultiply_alpha, unpremultiply_alpha); 326 GLuint program = GetProgram(
327 flip_y, premultiply_alpha, unpremultiply_alpha, is_source_external_oes);
231 glUseProgram(programs_[program]); 328 glUseProgram(programs_[program]);
232 329
233 #ifndef NDEBUG 330 #ifndef NDEBUG
234 glValidateProgram(programs_[program]); 331 glValidateProgram(programs_[program]);
235 GLint validation_status; 332 GLint validation_status;
236 glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status); 333 glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status);
237 if (GL_TRUE != validation_status) { 334 if (GL_TRUE != validation_status) {
238 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; 335 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader.";
239 return; 336 return;
240 } 337 }
(...skipping 18 matching lines...) Expand all
259 glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE, 356 glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE,
260 4 * sizeof(GLfloat), 0); 357 4 * sizeof(GLfloat), 0);
261 358
262 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]); 359 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]);
263 glVertexAttribPointer(kVertexTextureAttrib, 2, GL_FLOAT, GL_FALSE, 360 glVertexAttribPointer(kVertexTextureAttrib, 2, GL_FLOAT, GL_FALSE,
264 2 * sizeof(GLfloat), 0); 361 2 * sizeof(GLfloat), 0);
265 362
266 glActiveTexture(GL_TEXTURE0); 363 glActiveTexture(GL_TEXTURE0);
267 glUniform1i(sampler_locations_[program], 0); 364 glUniform1i(sampler_locations_[program], 0);
268 365
269 glBindTexture(GL_TEXTURE_2D, source_id); 366 const GLenum source_target =
270 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 367 is_source_external_oes ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D;
271 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 368 glBindTexture(source_target, source_id);
272 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 369 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
273 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 370 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
371 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
372 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
274 373
275 glDisable(GL_DEPTH_TEST); 374 glDisable(GL_DEPTH_TEST);
276 glDisable(GL_SCISSOR_TEST); 375 glDisable(GL_SCISSOR_TEST);
277 glDisable(GL_STENCIL_TEST); 376 glDisable(GL_STENCIL_TEST);
278 glDisable(GL_CULL_FACE); 377 glDisable(GL_CULL_FACE);
279 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 378 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
280 glDepthMask(GL_FALSE); 379 glDepthMask(GL_FALSE);
281 glDisable(GL_BLEND); 380 glDisable(GL_BLEND);
282 381
283 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 382 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
284 } 383 }
285
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698