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

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: adding android api version checking. 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 11
11 #define SHADER0(Src) \ 12 #define SHADER0(Src) \
12 "#ifdef GL_ES\n"\ 13 "#ifdef GL_ES\n"\
13 "precision mediump float;\n"\ 14 "precision mediump float;\n"\
14 "#endif\n"\ 15 "#endif\n"\
15 #Src 16 #Src
16 #define SHADER(Src) SHADER0(Src) 17 #define SHADER(Src) SHADER0(Src)
17 18
18 namespace { 19 namespace {
19 20
20 const GLfloat kQuadVertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, 21 const GLfloat kQuadVertices[] = { -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 -1.0f, 1.0f, 0.0f, 1.0f };
24 25
25 const GLfloat kTextureCoords[] = { 0.0f, 0.0f, 26 const GLfloat kTextureCoords[] = { 0.0f, 0.0f,
26 1.0f, 0.0f, 27 1.0f, 0.0f,
27 1.0f, 1.0f, 28 1.0f, 1.0f,
28 0.0f, 1.0f }; 29 0.0f, 1.0f };
29 30
30 const int kNumShaders = 7; 31 const int kNumShaders = 13;
31 enum ShaderId { 32 enum ShaderId {
32 VERTEX_SHADER_POS_TEX, 33 VERTEX_SHADER_POS_TEX,
33 FRAGMENT_SHADER_TEX, 34 FRAGMENT_SHADER_TEX,
34 FRAGMENT_SHADER_TEX_FLIP_Y, 35 FRAGMENT_SHADER_TEX_FLIP_Y,
35 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA, 36 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA,
36 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA, 37 FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA,
37 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y, 38 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y,
38 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
39 }; 46 };
40 47
41 enum ProgramId { 48 enum ProgramId {
42 PROGRAM_COPY_TEXTURE, 49 PROGRAM_COPY_TEXTURE,
43 PROGRAM_COPY_TEXTURE_FLIP_Y, 50 PROGRAM_COPY_TEXTURE_FLIP_Y,
44 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA, 51 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA,
45 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, 52 PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA,
46 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY, 53 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY,
47 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
48 }; 61 };
49 62
50 // Returns the correct program to evaluate the copy operation for 63 // Returns the correct program to evaluate the copy operation for
51 // the CHROMIUM_flipy and premultiply alpha pixel store settings. 64 // the CHROMIUM_flipy and premultiply alpha pixel store settings.
52 ProgramId GetProgram(bool flip_y, bool premultiply_alpha, 65 ProgramId GetProgram(bool flip_y, bool premultiply_alpha,
53 bool unpremultiply_alpha) { 66 bool unpremultiply_alpha, bool is_source_external_oes) {
54 // If both pre-multiply and unpremultiply are requested, then perform no 67 // If both pre-multiply and unpremultiply are requested, then perform no
55 // alpha manipulation. 68 // alpha manipulation.
56 if (premultiply_alpha && unpremultiply_alpha) { 69 if (premultiply_alpha && unpremultiply_alpha) {
57 premultiply_alpha = false; 70 premultiply_alpha = false;
58 unpremultiply_alpha = false; 71 unpremultiply_alpha = false;
59 } 72 }
60 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
61 if (flip_y && premultiply_alpha) 93 if (flip_y && premultiply_alpha)
62 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY; 94 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY;
63 95
64 if (flip_y && unpremultiply_alpha) 96 if (flip_y && unpremultiply_alpha)
65 return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY; 97 return PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY;
66 98
67 if (flip_y) 99 if (flip_y)
68 return PROGRAM_COPY_TEXTURE_FLIP_Y; 100 return PROGRAM_COPY_TEXTURE_FLIP_Y;
69 101
70 if (premultiply_alpha) 102 if (premultiply_alpha)
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 }); 160 });
129 case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y: 161 case FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y:
130 return SHADER( 162 return SHADER(
131 uniform sampler2D u_texSampler; 163 uniform sampler2D u_texSampler;
132 varying vec2 v_uv; 164 varying vec2 v_uv;
133 void main(void) { 165 void main(void) {
134 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));
135 if (gl_FragColor.a > 0.0) 167 if (gl_FragColor.a > 0.0)
136 gl_FragColor.rgb /= gl_FragColor.a; 168 gl_FragColor.rgb /= gl_FragColor.a;
137 }); 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";
138 default: 234 default:
139 return 0; 235 return 0;
140 } 236 }
141 } 237 }
142 238
143 } // namespace 239 } // namespace
144 240
241 namespace gpu {
242
145 void CopyTextureCHROMIUMResourceManager::Initialize() { 243 void CopyTextureCHROMIUMResourceManager::Initialize() {
146 COMPILE_ASSERT( 244 COMPILE_ASSERT(
147 kVertexPositionAttrib == 0u || kVertexTextureAttrib == 0u, 245 kVertexPositionAttrib == 0u || kVertexTextureAttrib == 0u,
148 CopyTexture_One_of_these_attribs_must_be_0); 246 CopyTexture_One_of_these_attribs_must_be_0);
149 247
150 // Initialize all of the GPU resources required to perform the copy. 248 // Initialize all of the GPU resources required to perform the copy.
151 glGenBuffersARB(2, buffer_ids_); 249 glGenBuffersARB(2, buffer_ids_);
152 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]); 250 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]);
153 glBufferData(GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, 251 glBufferData(GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices,
154 GL_STATIC_DRAW); 252 GL_STATIC_DRAW);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 306
209 glDeleteFramebuffersEXT(1, &framebuffer_); 307 glDeleteFramebuffersEXT(1, &framebuffer_);
210 308
211 for (int program = 0; program < kNumPrograms; ++program) 309 for (int program = 0; program < kNumPrograms; ++program)
212 glDeleteProgram(programs_[program]); 310 glDeleteProgram(programs_[program]);
213 311
214 glDeleteBuffersARB(2, buffer_ids_); 312 glDeleteBuffersARB(2, buffer_ids_);
215 } 313 }
216 314
217 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( 315 void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
218 GLenum target, 316 const gles2::GLES2Decoder* decoder,
317 GLenum source_target,
318 GLenum dest_target,
219 GLuint source_id, 319 GLuint source_id,
220 GLuint dest_id, 320 GLuint dest_id,
221 GLint level, 321 GLint level,
322 GLsizei width,
323 GLsizei height,
222 bool flip_y, 324 bool flip_y,
223 bool premultiply_alpha, 325 bool premultiply_alpha,
224 bool unpremultiply_alpha) { 326 bool unpremultiply_alpha) {
327 DCHECK(source_target == GL_TEXTURE_2D ||
328 source_target == GL_TEXTURE_EXTERNAL_OES);
225 if (!initialized_) { 329 if (!initialized_) {
226 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; 330 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager.";
227 return; 331 return;
228 } 332 }
229 333
230 GLuint program = GetProgram(flip_y, premultiply_alpha, unpremultiply_alpha); 334 GLuint program = GetProgram(
335 flip_y, premultiply_alpha, unpremultiply_alpha,
336 source_target == GL_TEXTURE_EXTERNAL_OES);
231 glUseProgram(programs_[program]); 337 glUseProgram(programs_[program]);
232 338
233 #ifndef NDEBUG 339 #ifndef NDEBUG
234 glValidateProgram(programs_[program]); 340 glValidateProgram(programs_[program]);
235 GLint validation_status; 341 GLint validation_status;
236 glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status); 342 glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status);
237 if (GL_TRUE != validation_status) { 343 if (GL_TRUE != validation_status) {
238 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; 344 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader.";
239 return; 345 return;
240 } 346 }
241 #endif 347 #endif
242 348
349 glActiveTexture(GL_TEXTURE0);
350 glBindTexture(GL_TEXTURE_2D, dest_id);
351 // NVidia drivers require texture settings to be a certain way
352 // or they won't report FRAMEBUFFER_COMPLETE.
353 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
354 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
355 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
356 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
243 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer_); 357 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer_);
244 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, 358 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, dest_target,
245 dest_id, level); 359 dest_id, level);
246 360
247 #ifndef NDEBUG 361 #ifndef NDEBUG
248 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); 362 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
249 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { 363 if (GL_FRAMEBUFFER_COMPLETE != fb_status) {
250 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; 364 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer.";
251 return; 365 } else
366 #endif
367 {
368 glEnableVertexAttribArray(kVertexPositionAttrib);
369 glEnableVertexAttribArray(kVertexTextureAttrib);
370
371 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]);
372 glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE,
373 4 * sizeof(GLfloat), 0);
374
375 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]);
376 glVertexAttribPointer(kVertexTextureAttrib, 2, GL_FLOAT, GL_FALSE,
377 2 * sizeof(GLfloat), 0);
378
379 glUniform1i(sampler_locations_[program], 0);
380
381 glBindTexture(source_target, source_id);
382 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
383 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
384 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
385 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
386
387 glDisable(GL_DEPTH_TEST);
388 glDisable(GL_SCISSOR_TEST);
389 glDisable(GL_STENCIL_TEST);
390 glDisable(GL_CULL_FACE);
391 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
392 glDepthMask(GL_FALSE);
393 glDisable(GL_BLEND);
394
395 glViewport(0, 0, width, height);
396 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
252 } 397 }
253 #endif
254 398
255 glEnableVertexAttribArray(kVertexPositionAttrib); 399 decoder->RestoreAttribute(kVertexTextureAttrib);
256 glEnableVertexAttribArray(kVertexTextureAttrib); 400 decoder->RestoreAttribute(kVertexPositionAttrib);
257 401 decoder->RestoreTextureUnitBindings(0);
258 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]); 402 decoder->RestoreTextureState(source_id);
259 glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE, 403 decoder->RestoreTextureState(dest_id);
260 4 * sizeof(GLfloat), 0); 404 decoder->RestoreActiveTexture();
261 405 decoder->RestoreProgramBindings();
262 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]); 406 decoder->RestoreBufferBindings();
263 glVertexAttribPointer(kVertexTextureAttrib, 2, GL_FLOAT, GL_FALSE, 407 decoder->RestoreFramebufferBindings();
264 2 * sizeof(GLfloat), 0); 408 decoder->RestoreGlobalState();
265
266 glActiveTexture(GL_TEXTURE0);
267 glUniform1i(sampler_locations_[program], 0);
268
269 glBindTexture(GL_TEXTURE_2D, source_id);
270 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
271 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
272 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
273 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
274
275 glDisable(GL_DEPTH_TEST);
276 glDisable(GL_SCISSOR_TEST);
277 glDisable(GL_STENCIL_TEST);
278 glDisable(GL_CULL_FACE);
279 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
280 glDepthMask(GL_FALSE);
281 glDisable(GL_BLEND);
282
283 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
284 } 409 }
285 410
411 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698