| 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_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cmath> | 10 #include <cmath> |
| (...skipping 12504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12515 const char* function_name, | 12515 const char* function_name, |
| 12516 GLenum target, | 12516 GLenum target, |
| 12517 TextureRef* source_texture_ref, | 12517 TextureRef* source_texture_ref, |
| 12518 TextureRef* dest_texture_ref, | 12518 TextureRef* dest_texture_ref, |
| 12519 GLenum dest_internal_format) { | 12519 GLenum dest_internal_format) { |
| 12520 if (!source_texture_ref || !dest_texture_ref) { | 12520 if (!source_texture_ref || !dest_texture_ref) { |
| 12521 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id"); | 12521 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id"); |
| 12522 return false; | 12522 return false; |
| 12523 } | 12523 } |
| 12524 | 12524 |
| 12525 if (GL_TEXTURE_2D != target) { |
| 12526 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, |
| 12527 "invalid texture target"); |
| 12528 return false; |
| 12529 } |
| 12530 |
| 12525 Texture* source_texture = source_texture_ref->texture(); | 12531 Texture* source_texture = source_texture_ref->texture(); |
| 12526 Texture* dest_texture = dest_texture_ref->texture(); | 12532 Texture* dest_texture = dest_texture_ref->texture(); |
| 12527 if (source_texture == dest_texture) { | 12533 if (source_texture == dest_texture) { |
| 12528 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, | 12534 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, |
| 12529 "source and destination textures are the same"); | 12535 "source and destination textures are the same"); |
| 12530 return false; | 12536 return false; |
| 12531 } | 12537 } |
| 12532 | 12538 |
| 12533 GLenum binding_target = GLES2Util::GLTextureTargetToBindingTarget(target); | 12539 if (dest_texture->target() != GL_TEXTURE_2D || |
| 12534 if (dest_texture->target() != binding_target || | 12540 (source_texture->target() != GL_TEXTURE_2D && |
| 12535 (GL_TEXTURE_2D != binding_target && | 12541 source_texture->target() != GL_TEXTURE_RECTANGLE_ARB && |
| 12536 GL_TEXTURE_CUBE_MAP != binding_target)) { | 12542 source_texture->target() != GL_TEXTURE_EXTERNAL_OES)) { |
| 12537 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, | |
| 12538 "invalid texture target"); | |
| 12539 return false; | |
| 12540 } | |
| 12541 | |
| 12542 if (source_texture->target() != GL_TEXTURE_2D && | |
| 12543 source_texture->target() != GL_TEXTURE_RECTANGLE_ARB && | |
| 12544 source_texture->target() != GL_TEXTURE_EXTERNAL_OES) { | |
| 12545 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, | 12543 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, |
| 12546 "invalid texture target binding"); | 12544 "invalid texture target binding"); |
| 12547 return false; | 12545 return false; |
| 12548 } | 12546 } |
| 12549 | 12547 |
| 12550 GLenum source_type = 0; | 12548 GLenum source_type = 0; |
| 12551 GLenum source_internal_format = 0; | 12549 GLenum source_internal_format = 0; |
| 12552 source_texture->GetLevelType(source_texture->target(), 0, &source_type, | 12550 source_texture->GetLevelType(source_texture->target(), 0, &source_type, |
| 12553 &source_internal_format); | 12551 &source_internal_format); |
| 12554 | 12552 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12707 copy_texture_CHROMIUM_->Initialize(this); | 12705 copy_texture_CHROMIUM_->Initialize(this); |
| 12708 RestoreCurrentFramebufferBindings(); | 12706 RestoreCurrentFramebufferBindings(); |
| 12709 if (LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM") != GL_NO_ERROR) | 12707 if (LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM") != GL_NO_ERROR) |
| 12710 return; | 12708 return; |
| 12711 } | 12709 } |
| 12712 | 12710 |
| 12713 GLenum dest_type_previous = dest_type; | 12711 GLenum dest_type_previous = dest_type; |
| 12714 GLenum dest_internal_format = internal_format; | 12712 GLenum dest_internal_format = internal_format; |
| 12715 int dest_width = 0; | 12713 int dest_width = 0; |
| 12716 int dest_height = 0; | 12714 int dest_height = 0; |
| 12717 bool dest_level_defined = | 12715 bool dest_level_defined = dest_texture->GetLevelSize( |
| 12718 dest_texture->GetLevelSize(target, 0, &dest_width, &dest_height, nullptr); | 12716 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); |
| 12719 | 12717 |
| 12720 if (dest_level_defined) { | 12718 if (dest_level_defined) { |
| 12721 dest_texture->GetLevelType(target, 0, &dest_type_previous, | 12719 dest_texture->GetLevelType(GL_TEXTURE_2D, 0, &dest_type_previous, |
| 12722 &dest_internal_format); | 12720 &dest_internal_format); |
| 12723 } | 12721 } |
| 12724 | 12722 |
| 12725 // Resize the destination texture to the dimensions of the source texture. | 12723 // Resize the destination texture to the dimensions of the source texture. |
| 12726 if (!dest_level_defined || dest_width != source_width || | 12724 if (!dest_level_defined || dest_width != source_width || |
| 12727 dest_height != source_height || | 12725 dest_height != source_height || |
| 12728 dest_internal_format != internal_format || | 12726 dest_internal_format != internal_format || |
| 12729 dest_type_previous != dest_type) { | 12727 dest_type_previous != dest_type) { |
| 12730 // Ensure that the glTexImage2D succeeds. | 12728 // Ensure that the glTexImage2D succeeds. |
| 12731 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM"); | 12729 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM"); |
| 12732 glBindTexture(dest_texture->target(), dest_texture->service_id()); | 12730 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); |
| 12733 glTexImage2D(target, 0, internal_format, source_width, source_height, 0, | 12731 glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_width, source_height, |
| 12734 internal_format, dest_type, NULL); | 12732 0, internal_format, dest_type, NULL); |
| 12735 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM"); | 12733 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM"); |
| 12736 if (error != GL_NO_ERROR) { | 12734 if (error != GL_NO_ERROR) { |
| 12737 RestoreCurrentTextureBindings(&state_, dest_texture->target()); | 12735 RestoreCurrentTextureBindings(&state_, GL_TEXTURE_2D); |
| 12738 return; | 12736 return; |
| 12739 } | 12737 } |
| 12740 | 12738 |
| 12741 texture_manager()->SetLevelInfo( | 12739 texture_manager()->SetLevelInfo( |
| 12742 dest_texture_ref, target, 0, internal_format, source_width, | 12740 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width, |
| 12743 source_height, 1, 0, internal_format, dest_type, | 12741 source_height, 1, 0, internal_format, dest_type, |
| 12744 gfx::Rect(source_width, source_height)); | 12742 gfx::Rect(source_width, source_height)); |
| 12745 } else { | 12743 } else { |
| 12746 texture_manager()->SetLevelCleared(dest_texture_ref, target, 0, true); | 12744 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, |
| 12745 true); |
| 12747 } | 12746 } |
| 12748 | 12747 |
| 12749 ScopedModifyPixels modify(dest_texture_ref); | 12748 ScopedModifyPixels modify(dest_texture_ref); |
| 12750 | 12749 |
| 12751 // Try using GLImage::CopyTexSubImage when possible. | 12750 // Try using GLImage::CopyTexSubImage when possible. |
| 12752 bool unpack_premultiply_alpha_change = | 12751 bool unpack_premultiply_alpha_change = |
| 12753 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; | 12752 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; |
| 12754 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { | 12753 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { |
| 12755 glBindTexture(dest_texture->target(), dest_texture->service_id()); | 12754 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); |
| 12756 if (image->CopyTexSubImage(target, gfx::Point(0, 0), | 12755 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(0, 0), |
| 12757 gfx::Rect(0, 0, source_width, source_height))) { | 12756 gfx::Rect(0, 0, source_width, source_height))) { |
| 12758 return; | 12757 return; |
| 12759 } | 12758 } |
| 12760 } | 12759 } |
| 12761 | 12760 |
| 12762 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); | 12761 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); |
| 12763 | 12762 |
| 12764 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix | 12763 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix |
| 12765 // before presenting. | 12764 // before presenting. |
| 12766 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { | 12765 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { |
| 12767 // TODO(hkuang): get the StreamTexture transform matrix in GPU process | 12766 // TODO(hkuang): get the StreamTexture transform matrix in GPU process |
| 12768 // instead of using kIdentityMatrix crbug.com/226218. | 12767 // instead of using kIdentityMatrix crbug.com/226218. |
| 12769 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( | 12768 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( |
| 12770 this, source_texture->target(), source_texture->service_id(), target, | 12769 this, source_texture->target(), source_texture->service_id(), |
| 12771 dest_texture->service_id(), internal_format, dest_type, source_width, | 12770 dest_texture->service_id(), source_width, source_height, |
| 12772 source_height, unpack_flip_y == GL_TRUE, | 12771 unpack_flip_y == GL_TRUE, |
| 12773 unpack_premultiply_alpha == GL_TRUE, unpack_unmultiply_alpha == GL_TRUE, | 12772 unpack_premultiply_alpha == GL_TRUE, |
| 12774 &texture_state_, kIdentityMatrix); | 12773 unpack_unmultiply_alpha == GL_TRUE, |
| 12774 kIdentityMatrix); |
| 12775 } else { | 12775 } else { |
| 12776 copy_texture_CHROMIUM_->DoCopyTexture( | 12776 copy_texture_CHROMIUM_->DoCopyTexture( |
| 12777 this, source_texture->target(), source_texture->service_id(), | 12777 this, source_texture->target(), source_texture->service_id(), |
| 12778 source_internal_format, target, dest_texture->service_id(), | 12778 source_internal_format, dest_texture->service_id(), internal_format, |
| 12779 internal_format, dest_type, source_width, source_height, | 12779 source_width, source_height, |
| 12780 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE, | 12780 unpack_flip_y == GL_TRUE, |
| 12781 unpack_unmultiply_alpha == GL_TRUE, &texture_state_); | 12781 unpack_premultiply_alpha == GL_TRUE, |
| 12782 unpack_unmultiply_alpha == GL_TRUE); |
| 12782 } | 12783 } |
| 12783 | 12784 |
| 12784 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); | 12785 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); |
| 12785 } | 12786 } |
| 12786 | 12787 |
| 12787 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( | 12788 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( |
| 12788 GLenum target, | 12789 GLenum target, |
| 12789 GLuint source_id, | 12790 GLuint source_id, |
| 12790 GLuint dest_id, | 12791 GLuint dest_id, |
| 12791 GLint xoffset, | 12792 GLint xoffset, |
| 12792 GLint yoffset, | 12793 GLint yoffset, |
| 12793 GLint x, | 12794 GLint x, |
| 12794 GLint y, | 12795 GLint y, |
| 12795 GLsizei width, | 12796 GLsizei width, |
| 12796 GLsizei height, | 12797 GLsizei height, |
| 12797 GLboolean unpack_flip_y, | 12798 GLboolean unpack_flip_y, |
| 12798 GLboolean unpack_premultiply_alpha, | 12799 GLboolean unpack_premultiply_alpha, |
| 12799 GLboolean unpack_unmultiply_alpha) { | 12800 GLboolean unpack_unmultiply_alpha) { |
| 12800 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM"); | 12801 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM"); |
| 12801 | 12802 |
| 12802 TextureRef* source_texture_ref = GetTexture(source_id); | 12803 TextureRef* source_texture_ref = GetTexture(source_id); |
| 12803 TextureRef* dest_texture_ref = GetTexture(dest_id); | 12804 TextureRef* dest_texture_ref = GetTexture(dest_id); |
| 12804 Texture* source_texture = source_texture_ref->texture(); | 12805 Texture* source_texture = source_texture_ref->texture(); |
| 12805 Texture* dest_texture = dest_texture_ref->texture(); | 12806 Texture* dest_texture = dest_texture_ref->texture(); |
| 12806 GLenum source_type = 0; | |
| 12807 GLenum source_internal_format = 0; | |
| 12808 source_texture->GetLevelType(source_texture->target(), 0, &source_type, | |
| 12809 &source_internal_format); | |
| 12810 int source_width = 0; | 12807 int source_width = 0; |
| 12811 int source_height = 0; | 12808 int source_height = 0; |
| 12812 gfx::GLImage* image = | 12809 gfx::GLImage* image = |
| 12813 source_texture->GetLevelImage(source_texture->target(), 0); | 12810 source_texture->GetLevelImage(source_texture->target(), 0); |
| 12814 if (image) { | 12811 if (image) { |
| 12815 gfx::Size size = image->GetSize(); | 12812 gfx::Size size = image->GetSize(); |
| 12816 source_width = size.width(); | 12813 source_width = size.width(); |
| 12817 source_height = size.height(); | 12814 source_height = size.height(); |
| 12818 if (source_width <= 0 || source_height <= 0) { | 12815 if (source_width <= 0 || source_height <= 0) { |
| 12819 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | 12816 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", |
| 12820 "invalid image size"); | 12817 "invalid image size"); |
| 12821 return; | 12818 return; |
| 12822 } | 12819 } |
| 12823 } else { | 12820 } else { |
| 12824 if (!source_texture->GetLevelSize(source_texture->target(), 0, | 12821 if (!source_texture->GetLevelSize(source_texture->target(), 0, |
| 12825 &source_width, &source_height, nullptr)) { | 12822 &source_width, &source_height, nullptr)) { |
| 12826 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | 12823 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", |
| 12827 "source texture has no level 0"); | 12824 "source texture has no level 0"); |
| 12828 return; | 12825 return; |
| 12829 } | 12826 } |
| 12830 | 12827 |
| 12831 if (!source_texture->ValidForTexture(source_texture->target(), 0, x, y, 0, | |
| 12832 width, height, 1, source_type)) { | |
| 12833 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | |
| 12834 "source texture bad dimensions."); | |
| 12835 return; | |
| 12836 } | |
| 12837 | |
| 12838 // Check that this type of texture is allowed. | 12828 // Check that this type of texture is allowed. |
| 12839 if (!texture_manager()->ValidForTarget(source_texture->target(), 0, | 12829 if (!texture_manager()->ValidForTarget(source_texture->target(), 0, |
| 12840 source_width, source_height, 1)) { | 12830 source_width, source_height, 1)) { |
| 12841 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | 12831 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", |
| 12842 "source texture bad dimensions"); | 12832 "source texture bad dimensions"); |
| 12843 return; | 12833 return; |
| 12844 } | 12834 } |
| 12845 } | 12835 } |
| 12846 | 12836 |
| 12837 GLenum source_type = 0; |
| 12838 GLenum source_internal_format = 0; |
| 12839 source_texture->GetLevelType(source_texture->target(), 0, &source_type, |
| 12840 &source_internal_format); |
| 12841 if (!source_texture->ValidForTexture(source_texture->target(), 0, x, y, 0, |
| 12842 width, height, 1, source_type)) { |
| 12843 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", |
| 12844 "source texture bad dimensions."); |
| 12845 return; |
| 12846 } |
| 12847 |
| 12847 GLenum dest_type = 0; | 12848 GLenum dest_type = 0; |
| 12848 GLenum dest_internal_format = 0; | 12849 GLenum dest_internal_format = 0; |
| 12849 bool dest_level_defined = | 12850 bool dest_level_defined = dest_texture->GetLevelType( |
| 12850 dest_texture->GetLevelType(target, 0, &dest_type, &dest_internal_format); | 12851 dest_texture->target(), 0, &dest_type, &dest_internal_format); |
| 12851 if (!dest_level_defined) { | 12852 if (!dest_level_defined) { |
| 12852 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM", | 12853 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM", |
| 12853 "destination texture is not defined"); | 12854 "destination texture is not defined"); |
| 12854 return; | 12855 return; |
| 12855 } | 12856 } |
| 12856 if (!dest_texture->ValidForTexture(target, 0, xoffset, yoffset, 0, width, | 12857 if (!dest_texture->ValidForTexture(dest_texture->target(), 0, xoffset, |
| 12857 height, 1, dest_type)) { | 12858 yoffset, 0, width, height, 1, dest_type)) { |
| 12858 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | 12859 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", |
| 12859 "destination texture bad dimensions."); | 12860 "destination texture bad dimensions."); |
| 12860 return; | 12861 return; |
| 12861 } | 12862 } |
| 12862 | 12863 |
| 12863 if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target, | 12864 if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target, |
| 12864 source_texture_ref, dest_texture_ref, | 12865 source_texture_ref, dest_texture_ref, |
| 12865 dest_internal_format)) { | 12866 dest_internal_format)) { |
| 12866 return; | 12867 return; |
| 12867 } | 12868 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 12880 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopySubTextureCHROMIUM"); | 12881 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopySubTextureCHROMIUM"); |
| 12881 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); | 12882 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); |
| 12882 copy_texture_CHROMIUM_->Initialize(this); | 12883 copy_texture_CHROMIUM_->Initialize(this); |
| 12883 RestoreCurrentFramebufferBindings(); | 12884 RestoreCurrentFramebufferBindings(); |
| 12884 if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR) | 12885 if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR) |
| 12885 return; | 12886 return; |
| 12886 } | 12887 } |
| 12887 | 12888 |
| 12888 int dest_width = 0; | 12889 int dest_width = 0; |
| 12889 int dest_height = 0; | 12890 int dest_height = 0; |
| 12890 bool ok = | 12891 bool ok = dest_texture->GetLevelSize( |
| 12891 dest_texture->GetLevelSize(target, 0, &dest_width, &dest_height, nullptr); | 12892 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); |
| 12892 DCHECK(ok); | 12893 DCHECK(ok); |
| 12893 if (xoffset != 0 || yoffset != 0 || width != dest_width || | 12894 if (xoffset != 0 || yoffset != 0 || width != dest_width || |
| 12894 height != dest_height) { | 12895 height != dest_height) { |
| 12895 gfx::Rect cleared_rect; | 12896 gfx::Rect cleared_rect; |
| 12896 if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0), | 12897 if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0), |
| 12897 gfx::Rect(xoffset, yoffset, width, height), | 12898 gfx::Rect(xoffset, yoffset, width, height), |
| 12898 &cleared_rect)) { | 12899 &cleared_rect)) { |
| 12899 DCHECK_GE(cleared_rect.size().GetArea(), | 12900 DCHECK_GE(cleared_rect.size().GetArea(), |
| 12900 dest_texture->GetLevelClearedRect(target, 0).size().GetArea()); | 12901 dest_texture->GetLevelClearedRect(target, 0).size().GetArea()); |
| 12901 texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0, | 12902 texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0, |
| 12902 cleared_rect); | 12903 cleared_rect); |
| 12903 } else { | 12904 } else { |
| 12904 // Otherwise clear part of texture level that is not already cleared. | 12905 // Otherwise clear part of texture level that is not already cleared. |
| 12905 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, | 12906 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, |
| 12906 0)) { | 12907 0)) { |
| 12907 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", | 12908 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", |
| 12908 "destination texture dimensions too big"); | 12909 "destination texture dimensions too big"); |
| 12909 return; | 12910 return; |
| 12910 } | 12911 } |
| 12911 } | 12912 } |
| 12912 } else { | 12913 } else { |
| 12913 texture_manager()->SetLevelCleared(dest_texture_ref, target, 0, true); | 12914 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, |
| 12915 true); |
| 12914 } | 12916 } |
| 12915 | 12917 |
| 12916 ScopedModifyPixels modify(dest_texture_ref); | 12918 ScopedModifyPixels modify(dest_texture_ref); |
| 12917 | 12919 |
| 12918 // Try using GLImage::CopyTexSubImage when possible. | 12920 // Try using GLImage::CopyTexSubImage when possible. |
| 12919 bool unpack_premultiply_alpha_change = | 12921 bool unpack_premultiply_alpha_change = |
| 12920 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; | 12922 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; |
| 12921 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { | 12923 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { |
| 12922 glBindTexture(dest_texture->target(), dest_texture->service_id()); | 12924 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); |
| 12923 if (image->CopyTexSubImage(target, gfx::Point(xoffset, yoffset), | 12925 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(xoffset, yoffset), |
| 12924 gfx::Rect(x, y, width, height))) { | 12926 gfx::Rect(x, y, width, height))) { |
| 12925 return; | 12927 return; |
| 12926 } | 12928 } |
| 12927 } | 12929 } |
| 12928 | 12930 |
| 12929 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); | 12931 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); |
| 12930 | 12932 |
| 12931 // TODO(hkuang): get the StreamTexture transform matrix in GPU process. | 12933 // TODO(hkuang): get the StreamTexture transform matrix in GPU process. |
| 12932 // crbug.com/226218. | 12934 // crbug.com/226218. |
| 12933 copy_texture_CHROMIUM_->DoCopySubTexture( | 12935 copy_texture_CHROMIUM_->DoCopySubTexture( |
| 12934 this, source_texture->target(), source_texture->service_id(), | 12936 this, source_texture->target(), source_texture->service_id(), |
| 12935 source_internal_format, target, dest_texture->service_id(), | 12937 source_internal_format, dest_texture->service_id(), dest_internal_format, |
| 12936 dest_internal_format, dest_type, xoffset, yoffset, x, y, width, height, | 12938 xoffset, yoffset, x, y, width, height, dest_width, dest_height, |
| 12937 dest_width, dest_height, source_width, source_height, | 12939 source_width, source_height, |
| 12938 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE, | 12940 unpack_flip_y == GL_TRUE, |
| 12939 unpack_unmultiply_alpha == GL_TRUE, &texture_state_); | 12941 unpack_premultiply_alpha == GL_TRUE, |
| 12942 unpack_unmultiply_alpha == GL_TRUE); |
| 12940 | 12943 |
| 12941 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); | 12944 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); |
| 12942 } | 12945 } |
| 12943 | 12946 |
| 12944 void GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM(GLenum target, | 12947 void GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM(GLenum target, |
| 12945 GLuint source_id, | 12948 GLuint source_id, |
| 12946 GLuint dest_id) { | 12949 GLuint dest_id) { |
| 12947 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM"); | 12950 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM"); |
| 12948 | 12951 |
| 12949 TextureRef* source_texture_ref = GetTexture(source_id); | 12952 TextureRef* source_texture_ref = GetTexture(source_id); |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13098 source_height, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 13101 source_height, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
| 13099 gfx::Rect(source_width, source_height)); | 13102 gfx::Rect(source_width, source_height)); |
| 13100 | 13103 |
| 13101 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix | 13104 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix |
| 13102 // before presenting. | 13105 // before presenting. |
| 13103 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { | 13106 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { |
| 13104 // TODO(hkuang): get the StreamTexture transform matrix in GPU process | 13107 // TODO(hkuang): get the StreamTexture transform matrix in GPU process |
| 13105 // instead of using kIdentityMatrix crbug.com/226218. | 13108 // instead of using kIdentityMatrix crbug.com/226218. |
| 13106 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( | 13109 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( |
| 13107 this, source_texture->target(), source_texture->service_id(), | 13110 this, source_texture->target(), source_texture->service_id(), |
| 13108 GL_TEXTURE_2D, dest_texture->service_id(), GL_RGBA, GL_UNSIGNED_BYTE, | 13111 dest_texture->service_id(), source_width, source_height, |
| 13109 source_width, source_height, false, false, false, &texture_state_, | 13112 false, false, false, kIdentityMatrix); |
| 13110 kIdentityMatrix); | |
| 13111 } else { | 13113 } else { |
| 13112 copy_texture_CHROMIUM_->DoCopyTexture( | 13114 copy_texture_CHROMIUM_->DoCopyTexture( |
| 13113 this, source_texture->target(), source_texture->service_id(), | 13115 this, source_texture->target(), source_texture->service_id(), |
| 13114 source_internal_format, GL_TEXTURE_2D, dest_texture->service_id(), | 13116 source_internal_format, dest_texture->service_id(), GL_RGBA, |
| 13115 GL_RGBA, GL_UNSIGNED_BYTE, source_width, source_height, false, false, | 13117 source_width, source_height, false, false, false); |
| 13116 false, &texture_state_); | |
| 13117 } | 13118 } |
| 13118 | 13119 |
| 13119 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); | 13120 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); |
| 13120 } | 13121 } |
| 13121 | 13122 |
| 13122 void GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM(GLenum target, | 13123 void GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM(GLenum target, |
| 13123 GLuint source_id, | 13124 GLuint source_id, |
| 13124 GLuint dest_id, | 13125 GLuint dest_id, |
| 13125 GLint xoffset, | 13126 GLint xoffset, |
| 13126 GLint yoffset, | 13127 GLint yoffset, |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13294 | 13295 |
| 13295 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM"); | 13296 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM"); |
| 13296 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA, | 13297 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA, |
| 13297 GL_UNSIGNED_BYTE, NULL); | 13298 GL_UNSIGNED_BYTE, NULL); |
| 13298 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM"); | 13299 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM"); |
| 13299 if (error != GL_NO_ERROR) | 13300 if (error != GL_NO_ERROR) |
| 13300 return; | 13301 return; |
| 13301 | 13302 |
| 13302 copy_texture_CHROMIUM_->DoCopyTexture( | 13303 copy_texture_CHROMIUM_->DoCopyTexture( |
| 13303 this, dest_texture->target(), dest_texture->service_id(), | 13304 this, dest_texture->target(), dest_texture->service_id(), |
| 13304 dest_internal_format, GL_TEXTURE_2D, tmp_service_id, GL_RGBA, | 13305 dest_internal_format, tmp_service_id, GL_RGBA, |
| 13305 GL_UNSIGNED_BYTE, dest_width, dest_height, false, false, false, | 13306 dest_width, dest_height, false, false, false); |
| 13306 &texture_state_); | |
| 13307 | 13307 |
| 13308 // Redefine destination texture to use RGBA. | 13308 // Redefine destination texture to use RGBA. |
| 13309 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); | 13309 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); |
| 13310 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM"); | 13310 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM"); |
| 13311 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA, | 13311 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA, |
| 13312 GL_UNSIGNED_BYTE, NULL); | 13312 GL_UNSIGNED_BYTE, NULL); |
| 13313 error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM"); | 13313 error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM"); |
| 13314 if (error != GL_NO_ERROR) | 13314 if (error != GL_NO_ERROR) |
| 13315 return; | 13315 return; |
| 13316 | 13316 |
| 13317 texture_manager()->SetLevelInfo( | 13317 texture_manager()->SetLevelInfo( |
| 13318 dest_texture_ref, GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, | 13318 dest_texture_ref, GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, |
| 13319 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(dest_width, dest_height)); | 13319 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(dest_width, dest_height)); |
| 13320 | 13320 |
| 13321 copy_texture_CHROMIUM_->DoCopyTexture( | 13321 copy_texture_CHROMIUM_->DoCopyTexture( |
| 13322 this, GL_TEXTURE_2D, tmp_service_id, GL_RGBA, GL_TEXTURE_2D, | 13322 this, GL_TEXTURE_2D, tmp_service_id, GL_RGBA, |
| 13323 dest_texture->service_id(), GL_RGBA, GL_UNSIGNED_BYTE, dest_width, | 13323 dest_texture->service_id(), GL_RGBA, |
| 13324 dest_height, false, false, false, &texture_state_); | 13324 dest_width, dest_height, false, false, false); |
| 13325 | 13325 |
| 13326 glDeleteTextures(1, &tmp_service_id); | 13326 glDeleteTextures(1, &tmp_service_id); |
| 13327 } | 13327 } |
| 13328 | 13328 |
| 13329 // TODO(hkuang): get the StreamTexture transform matrix in GPU process. | 13329 // TODO(hkuang): get the StreamTexture transform matrix in GPU process. |
| 13330 // crbug.com/226218. | 13330 // crbug.com/226218. |
| 13331 copy_texture_CHROMIUM_->DoCopySubTexture( | 13331 copy_texture_CHROMIUM_->DoCopySubTexture( |
| 13332 this, source_texture->target(), source_texture->service_id(), | 13332 this, source_texture->target(), source_texture->service_id(), |
| 13333 source_internal_format, GL_TEXTURE_2D, dest_texture->service_id(), | 13333 source_internal_format, dest_texture->service_id(), GL_RGBA, |
| 13334 GL_RGBA, GL_UNSIGNED_BYTE, xoffset, yoffset, x, y, width, height, | 13334 xoffset, yoffset, x, y, width, height, dest_width, dest_height, |
| 13335 dest_width, dest_height, source_width, source_height, false, false, false, | 13335 source_width, source_height, false, false, false); |
| 13336 &texture_state_); | |
| 13337 | 13336 |
| 13338 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); | 13337 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); |
| 13339 } | 13338 } |
| 13340 | 13339 |
| 13341 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { | 13340 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { |
| 13342 switch (internalformat) { | 13341 switch (internalformat) { |
| 13343 case GL_R8: | 13342 case GL_R8: |
| 13344 return GL_UNSIGNED_BYTE; | 13343 return GL_UNSIGNED_BYTE; |
| 13345 case GL_R8_SNORM: | 13344 case GL_R8_SNORM: |
| 13346 return GL_BYTE; | 13345 return GL_BYTE; |
| (...skipping 1435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14782 return error::kNoError; | 14781 return error::kNoError; |
| 14783 } | 14782 } |
| 14784 | 14783 |
| 14785 // Include the auto-generated part of this file. We split this because it means | 14784 // Include the auto-generated part of this file. We split this because it means |
| 14786 // we can easily edit the non-auto generated parts right here in this file | 14785 // we can easily edit the non-auto generated parts right here in this file |
| 14787 // instead of having to edit some template or the code generator. | 14786 // instead of having to edit some template or the code generator. |
| 14788 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 14787 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 14789 | 14788 |
| 14790 } // namespace gles2 | 14789 } // namespace gles2 |
| 14791 } // namespace gpu | 14790 } // namespace gpu |
| OLD | NEW |