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

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

Issue 2479513002: Reland of Extend CopyTextureCHROMIUM to more ES 3.0 texture formats. (Closed)
Patch Set: fix windows and mac bot Created 4 years, 1 month 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 <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 #ifndef NDEBUG 252 #ifndef NDEBUG
253 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); 253 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
254 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { 254 if (GL_FRAMEBUFFER_COMPLETE != fb_status) {
255 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; 255 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer.";
256 return false; 256 return false;
257 } 257 }
258 #endif 258 #endif
259 return true; 259 return true;
260 } 260 }
261 261
262 void DoCopyTexImage2D(const gpu::gles2::GLES2Decoder* decoder, 262 void DoCopyTexImage2DInternal(const gpu::gles2::GLES2Decoder* decoder,
263 GLenum source_target, 263 GLenum source_target,
264 GLuint source_id, 264 GLuint source_id,
265 GLenum dest_target, 265 GLenum dest_target,
266 GLuint dest_id, 266 GLuint dest_id,
267 GLenum dest_internal_format, 267 GLenum dest_internal_format,
268 GLsizei width, 268 GLsizei width,
269 GLsizei height, 269 GLsizei height,
270 GLuint framebuffer) { 270 GLuint framebuffer) {
271 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), source_target); 271 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), source_target);
272 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), dest_target); 272 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), dest_target);
273 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) { 273 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) {
274 glBindTexture(dest_target, dest_id); 274 glBindTexture(dest_target, dest_id);
275 glTexParameterf(dest_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 275 glTexParameterf(dest_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
276 glTexParameterf(dest_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 276 glTexParameterf(dest_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
277 glTexParameteri(dest_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 277 glTexParameteri(dest_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
278 glTexParameteri(dest_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 278 glTexParameteri(dest_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
279 glCopyTexImage2D(dest_target, 0 /* level */, dest_internal_format, 279 glCopyTexImage2D(dest_target, 0 /* level */, dest_internal_format,
280 0 /* x */, 0 /* y */, width, height, 0 /* border */); 280 0 /* x */, 0 /* y */, width, height, 0 /* border */);
281 } 281 }
282 282
283 decoder->RestoreTextureState(source_id); 283 decoder->RestoreTextureState(source_id);
284 decoder->RestoreTextureState(dest_id); 284 decoder->RestoreTextureState(dest_id);
285 decoder->RestoreTextureUnitBindings(0); 285 decoder->RestoreTextureUnitBindings(0);
286 decoder->RestoreActiveTexture(); 286 decoder->RestoreActiveTexture();
287 decoder->RestoreFramebufferBindings(); 287 decoder->RestoreFramebufferBindings();
288 } 288 }
289 289
290 void DoCopyTexSubImage2D(const gpu::gles2::GLES2Decoder* decoder, 290 void DoCopyTexSubImage2DInternal(const gpu::gles2::GLES2Decoder* decoder,
291 GLenum source_target, 291 GLenum source_target,
292 GLuint source_id, 292 GLuint source_id,
293 GLenum dest_target, 293 GLenum dest_target,
294 GLuint dest_id, 294 GLuint dest_id,
295 GLint xoffset, 295 GLint xoffset,
296 GLint yoffset, 296 GLint yoffset,
297 GLint source_x, 297 GLint source_x,
298 GLint source_y, 298 GLint source_y,
299 GLsizei source_width, 299 GLsizei source_width,
300 GLsizei source_height, 300 GLsizei source_height,
301 GLuint framebuffer) { 301 GLuint framebuffer) {
302 DCHECK(source_target == GL_TEXTURE_2D || 302 DCHECK(source_target == GL_TEXTURE_2D ||
303 source_target == GL_TEXTURE_RECTANGLE_ARB); 303 source_target == GL_TEXTURE_RECTANGLE_ARB);
304 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), dest_target); 304 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), dest_target);
305 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) { 305 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) {
306 glBindTexture(dest_target, dest_id); 306 glBindTexture(dest_target, dest_id);
307 glTexParameterf(dest_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 307 glTexParameterf(dest_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
308 glTexParameterf(dest_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 308 glTexParameterf(dest_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
309 glTexParameteri(dest_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 309 glTexParameteri(dest_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
310 glTexParameteri(dest_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 310 glTexParameteri(dest_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
311 glCopyTexSubImage2D(dest_target, 0 /* level */, xoffset, yoffset, 311 glCopyTexSubImage2D(dest_target, 0 /* level */, xoffset, yoffset,
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml 427 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml
428 bool source_format_contain_superset_of_dest_format = 428 bool source_format_contain_superset_of_dest_format =
429 (source_internal_format == dest_internal_format && 429 (source_internal_format == dest_internal_format &&
430 source_internal_format != GL_BGRA_EXT) || 430 source_internal_format != GL_BGRA_EXT) ||
431 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); 431 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
432 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, 432 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
433 // so restrict this to GL_TEXTURE_2D. 433 // so restrict this to GL_TEXTURE_2D.
434 if (source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D && 434 if (source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D &&
435 !flip_y && !premultiply_alpha_change && 435 !flip_y && !premultiply_alpha_change &&
436 source_format_contain_superset_of_dest_format) { 436 source_format_contain_superset_of_dest_format) {
437 DoCopyTexImage2D(decoder, 437 DoCopyTexImage2DInternal(decoder,
438 source_target, 438 source_target,
439 source_id, 439 source_id,
440 dest_target, 440 dest_target,
441 dest_id, 441 dest_id,
442 dest_internal_format, 442 dest_internal_format,
443 width, 443 width,
444 height, 444 height,
445 framebuffer_); 445 framebuffer_);
446 return; 446 return;
447 } 447 }
448 448
449 // Use kIdentityMatrix if no transform passed in. 449 // Use kIdentityMatrix if no transform passed in.
450 DoCopyTextureWithTransform(decoder, source_target, source_id, dest_target, 450 DoCopyTextureWithTransform(decoder, source_target, source_id, dest_target,
451 dest_id, width, height, flip_y, premultiply_alpha, 451 dest_id, width, height, flip_y, premultiply_alpha,
452 unpremultiply_alpha, kIdentityMatrix); 452 unpremultiply_alpha, kIdentityMatrix);
453 } 453 }
454 454
455 void CopyTextureCHROMIUMResourceManager::DoCopyTexImage2D(
456 const gpu::gles2::GLES2Decoder* decoder,
457 GLenum source_target,
458 GLuint source_id,
459 GLenum dest_target,
460 GLuint dest_id,
461 GLenum dest_internal_format,
462 GLsizei width,
463 GLsizei height) {
464 DoCopyTexImage2DInternal(decoder,
465 source_target,
466 source_id,
467 dest_target,
468 dest_id,
469 dest_internal_format,
470 width,
471 height,
472 framebuffer_);
473 return;
474 }
475
455 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( 476 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture(
456 const gles2::GLES2Decoder* decoder, 477 const gles2::GLES2Decoder* decoder,
457 GLenum source_target, 478 GLenum source_target,
458 GLuint source_id, 479 GLuint source_id,
459 GLenum source_internal_format, 480 GLenum source_internal_format,
460 GLenum dest_target, 481 GLenum dest_target,
461 GLuint dest_id, 482 GLuint dest_id,
462 GLenum dest_internal_format, 483 GLenum dest_internal_format,
463 GLint xoffset, 484 GLint xoffset,
464 GLint yoffset, 485 GLint yoffset,
(...skipping 23 matching lines...) Expand all
488 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml 509 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml
489 bool source_format_contain_superset_of_dest_format = 510 bool source_format_contain_superset_of_dest_format =
490 (source_internal_format == dest_internal_format && 511 (source_internal_format == dest_internal_format &&
491 source_internal_format != GL_BGRA_EXT) || 512 source_internal_format != GL_BGRA_EXT) ||
492 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); 513 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
493 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, 514 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
494 // so restrict this to GL_TEXTURE_2D. 515 // so restrict this to GL_TEXTURE_2D.
495 if (use_gl_copy_tex_sub_image_2d && source_target == GL_TEXTURE_2D && 516 if (use_gl_copy_tex_sub_image_2d && source_target == GL_TEXTURE_2D &&
496 dest_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && 517 dest_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change &&
497 source_format_contain_superset_of_dest_format) { 518 source_format_contain_superset_of_dest_format) {
498 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_target, dest_id, 519 DoCopyTexSubImage2DInternal(decoder, source_target, source_id, dest_target,
499 xoffset, yoffset, x, y, width, height, framebuffer_); 520 dest_id, xoffset, yoffset, x, y, width, height,
521 framebuffer_);
500 return; 522 return;
501 } 523 }
502 524
503 DoCopySubTextureWithTransform( 525 DoCopySubTextureWithTransform(
504 decoder, source_target, source_id, source_internal_format, dest_target, 526 decoder, source_target, source_id, source_internal_format, dest_target,
505 dest_id, dest_internal_format, xoffset, yoffset, x, y, width, height, 527 dest_id, dest_internal_format, xoffset, yoffset, x, y, width, height,
506 dest_width, dest_height, source_width, source_height, flip_y, 528 dest_width, dest_height, source_width, source_height, flip_y,
507 premultiply_alpha, unpremultiply_alpha, kIdentityMatrix); 529 premultiply_alpha, unpremultiply_alpha, kIdentityMatrix);
508 } 530 }
509 531
532 void CopyTextureCHROMIUMResourceManager::DoCopyTexSubImage2D(
533 const gpu::gles2::GLES2Decoder* decoder,
534 GLenum source_target,
535 GLuint source_id,
536 GLenum dest_target,
537 GLuint dest_id,
538 GLint xoffset,
539 GLint yoffset,
540 GLint x,
541 GLint y,
542 GLsizei width,
543 GLsizei height) {
544 DoCopyTexSubImage2DInternal(decoder, source_target, source_id, dest_target,
545 dest_id, xoffset, yoffset, x, y, width, height,
546 framebuffer_);
547 }
548
510 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform( 549 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform(
511 const gles2::GLES2Decoder* decoder, 550 const gles2::GLES2Decoder* decoder,
512 GLenum source_target, 551 GLenum source_target,
513 GLuint source_id, 552 GLuint source_id,
514 GLenum source_internal_format, 553 GLenum source_internal_format,
515 GLenum dest_target, 554 GLenum dest_target,
516 GLuint dest_id, 555 GLuint dest_id,
517 GLenum dest_internal_format, 556 GLenum dest_internal_format,
518 GLint xoffset, 557 GLint xoffset,
519 GLint yoffset, 558 GLint yoffset,
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 decoder->RestoreTextureUnitBindings(0); 810 decoder->RestoreTextureUnitBindings(0);
772 decoder->RestoreActiveTexture(); 811 decoder->RestoreActiveTexture();
773 decoder->RestoreProgramBindings(); 812 decoder->RestoreProgramBindings();
774 decoder->RestoreBufferBindings(); 813 decoder->RestoreBufferBindings();
775 decoder->RestoreFramebufferBindings(); 814 decoder->RestoreFramebufferBindings();
776 decoder->RestoreGlobalState(); 815 decoder->RestoreGlobalState();
777 } 816 }
778 817
779 } // namespace gles2 818 } // namespace gles2
780 } // namespace gpu 819 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698