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

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: fixing android_clang build error. Created 7 years, 9 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 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
(...skipping 10 matching lines...) Expand all
21 const GLfloat kQuadVertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, 21 const GLfloat kQuadVertices[] = { -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 -1.0f, 1.0f, 0.0f, 1.0f }; 24 -1.0f, 1.0f, 0.0f, 1.0f };
25 25
26 const GLfloat kTextureCoords[] = { 0.0f, 0.0f, 26 const GLfloat kTextureCoords[] = { 0.0f, 0.0f,
27 1.0f, 0.0f, 27 1.0f, 0.0f,
28 1.0f, 1.0f, 28 1.0f, 1.0f,
29 0.0f, 1.0f }; 29 0.0f, 1.0f };
30 30
31 const int kNumShaders = 7; 31 const int kNumShaders = 13;
32 enum ShaderId { 32 enum ShaderId {
33 VERTEX_SHADER_POS_TEX, 33 VERTEX_SHADER_POS_TEX,
34 FRAGMENT_SHADER_TEX, 34 FRAGMENT_SHADER_TEX,
35 FRAGMENT_SHADER_TEX_FLIP_Y, 35 FRAGMENT_SHADER_TEX_FLIP_Y,
36 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA, 36 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA,
37 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA, 37 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA,
38 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y, 38 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y,
39 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y 39 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y,
40 FRAGMENT_SHADER_TEX_OES,
41 FRAGMENT_SHADER_TEX_OES_FLIP_Y,
42 FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA,
43 FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA,
44 FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA_FLIP_Y,
45 FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA_FLIP_Y
40 }; 46 };
41 47
42 enum ProgramId { 48 enum ProgramId {
43 PROGRAM_COPY_TEXTURE, 49 PROGRAM_COPY_TEXTURE,
44 PROGRAM_COPY_TEXTURE_FLIP_Y, 50 PROGRAM_COPY_TEXTURE_FLIP_Y,
45 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA, 51 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA,
46 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, 52 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA,
47 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY, 53 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY,
48 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY 54 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY,
55 PROGRAM_COPY_TEXTURE_OES,
56 PROGRAM_COPY_TEXTURE_OES_FLIP_Y,
57 PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA,
58 PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA,
59 PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA_FLIPY,
60 PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA_FLIPY
49 }; 61 };
50 62
51 // Returns the correct program to evaluate the copy operation for 63 // Returns the correct program to evaluate the copy operation for
52 // the CHROMIUM_flipy and premultiply alpha pixel store settings. 64 // the CHROMIUM_flipy and premultiply alpha pixel store settings.
53 ProgramId GetProgram(bool flip_y, bool premultiply_alpha, 65 ProgramId GetProgram(bool flip_y, bool premultiply_alpha,
54 bool unpremultiply_alpha) { 66 bool unpremultiply_alpha, bool is_source_external_oes) {
55 // If both pre-multiply and unpremultiply are requested, then perform no 67 // If both pre-multiply and unpremultiply are requested, then perform no
56 // alpha manipulation. 68 // alpha manipulation.
57 if (premultiply_alpha && unpremultiply_alpha) { 69 if (premultiply_alpha && unpremultiply_alpha) {
58 premultiply_alpha = false; 70 premultiply_alpha = false;
59 unpremultiply_alpha = false; 71 unpremultiply_alpha = false;
60 } 72 }
61 73
74 if (is_source_external_oes) {
75 if (flip_y && premultiply_alpha)
76 return PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA_FLIPY;
77
78 if (flip_y && unpremultiply_alpha)
79 return PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA_FLIPY;
80
81 if (flip_y)
82 return PROGRAM_COPY_TEXTURE_OES_FLIP_Y;
83
84 if (premultiply_alpha)
85 return PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA;
86
87 if (unpremultiply_alpha)
88 return PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA;
89
90 return PROGRAM_COPY_TEXTURE_OES;
91 }
92
62 if (flip_y && premultiply_alpha) 93 if (flip_y && premultiply_alpha)
63 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY; 94 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY;
64 95
65 if (flip_y && unpremultiply_alpha) 96 if (flip_y && unpremultiply_alpha)
66 return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY; 97 return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY;
67 98
68 if (flip_y) 99 if (flip_y)
69 return PROGRAM_COPY_TEXTURE_FLIP_Y; 100 return PROGRAM_COPY_TEXTURE_FLIP_Y;
70 101
71 if (premultiply_alpha) 102 if (premultiply_alpha)
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 }); 160 });
130 case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y: 161 case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y:
131 return SHADER( 162 return SHADER(
132 uniform sampler2D u_texSampler; 163 uniform sampler2D u_texSampler;
133 varying vec2 v_uv; 164 varying vec2 v_uv;
134 void main(void) { 165 void main(void) {
135 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); 166 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));
136 if (gl_FragColor.a > 0.0) 167 if (gl_FragColor.a > 0.0)
137 gl_FragColor.rgb /= gl_FragColor.a; 168 gl_FragColor.rgb /= gl_FragColor.a;
138 }); 169 });
170 case FRAGMENT_SHADER_TEX_OES:
171 // Cannot use the SHADER() macro because of the '#' char
172 return
173 "#extension GL_OES_EGL_image_external : require\n"
174 "precision mediump float;\n"
175 "uniform samplerExternalOES u_texSampler;\n"
176 "varying vec2 v_uv;\n"
177 "void main(void) {\n"
178 " gl_FragColor = texture2D(u_texSampler, v_uv.st);\n"
179 "}\n";
180 case FRAGMENT_SHADER_TEX_OES_FLIP_Y:
181 return
182 "#extension GL_OES_EGL_image_external : require\n"
183 "precision mediump float;\n"
184 "uniform samplerExternalOES u_texSampler;\n"
185 "varying vec2 v_uv;\n"
186 "void main(void) {\n"
187 " gl_FragColor =\n"
188 " texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));\n"
189 "}\n";
190 case FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA:
191 return
192 "#extension GL_OES_EGL_image_external : require\n"
193 "precision mediump float;\n"
194 "uniform samplerExternalOES u_texSampler;\n"
195 "varying vec2 v_uv;\n"
196 "void main(void) {\n"
197 " gl_FragColor = texture2D(u_texSampler, v_uv.st);\n"
198 " gl_FragColor.rgb *= gl_FragColor.a;\n"
199 "}\n";
200 case FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA:
201 return
202 "#extension GL_OES_EGL_image_external : require\n"
203 "precision mediump float;\n"
204 "uniform samplerExternalOES u_texSampler;\n"
205 "varying vec2 v_uv;\n"
206 "void main(void) {\n"
207 " gl_FragColor = texture2D(u_texSampler, v_uv.st);\n"
208 " if (gl_FragColor.a > 0.0)\n"
209 " gl_FragColor.rgb /= gl_FragColor.a;\n"
210 "}\n";
211 case FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA_FLIP_Y:
212 return
213 "#extension GL_OES_EGL_image_external : require\n"
214 "precision mediump float;\n"
215 "uniform samplerExternalOES u_texSampler;\n"
216 "varying vec2 v_uv;\n"
217 "void main(void) {\n"
218 " gl_FragColor =\n"
219 " texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));\n"
220 " gl_FragColor.rgb *= gl_FragColor.a;\n"
221 "}\n";
222 case FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA_FLIP_Y:
223 return
224 "#extension GL_OES_EGL_image_external : require\n"
225 "precision mediump float;\n"
226 "uniform samplerExternalOES u_texSampler;\n"
227 "varying vec2 v_uv;\n"
228 "void main(void) {\n"
229 " gl_FragColor =\n"
230 " texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));\n"
231 " if (gl_FragColor.a > 0.0)\n"
232 " gl_FragColor.rgb /= gl_FragColor.a;\n"
233 "}\n";
139 default: 234 default:
140 return 0; 235 return 0;
141 } 236 }
142 } 237 }
143 238
144 } // namespace 239 } // namespace
145 240
146 namespace gpu { 241 namespace gpu {
147 242
148 void CopyTextureCHROMIUMResourceManager::Initialize( 243 void CopyTextureCHROMIUMResourceManager::Initialize(
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 glDeleteFramebuffersEXT(1, &framebuffer_); 312 glDeleteFramebuffersEXT(1, &framebuffer_);
218 313
219 for (int program = 0; program < kNumPrograms; ++program) 314 for (int program = 0; program < kNumPrograms; ++program)
220 glDeleteProgram(programs_[program]); 315 glDeleteProgram(programs_[program]);
221 316
222 glDeleteBuffersARB(2, buffer_ids_); 317 glDeleteBuffersARB(2, buffer_ids_);
223 } 318 }
224 319
225 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( 320 void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
226 const gles2::GLES2Decoder* decoder, 321 const gles2::GLES2Decoder* decoder,
227 GLenum target, 322 GLenum source_target,
323 GLenum dest_target,
228 GLuint source_id, 324 GLuint source_id,
229 GLuint dest_id, 325 GLuint dest_id,
230 GLint level, 326 GLint level,
231 GLsizei width, 327 GLsizei width,
232 GLsizei height, 328 GLsizei height,
233 bool flip_y, 329 bool flip_y,
234 bool premultiply_alpha, 330 bool premultiply_alpha,
235 bool unpremultiply_alpha) { 331 bool unpremultiply_alpha) {
332 DCHECK(source_target == GL_TEXTURE_2D ||
333 source_target == GL_TEXTURE_EXTERNAL_OES);
236 if (!initialized_) { 334 if (!initialized_) {
237 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; 335 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager.";
238 return; 336 return;
239 } 337 }
240 338
241 GLuint program = GetProgram(flip_y, premultiply_alpha, unpremultiply_alpha); 339 GLuint program = GetProgram(
340 flip_y, premultiply_alpha, unpremultiply_alpha,
341 source_target == GL_TEXTURE_EXTERNAL_OES);
242 glUseProgram(programs_[program]); 342 glUseProgram(programs_[program]);
243 343
244 #ifndef NDEBUG 344 #ifndef NDEBUG
245 glValidateProgram(programs_[program]); 345 glValidateProgram(programs_[program]);
246 GLint validation_status; 346 GLint validation_status;
247 glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status); 347 glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status);
248 if (GL_TRUE != validation_status) { 348 if (GL_TRUE != validation_status) {
249 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; 349 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader.";
250 return; 350 return;
251 } 351 }
252 #endif 352 #endif
253 353
254 glActiveTexture(GL_TEXTURE0); 354 glActiveTexture(GL_TEXTURE0);
255 glBindTexture(GL_TEXTURE_2D, dest_id); 355 glBindTexture(GL_TEXTURE_2D, dest_id);
256 // NVidia drivers require texture settings to be a certain way 356 // NVidia drivers require texture settings to be a certain way
257 // or they won't report FRAMEBUFFER_COMPLETE. 357 // or they won't report FRAMEBUFFER_COMPLETE.
258 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 358 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
259 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 359 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
260 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 360 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
261 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 361 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
262 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer_); 362 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer_);
263 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, 363 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, dest_target,
264 dest_id, level); 364 dest_id, level);
265 365
266 #ifndef NDEBUG 366 #ifndef NDEBUG
267 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); 367 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
268 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { 368 if (GL_FRAMEBUFFER_COMPLETE != fb_status) {
269 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; 369 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer.";
270 } else 370 } else
271 #endif 371 #endif
272 { 372 {
273 glEnableVertexAttribArray(kVertexPositionAttrib); 373 glEnableVertexAttribArray(kVertexPositionAttrib);
274 glEnableVertexAttribArray(kVertexTextureAttrib); 374 glEnableVertexAttribArray(kVertexTextureAttrib);
275 375
276 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]); 376 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]);
277 glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE, 377 glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE,
278 4 * sizeof(GLfloat), 0); 378 4 * sizeof(GLfloat), 0);
279 379
280 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]); 380 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]);
281 glVertexAttribPointer(kVertexTextureAttrib, 2, GL_FLOAT, GL_FALSE, 381 glVertexAttribPointer(kVertexTextureAttrib, 2, GL_FLOAT, GL_FALSE,
282 2 * sizeof(GLfloat), 0); 382 2 * sizeof(GLfloat), 0);
283 383
284 glUniform1i(sampler_locations_[program], 0); 384 glUniform1i(sampler_locations_[program], 0);
285 385
286 glBindTexture(GL_TEXTURE_2D, source_id); 386 glBindTexture(source_target, source_id);
287 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 387 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
288 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 388 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
289 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 389 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
290 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 390 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
291 391
292 glDisable(GL_DEPTH_TEST); 392 glDisable(GL_DEPTH_TEST);
293 glDisable(GL_SCISSOR_TEST); 393 glDisable(GL_SCISSOR_TEST);
294 glDisable(GL_STENCIL_TEST); 394 glDisable(GL_STENCIL_TEST);
295 glDisable(GL_CULL_FACE); 395 glDisable(GL_CULL_FACE);
296 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 396 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
297 glDepthMask(GL_FALSE); 397 glDepthMask(GL_FALSE);
298 glDisable(GL_BLEND); 398 glDisable(GL_BLEND);
299 399
300 glViewport(0, 0, width, height); 400 glViewport(0, 0, width, height);
301 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 401 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
302 } 402 }
303 403
304 decoder->RestoreAttribute(kVertexTextureAttrib); 404 decoder->RestoreAttribute(kVertexTextureAttrib);
305 decoder->RestoreAttribute(kVertexPositionAttrib); 405 decoder->RestoreAttribute(kVertexPositionAttrib);
306 decoder->RestoreTextureUnitBindings(0); 406 decoder->RestoreTextureUnitBindings(0);
307 decoder->RestoreTextureState(source_id); 407 decoder->RestoreTextureState(source_id);
308 decoder->RestoreTextureState(dest_id); 408 decoder->RestoreTextureState(dest_id);
309 decoder->RestoreActiveTexture(); 409 decoder->RestoreActiveTexture();
310 decoder->RestoreProgramBindings(); 410 decoder->RestoreProgramBindings();
311 decoder->RestoreBufferBindings(); 411 decoder->RestoreBufferBindings();
312 decoder->RestoreFramebufferBindings(); 412 decoder->RestoreFramebufferBindings();
313 decoder->RestoreGlobalState(); 413 decoder->RestoreGlobalState();
314 } 414 }
315 415
316 } // namespace 416 } // namespace
317 417
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698