| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 GLuint source_id, | 544 GLuint source_id, |
| 545 GLint source_level, | 545 GLint source_level, |
| 546 GLenum dest_target, | 546 GLenum dest_target, |
| 547 GLuint dest_id, | 547 GLuint dest_id, |
| 548 GLint dest_level, | 548 GLint dest_level, |
| 549 GLenum dest_internal_format, | 549 GLenum dest_internal_format, |
| 550 GLsizei width, | 550 GLsizei width, |
| 551 GLsizei height, | 551 GLsizei height, |
| 552 GLuint framebuffer) { | 552 GLuint framebuffer) { |
| 553 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), source_target); | 553 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), source_target); |
| 554 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), dest_target); | 554 GLenum dest_binding_target = |
| 555 gpu::gles2::GLES2Util::GLFaceTargetToTextureTarget(dest_target); |
| 556 DCHECK(dest_binding_target == GL_TEXTURE_2D || |
| 557 dest_binding_target == GL_TEXTURE_CUBE_MAP); |
| 555 DCHECK(source_level == 0 || decoder->GetFeatureInfo()->IsES3Capable()); | 558 DCHECK(source_level == 0 || decoder->GetFeatureInfo()->IsES3Capable()); |
| 556 if (BindFramebufferTexture2D(source_target, source_id, source_level, | 559 if (BindFramebufferTexture2D(source_target, source_id, source_level, |
| 557 framebuffer)) { | 560 framebuffer)) { |
| 558 glBindTexture(dest_target, dest_id); | 561 glBindTexture(dest_binding_target, dest_id); |
| 559 glTexParameterf(dest_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 562 glTexParameterf(dest_binding_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 560 glTexParameterf(dest_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 563 glTexParameterf(dest_binding_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 561 glTexParameteri(dest_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 564 glTexParameteri(dest_binding_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 562 glTexParameteri(dest_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 565 glTexParameteri(dest_binding_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 563 glCopyTexImage2D(dest_target, dest_level, dest_internal_format, 0 /* x */, | 566 glCopyTexImage2D(dest_target, dest_level, dest_internal_format, 0 /* x */, |
| 564 0 /* y */, width, height, 0 /* border */); | 567 0 /* y */, width, height, 0 /* border */); |
| 565 } | 568 } |
| 566 | 569 |
| 567 decoder->RestoreTextureState(source_id); | 570 decoder->RestoreTextureState(source_id); |
| 568 decoder->RestoreTextureState(dest_id); | 571 decoder->RestoreTextureState(dest_id); |
| 569 decoder->RestoreTextureUnitBindings(0); | 572 decoder->RestoreTextureUnitBindings(0); |
| 570 decoder->RestoreActiveTexture(); | 573 decoder->RestoreActiveTexture(); |
| 571 decoder->RestoreFramebufferBindings(); | 574 decoder->RestoreFramebufferBindings(); |
| 572 } | 575 } |
| 573 | 576 |
| 574 void DoCopyTexSubImage2D(const gpu::gles2::GLES2Decoder* decoder, | 577 void DoCopyTexSubImage2D(const gpu::gles2::GLES2Decoder* decoder, |
| 575 GLenum source_target, | 578 GLenum source_target, |
| 576 GLuint source_id, | 579 GLuint source_id, |
| 577 GLint source_level, | 580 GLint source_level, |
| 578 GLenum dest_target, | 581 GLenum dest_target, |
| 579 GLuint dest_id, | 582 GLuint dest_id, |
| 580 GLint dest_level, | 583 GLint dest_level, |
| 581 GLint xoffset, | 584 GLint xoffset, |
| 582 GLint yoffset, | 585 GLint yoffset, |
| 583 GLint source_x, | 586 GLint source_x, |
| 584 GLint source_y, | 587 GLint source_y, |
| 585 GLsizei source_width, | 588 GLsizei source_width, |
| 586 GLsizei source_height, | 589 GLsizei source_height, |
| 587 GLuint framebuffer) { | 590 GLuint framebuffer) { |
| 588 DCHECK(source_target == GL_TEXTURE_2D || | 591 DCHECK(source_target == GL_TEXTURE_2D || |
| 589 source_target == GL_TEXTURE_RECTANGLE_ARB); | 592 source_target == GL_TEXTURE_RECTANGLE_ARB); |
| 590 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), dest_target); | 593 GLenum dest_binding_target = |
| 594 gpu::gles2::GLES2Util::GLFaceTargetToTextureTarget(dest_target); |
| 595 DCHECK(dest_binding_target == GL_TEXTURE_2D || |
| 596 dest_binding_target == GL_TEXTURE_CUBE_MAP); |
| 591 DCHECK(source_level == 0 || decoder->GetFeatureInfo()->IsES3Capable()); | 597 DCHECK(source_level == 0 || decoder->GetFeatureInfo()->IsES3Capable()); |
| 592 if (BindFramebufferTexture2D(source_target, source_id, source_level, | 598 if (BindFramebufferTexture2D(source_target, source_id, source_level, |
| 593 framebuffer)) { | 599 framebuffer)) { |
| 594 glBindTexture(dest_target, dest_id); | 600 glBindTexture(dest_binding_target, dest_id); |
| 595 glTexParameterf(dest_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 601 glTexParameterf(dest_binding_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 596 glTexParameterf(dest_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 602 glTexParameterf(dest_binding_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 597 glTexParameteri(dest_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 603 glTexParameteri(dest_binding_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 598 glTexParameteri(dest_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 604 glTexParameteri(dest_binding_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 599 glCopyTexSubImage2D(dest_target, dest_level, xoffset, yoffset, source_x, | 605 glCopyTexSubImage2D(dest_target, dest_level, xoffset, yoffset, source_x, |
| 600 source_y, source_width, source_height); | 606 source_y, source_width, source_height); |
| 601 } | 607 } |
| 602 | 608 |
| 603 decoder->RestoreTextureState(source_id); | 609 decoder->RestoreTextureState(source_id); |
| 604 decoder->RestoreTextureState(dest_id); | 610 decoder->RestoreTextureState(dest_id); |
| 605 decoder->RestoreTextureUnitBindings(0); | 611 decoder->RestoreTextureUnitBindings(0); |
| 606 decoder->RestoreActiveTexture(); | 612 decoder->RestoreActiveTexture(); |
| 607 decoder->RestoreFramebufferBindings(); | 613 decoder->RestoreFramebufferBindings(); |
| 608 } | 614 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 GLuint dest_id, | 712 GLuint dest_id, |
| 707 GLint dest_level, | 713 GLint dest_level, |
| 708 GLenum dest_internal_format, | 714 GLenum dest_internal_format, |
| 709 GLsizei width, | 715 GLsizei width, |
| 710 GLsizei height, | 716 GLsizei height, |
| 711 bool flip_y, | 717 bool flip_y, |
| 712 bool premultiply_alpha, | 718 bool premultiply_alpha, |
| 713 bool unpremultiply_alpha, | 719 bool unpremultiply_alpha, |
| 714 CopyTextureMethod method) { | 720 CopyTextureMethod method) { |
| 715 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; | 721 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; |
| 722 GLenum dest_binding_target = |
| 723 gpu::gles2::GLES2Util::GLFaceTargetToTextureTarget(dest_target); |
| 716 | 724 |
| 717 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, | 725 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, |
| 718 // so restrict this to GL_TEXTURE_2D. | 726 // so restrict this to GL_TEXTURE_2D and GL_TEXTURE_CUBE_MAP. |
| 719 if (source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D && | 727 if (source_target == GL_TEXTURE_2D && |
| 728 (dest_binding_target == GL_TEXTURE_2D || |
| 729 dest_binding_target == GL_TEXTURE_CUBE_MAP) && |
| 720 !flip_y && !premultiply_alpha_change && method == DIRECT_COPY) { | 730 !flip_y && !premultiply_alpha_change && method == DIRECT_COPY) { |
| 721 DoCopyTexImage2D(decoder, source_target, source_id, source_level, | 731 DoCopyTexImage2D(decoder, source_target, source_id, source_level, |
| 722 dest_target, dest_id, dest_level, dest_internal_format, | 732 dest_target, dest_id, dest_level, dest_internal_format, |
| 723 width, height, framebuffer_); | 733 width, height, framebuffer_); |
| 724 return; | 734 return; |
| 725 } | 735 } |
| 726 | 736 |
| 737 // Draw to level 0 of an intermediate GL_TEXTURE_2D texture. |
| 727 GLuint dest_texture = dest_id; | 738 GLuint dest_texture = dest_id; |
| 728 GLuint intermediate_texture = 0; | 739 GLuint intermediate_texture = 0; |
| 729 GLint original_dest_level = dest_level; | 740 GLint original_dest_level = dest_level; |
| 741 GLenum original_dest_target = dest_target; |
| 742 GLenum original_internal_format = dest_internal_format; |
| 730 if (method == DRAW_AND_COPY) { | 743 if (method == DRAW_AND_COPY) { |
| 731 GLenum adjusted_internal_format = | 744 GLenum adjusted_internal_format = |
| 732 getIntermediateFormat(dest_internal_format); | 745 getIntermediateFormat(dest_internal_format); |
| 746 dest_target = GL_TEXTURE_2D; |
| 733 glGenTextures(1, &intermediate_texture); | 747 glGenTextures(1, &intermediate_texture); |
| 734 glBindTexture(dest_target, intermediate_texture); | 748 glBindTexture(dest_target, intermediate_texture); |
| 735 GLenum format = TextureManager::ExtractFormatFromStorageFormat( | 749 GLenum format = TextureManager::ExtractFormatFromStorageFormat( |
| 736 adjusted_internal_format); | 750 adjusted_internal_format); |
| 737 GLenum type = | 751 GLenum type = |
| 738 TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format); | 752 TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format); |
| 739 | 753 |
| 740 glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0, | 754 glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0, |
| 741 format, type, nullptr); | 755 format, type, nullptr); |
| 742 dest_texture = intermediate_texture; | 756 dest_texture = intermediate_texture; |
| 743 dest_level = 0; | 757 dest_level = 0; |
| 744 dest_internal_format = adjusted_internal_format; | 758 dest_internal_format = adjusted_internal_format; |
| 745 } | 759 } |
| 746 // Use kIdentityMatrix if no transform passed in. | 760 // Use kIdentityMatrix if no transform passed in. |
| 747 DoCopyTextureWithTransform( | 761 DoCopyTextureWithTransform( |
| 748 decoder, source_target, source_id, source_level, source_internal_format, | 762 decoder, source_target, source_id, source_level, source_internal_format, |
| 749 dest_target, dest_texture, dest_level, dest_internal_format, width, | 763 dest_target, dest_texture, dest_level, dest_internal_format, width, |
| 750 height, flip_y, premultiply_alpha, unpremultiply_alpha, kIdentityMatrix); | 764 height, flip_y, premultiply_alpha, unpremultiply_alpha, kIdentityMatrix); |
| 751 | 765 |
| 752 if (method == DRAW_AND_COPY) { | 766 if (method == DRAW_AND_COPY) { |
| 753 source_level = 0; | 767 source_level = 0; |
| 754 dest_level = original_dest_level; | |
| 755 DoCopyTexImage2D(decoder, dest_target, intermediate_texture, source_level, | 768 DoCopyTexImage2D(decoder, dest_target, intermediate_texture, source_level, |
| 756 dest_target, dest_id, dest_level, dest_internal_format, | 769 original_dest_target, dest_id, original_dest_level, |
| 757 width, height, framebuffer_); | 770 original_internal_format, width, height, framebuffer_); |
| 758 glDeleteTextures(1, &intermediate_texture); | 771 glDeleteTextures(1, &intermediate_texture); |
| 759 } | 772 } |
| 760 } | 773 } |
| 761 | 774 |
| 762 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( | 775 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( |
| 763 const gles2::GLES2Decoder* decoder, | 776 const gles2::GLES2Decoder* decoder, |
| 764 GLenum source_target, | 777 GLenum source_target, |
| 765 GLuint source_id, | 778 GLuint source_id, |
| 766 GLint source_level, | 779 GLint source_level, |
| 767 GLenum source_internal_format, | 780 GLenum source_internal_format, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 785 CopyTextureMethod method) { | 798 CopyTextureMethod method) { |
| 786 bool use_gl_copy_tex_sub_image_2d = true; | 799 bool use_gl_copy_tex_sub_image_2d = true; |
| 787 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) | 800 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) |
| 788 // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver, | 801 // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver, |
| 789 // although opposite in Android. | 802 // although opposite in Android. |
| 790 // TODO(dshwang): After Mesa fixes this issue, remove this hack. | 803 // TODO(dshwang): After Mesa fixes this issue, remove this hack. |
| 791 // https://bugs.freedesktop.org/show_bug.cgi?id=98478 crbug.com/535198 | 804 // https://bugs.freedesktop.org/show_bug.cgi?id=98478 crbug.com/535198 |
| 792 use_gl_copy_tex_sub_image_2d = false; | 805 use_gl_copy_tex_sub_image_2d = false; |
| 793 #endif | 806 #endif |
| 794 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; | 807 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; |
| 808 GLenum dest_binding_target = |
| 809 gpu::gles2::GLES2Util::GLFaceTargetToTextureTarget(dest_target); |
| 795 | 810 |
| 796 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, | 811 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, |
| 797 // so restrict this to GL_TEXTURE_2D. | 812 // so restrict this to GL_TEXTURE_2D and GL_TEXTURE_CUBE_MAP. |
| 798 if (use_gl_copy_tex_sub_image_2d && source_target == GL_TEXTURE_2D && | 813 if (use_gl_copy_tex_sub_image_2d && source_target == GL_TEXTURE_2D && |
| 799 dest_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && | 814 (dest_binding_target == GL_TEXTURE_2D || |
| 800 method == DIRECT_COPY) { | 815 dest_binding_target == GL_TEXTURE_CUBE_MAP) && |
| 816 !flip_y && !premultiply_alpha_change && method == DIRECT_COPY) { |
| 801 DoCopyTexSubImage2D(decoder, source_target, source_id, source_level, | 817 DoCopyTexSubImage2D(decoder, source_target, source_id, source_level, |
| 802 dest_target, dest_id, dest_level, xoffset, yoffset, x, | 818 dest_target, dest_id, dest_level, xoffset, yoffset, x, |
| 803 y, width, height, framebuffer_); | 819 y, width, height, framebuffer_); |
| 804 return; | 820 return; |
| 805 } | 821 } |
| 806 | 822 |
| 823 // Draw to level 0 of an intermediate GL_TEXTURE_2D texture. |
| 807 GLint dest_xoffset = xoffset; | 824 GLint dest_xoffset = xoffset; |
| 808 GLint dest_yoffset = yoffset; | 825 GLint dest_yoffset = yoffset; |
| 809 GLuint dest_texture = dest_id; | 826 GLuint dest_texture = dest_id; |
| 810 GLint original_dest_level = dest_level; | 827 GLint original_dest_level = dest_level; |
| 828 GLenum original_dest_target = dest_target; |
| 811 GLuint intermediate_texture = 0; | 829 GLuint intermediate_texture = 0; |
| 812 if (method == DRAW_AND_COPY) { | 830 if (method == DRAW_AND_COPY) { |
| 813 GLenum adjusted_internal_format = | 831 GLenum adjusted_internal_format = |
| 814 getIntermediateFormat(dest_internal_format); | 832 getIntermediateFormat(dest_internal_format); |
| 833 dest_target = GL_TEXTURE_2D; |
| 815 glGenTextures(1, &intermediate_texture); | 834 glGenTextures(1, &intermediate_texture); |
| 816 glBindTexture(dest_target, intermediate_texture); | 835 glBindTexture(dest_target, intermediate_texture); |
| 817 GLenum format = TextureManager::ExtractFormatFromStorageFormat( | 836 GLenum format = TextureManager::ExtractFormatFromStorageFormat( |
| 818 adjusted_internal_format); | 837 adjusted_internal_format); |
| 819 GLenum type = | 838 GLenum type = |
| 820 TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format); | 839 TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format); |
| 821 | 840 |
| 822 glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0, | 841 glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0, |
| 823 format, type, nullptr); | 842 format, type, nullptr); |
| 824 dest_texture = intermediate_texture; | 843 dest_texture = intermediate_texture; |
| 825 dest_level = 0; | 844 dest_level = 0; |
| 826 dest_internal_format = adjusted_internal_format; | 845 dest_internal_format = adjusted_internal_format; |
| 827 dest_xoffset = 0; | 846 dest_xoffset = 0; |
| 828 dest_yoffset = 0; | 847 dest_yoffset = 0; |
| 829 dest_width = width; | 848 dest_width = width; |
| 830 dest_height = height; | 849 dest_height = height; |
| 831 } | 850 } |
| 832 | 851 |
| 833 DoCopySubTextureWithTransform( | 852 DoCopySubTextureWithTransform( |
| 834 decoder, source_target, source_id, source_level, source_internal_format, | 853 decoder, source_target, source_id, source_level, source_internal_format, |
| 835 dest_target, dest_texture, dest_level, dest_internal_format, dest_xoffset, | 854 dest_target, dest_texture, dest_level, dest_internal_format, dest_xoffset, |
| 836 dest_yoffset, x, y, width, height, dest_width, dest_height, source_width, | 855 dest_yoffset, x, y, width, height, dest_width, dest_height, source_width, |
| 837 source_height, flip_y, premultiply_alpha, unpremultiply_alpha, | 856 source_height, flip_y, premultiply_alpha, unpremultiply_alpha, |
| 838 kIdentityMatrix); | 857 kIdentityMatrix); |
| 839 | 858 |
| 840 if (method == DRAW_AND_COPY) { | 859 if (method == DRAW_AND_COPY) { |
| 841 source_level = 0; | 860 source_level = 0; |
| 842 dest_level = original_dest_level; | |
| 843 DoCopyTexSubImage2D(decoder, dest_target, intermediate_texture, | 861 DoCopyTexSubImage2D(decoder, dest_target, intermediate_texture, |
| 844 source_level, dest_target, dest_id, dest_level, xoffset, | 862 source_level, original_dest_target, dest_id, |
| 845 yoffset, 0, 0, width, height, framebuffer_); | 863 original_dest_level, xoffset, yoffset, 0, 0, width, |
| 864 height, framebuffer_); |
| 846 glDeleteTextures(1, &intermediate_texture); | 865 glDeleteTextures(1, &intermediate_texture); |
| 847 } | 866 } |
| 848 } | 867 } |
| 849 | 868 |
| 850 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform( | 869 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform( |
| 851 const gles2::GLES2Decoder* decoder, | 870 const gles2::GLES2Decoder* decoder, |
| 852 GLenum source_target, | 871 GLenum source_target, |
| 853 GLuint source_id, | 872 GLuint source_id, |
| 854 GLint source_level, | 873 GLint source_level, |
| 855 GLenum source_internal_format, | 874 GLenum source_internal_format, |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1136 decoder->RestoreTextureUnitBindings(0); | 1155 decoder->RestoreTextureUnitBindings(0); |
| 1137 decoder->RestoreActiveTexture(); | 1156 decoder->RestoreActiveTexture(); |
| 1138 decoder->RestoreProgramBindings(); | 1157 decoder->RestoreProgramBindings(); |
| 1139 decoder->RestoreBufferBindings(); | 1158 decoder->RestoreBufferBindings(); |
| 1140 decoder->RestoreFramebufferBindings(); | 1159 decoder->RestoreFramebufferBindings(); |
| 1141 decoder->RestoreGlobalState(); | 1160 decoder->RestoreGlobalState(); |
| 1142 } | 1161 } |
| 1143 | 1162 |
| 1144 } // namespace gles2 | 1163 } // namespace gles2 |
| 1145 } // namespace gpu | 1164 } // namespace gpu |
| OLD | NEW |