| OLD | NEW |
| 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 10 #include "gpu/command_buffer/service/gl_utils.h" | 11 #include "gpu/command_buffer/service/gl_utils.h" |
| 11 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 12 | 13 |
| 13 #define SHADER(src) \ | 14 #define SHADER(src) \ |
| 14 "#ifdef GL_ES\n" \ | 15 "#ifdef GL_ES\n" \ |
| 15 "precision mediump float;\n" \ | 16 "precision mediump float;\n" \ |
| 16 "#define TexCoordPrecision mediump\n" \ | 17 "#define TexCoordPrecision mediump\n" \ |
| 17 "#else\n" \ | 18 "#else\n" \ |
| 18 "#define TexCoordPrecision\n" \ | 19 "#define TexCoordPrecision\n" \ |
| 19 "#endif\n" #src | 20 "#endif\n" #src |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 GLuint source_id, | 356 GLuint source_id, |
| 356 GLenum source_internal_format, | 357 GLenum source_internal_format, |
| 357 GLuint dest_id, | 358 GLuint dest_id, |
| 358 GLenum dest_internal_format, | 359 GLenum dest_internal_format, |
| 359 GLsizei width, | 360 GLsizei width, |
| 360 GLsizei height, | 361 GLsizei height, |
| 361 bool flip_y, | 362 bool flip_y, |
| 362 bool premultiply_alpha, | 363 bool premultiply_alpha, |
| 363 bool unpremultiply_alpha) { | 364 bool unpremultiply_alpha) { |
| 364 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; | 365 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; |
| 366 uint32_t source_channels = gles2::GLES2Util::GetChannelsForFormat( |
| 367 source_internal_format); |
| 368 uint32_t dest_channels = gles2::GLES2Util::GetChannelsForFormat( |
| 369 dest_internal_format); |
| 365 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's | 370 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's |
| 366 // format does not contain a superset of the components required by the base | 371 // format does not contain a superset of the components required by the base |
| 367 // format of internalformat. | 372 // format of internalformat. |
| 368 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml | 373 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml |
| 369 bool source_format_contain_superset_of_dest_format = | 374 bool source_format_contain_superset_of_dest_format = |
| 370 (source_internal_format == dest_internal_format && | 375 (source_channels & dest_channels) == dest_channels; |
| 371 source_internal_format != GL_BGRA_EXT) || | 376 // Note: GL_TEXTURE_RECTANGLE_ARB is only available if supported on FBOs. |
| 372 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); | 377 bool valid_source_target = source_target == GL_TEXTURE_2D || |
| 373 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, | 378 source_target == GL_TEXTURE_RECTANGLE_ARB; |
| 374 // so restrict this to GL_TEXTURE_2D. | 379 bool valid_dest_internal_format = dest_internal_format == GL_ALPHA || |
| 375 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && | 380 dest_internal_format == GL_RGB || |
| 376 source_format_contain_superset_of_dest_format) { | 381 dest_internal_format == GL_RGBA; |
| 382 if (valid_source_target && !flip_y && !premultiply_alpha_change && |
| 383 source_format_contain_superset_of_dest_format && |
| 384 valid_dest_internal_format) { |
| 377 DoCopyTexImage2D(decoder, | 385 DoCopyTexImage2D(decoder, |
| 378 source_target, | 386 source_target, |
| 379 source_id, | 387 source_id, |
| 380 dest_id, | 388 dest_id, |
| 381 dest_internal_format, | 389 dest_internal_format, |
| 382 width, | 390 width, |
| 383 height, | 391 height, |
| 384 framebuffer_); | 392 framebuffer_); |
| 385 return; | 393 return; |
| 386 } | 394 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 405 GLsizei width, | 413 GLsizei width, |
| 406 GLsizei height, | 414 GLsizei height, |
| 407 GLsizei dest_width, | 415 GLsizei dest_width, |
| 408 GLsizei dest_height, | 416 GLsizei dest_height, |
| 409 GLsizei source_width, | 417 GLsizei source_width, |
| 410 GLsizei source_height, | 418 GLsizei source_height, |
| 411 bool flip_y, | 419 bool flip_y, |
| 412 bool premultiply_alpha, | 420 bool premultiply_alpha, |
| 413 bool unpremultiply_alpha) { | 421 bool unpremultiply_alpha) { |
| 414 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; | 422 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; |
| 423 uint32_t source_channels = gles2::GLES2Util::GetChannelsForFormat( |
| 424 source_internal_format); |
| 425 uint32_t dest_channels = gles2::GLES2Util::GetChannelsForFormat( |
| 426 dest_internal_format); |
| 415 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's | 427 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's |
| 416 // format does not contain a superset of the components required by the base | 428 // format does not contain a superset of the components required by the base |
| 417 // format of internalformat. | 429 // format of internalformat. |
| 418 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml | 430 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml |
| 419 bool source_format_contain_superset_of_dest_format = | 431 bool source_format_contain_superset_of_dest_format = |
| 420 (source_internal_format == dest_internal_format && | 432 (source_channels & dest_channels) == dest_channels; |
| 421 source_internal_format != GL_BGRA_EXT) || | 433 // Note: GL_TEXTURE_RECTANGLE_ARB is only available if supported on FBOs. |
| 422 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); | 434 bool valid_source_target = source_target == GL_TEXTURE_2D || |
| 423 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, | 435 source_target == GL_TEXTURE_RECTANGLE_ARB; |
| 424 // so restrict this to GL_TEXTURE_2D. | 436 bool valid_dest_internal_format = dest_internal_format == GL_ALPHA || |
| 425 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && | 437 dest_internal_format == GL_RGB || |
| 426 source_format_contain_superset_of_dest_format) { | 438 dest_internal_format == GL_RGBA; |
| 439 if (valid_source_target && !flip_y && !premultiply_alpha_change && |
| 440 source_format_contain_superset_of_dest_format && |
| 441 valid_dest_internal_format) { |
| 427 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_id, xoffset, | 442 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_id, xoffset, |
| 428 yoffset, x, y, width, height, framebuffer_); | 443 yoffset, x, y, width, height, framebuffer_); |
| 429 return; | 444 return; |
| 430 } | 445 } |
| 431 | 446 |
| 432 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, xoffset, | 447 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, xoffset, |
| 433 yoffset, x, y, width, height, dest_width, dest_height, | 448 yoffset, x, y, width, height, dest_width, dest_height, |
| 434 source_width, source_height, flip_y, premultiply_alpha, | 449 source_width, source_height, flip_y, premultiply_alpha, |
| 435 unpremultiply_alpha, kIdentityMatrix); | 450 unpremultiply_alpha, kIdentityMatrix); |
| 436 } | 451 } |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 592 decoder->RestoreTextureState(dest_id); | 607 decoder->RestoreTextureState(dest_id); |
| 593 decoder->RestoreTextureUnitBindings(0); | 608 decoder->RestoreTextureUnitBindings(0); |
| 594 decoder->RestoreActiveTexture(); | 609 decoder->RestoreActiveTexture(); |
| 595 decoder->RestoreProgramBindings(); | 610 decoder->RestoreProgramBindings(); |
| 596 decoder->RestoreBufferBindings(); | 611 decoder->RestoreBufferBindings(); |
| 597 decoder->RestoreFramebufferBindings(); | 612 decoder->RestoreFramebufferBindings(); |
| 598 decoder->RestoreGlobalState(); | 613 decoder->RestoreGlobalState(); |
| 599 } | 614 } |
| 600 | 615 |
| 601 } // namespace gpu | 616 } // namespace gpu |
| OLD | NEW |