Chromium Code Reviews| 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 <limits.h> | 7 #include <limits.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| (...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 882 GLint yoffset, | 882 GLint yoffset, |
| 883 GLint zoffset, | 883 GLint zoffset, |
| 884 GLsizei width, | 884 GLsizei width, |
| 885 GLsizei height, | 885 GLsizei height, |
| 886 GLsizei depth, | 886 GLsizei depth, |
| 887 GLenum format, | 887 GLenum format, |
| 888 GLsizei imageSize, | 888 GLsizei imageSize, |
| 889 const void* data, | 889 const void* data, |
| 890 ContextState::Dimension dimension); | 890 ContextState::Dimension dimension); |
| 891 | 891 |
| 892 bool ValidateCopyTexFormatHelper(GLenum internal_format, GLenum read_format, | |
| 893 GLenum read_type, std::string& err_msg); | |
| 892 // Validate if |format| is valid for CopyTex{Sub}Image functions. | 894 // Validate if |format| is valid for CopyTex{Sub}Image functions. |
| 893 // If not, generate a GL error and return false. | 895 // If not, generate a GL error and return false. |
| 894 bool ValidateCopyTexFormat(const char* func_name, GLenum internal_format, | 896 bool ValidateCopyTexFormat(const char* func_name, GLenum internal_format, |
| 895 GLenum read_format, GLenum read_type); | 897 GLenum read_format, GLenum read_type); |
| 896 | 898 |
| 897 // Wrapper for CopyTexImage2D. | 899 // Wrapper for CopyTexImage2D. |
| 898 void DoCopyTexImage2D( | 900 void DoCopyTexImage2D( |
| 899 GLenum target, | 901 GLenum target, |
| 900 GLint level, | 902 GLint level, |
| 901 GLenum internal_format, | 903 GLenum internal_format, |
| (...skipping 12788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13690 height, depth, format, image_size, data); | 13692 height, depth, format, image_size, data); |
| 13691 } | 13693 } |
| 13692 } | 13694 } |
| 13693 | 13695 |
| 13694 // This may be a slow command. Exit command processing to allow for | 13696 // This may be a slow command. Exit command processing to allow for |
| 13695 // context preemption and GPU watchdog checks. | 13697 // context preemption and GPU watchdog checks. |
| 13696 ExitCommandProcessingEarly(); | 13698 ExitCommandProcessingEarly(); |
| 13697 return error::kNoError; | 13699 return error::kNoError; |
| 13698 } | 13700 } |
| 13699 | 13701 |
| 13700 bool GLES2DecoderImpl::ValidateCopyTexFormat( | 13702 bool GLES2DecoderImpl::ValidateCopyTexFormatHelper(GLenum internal_format, |
| 13701 const char* func_name, GLenum internal_format, | 13703 GLenum read_format, GLenum read_type, std::string& err_msg) { |
|
Zhenyao Mo
2016/11/03 22:55:35
This is against coding style: https://google.githu
| |
| 13702 GLenum read_format, GLenum read_type) { | |
| 13703 if (read_format == 0) { | 13704 if (read_format == 0) { |
| 13704 LOCAL_SET_GL_ERROR( | 13705 err_msg = std::string("no valid color image"); |
| 13705 GL_INVALID_OPERATION, func_name, "no valid color image"); | |
| 13706 return false; | 13706 return false; |
| 13707 } | 13707 } |
| 13708 // Check we have compatible formats. | 13708 // Check we have compatible formats. |
| 13709 uint32_t channels_exist = GLES2Util::GetChannelsForFormat(read_format); | 13709 uint32_t channels_exist = GLES2Util::GetChannelsForFormat(read_format); |
| 13710 uint32_t channels_needed = GLES2Util::GetChannelsForFormat(internal_format); | 13710 uint32_t channels_needed = GLES2Util::GetChannelsForFormat(internal_format); |
| 13711 if (!channels_needed || | 13711 if (!channels_needed || |
| 13712 (channels_needed & channels_exist) != channels_needed) { | 13712 (channels_needed & channels_exist) != channels_needed) { |
| 13713 LOCAL_SET_GL_ERROR( | 13713 err_msg = std::string("incompatible format"); |
| 13714 GL_INVALID_OPERATION, func_name, "incompatible format"); | |
| 13715 return false; | 13714 return false; |
| 13716 } | 13715 } |
| 13717 if (feature_info_->IsWebGL2OrES3Context()) { | 13716 if (feature_info_->IsWebGL2OrES3Context()) { |
| 13718 GLint color_encoding = GetColorEncodingFromInternalFormat(read_format); | 13717 GLint color_encoding = GetColorEncodingFromInternalFormat(read_format); |
| 13719 if (color_encoding != GetColorEncodingFromInternalFormat(internal_format) || | 13718 if (color_encoding != GetColorEncodingFromInternalFormat(internal_format) || |
| 13720 GLES2Util::IsFloatFormat(internal_format) || | 13719 GLES2Util::IsFloatFormat(internal_format) || |
| 13721 (GLES2Util::IsSignedIntegerFormat(internal_format) != | 13720 (GLES2Util::IsSignedIntegerFormat(internal_format) != |
| 13722 GLES2Util::IsSignedIntegerFormat(read_format)) || | 13721 GLES2Util::IsSignedIntegerFormat(read_format)) || |
| 13723 (GLES2Util::IsUnsignedIntegerFormat(internal_format) != | 13722 (GLES2Util::IsUnsignedIntegerFormat(internal_format) != |
| 13724 GLES2Util::IsUnsignedIntegerFormat(read_format))) { | 13723 GLES2Util::IsUnsignedIntegerFormat(read_format))) { |
| 13725 LOCAL_SET_GL_ERROR( | 13724 err_msg = std::string("incompatible format"); |
| 13726 GL_INVALID_OPERATION, func_name, "incompatible format"); | |
| 13727 return false; | 13725 return false; |
| 13728 } | 13726 } |
| 13729 } | 13727 } |
| 13730 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { | 13728 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { |
| 13731 LOCAL_SET_GL_ERROR( | 13729 err_msg = std::string("can not be used with depth or stencil textures"); |
| 13732 GL_INVALID_OPERATION, | |
| 13733 func_name, "can not be used with depth or stencil textures"); | |
| 13734 return false; | 13730 return false; |
| 13735 } | 13731 } |
| 13736 if (feature_info_->IsWebGL2OrES3Context()) { | 13732 if (feature_info_->IsWebGL2OrES3Context()) { |
| 13737 if (GLES2Util::IsSizedColorFormat(internal_format)) { | 13733 if (GLES2Util::IsSizedColorFormat(internal_format)) { |
| 13738 int sr, sg, sb, sa; | 13734 int sr, sg, sb, sa; |
| 13739 GLES2Util::GetColorFormatComponentSizes( | 13735 GLES2Util::GetColorFormatComponentSizes( |
| 13740 read_format, read_type, &sr, &sg, &sb, &sa); | 13736 read_format, read_type, &sr, &sg, &sb, &sa); |
| 13741 DCHECK(sr > 0 || sg > 0 || sb > 0 || sa > 0); | 13737 DCHECK(sr > 0 || sg > 0 || sb > 0 || sa > 0); |
| 13742 int dr, dg, db, da; | 13738 int dr, dg, db, da; |
| 13743 GLES2Util::GetColorFormatComponentSizes( | 13739 GLES2Util::GetColorFormatComponentSizes( |
| 13744 internal_format, 0, &dr, &dg, &db, &da); | 13740 internal_format, 0, &dr, &dg, &db, &da); |
| 13745 DCHECK(dr > 0 || dg > 0 || db > 0 || da > 0); | 13741 DCHECK(dr > 0 || dg > 0 || db > 0 || da > 0); |
| 13746 if ((dr > 0 && sr != dr) || | 13742 if ((dr > 0 && sr != dr) || |
| 13747 (dg > 0 && sg != dg) || | 13743 (dg > 0 && sg != dg) || |
| 13748 (db > 0 && sb != db) || | 13744 (db > 0 && sb != db) || |
| 13749 (da > 0 && sa != da)) { | 13745 (da > 0 && sa != da)) { |
| 13750 LOCAL_SET_GL_ERROR( | 13746 err_msg = std::string("incompatible color component sizes"); |
| 13751 GL_INVALID_OPERATION, | |
| 13752 func_name, "incompatible color component sizes"); | |
| 13753 return false; | 13747 return false; |
| 13754 } | 13748 } |
| 13755 } | 13749 } |
| 13756 } | 13750 } |
| 13757 return true; | 13751 return true; |
| 13758 } | 13752 } |
| 13759 | 13753 |
| 13754 bool GLES2DecoderImpl::ValidateCopyTexFormat( | |
| 13755 const char* func_name, GLenum internal_format, | |
| 13756 GLenum read_format, GLenum read_type) { | |
| 13757 std::string err_msg; | |
| 13758 if (!ValidateCopyTexFormatHelper(internal_format, read_format, | |
| 13759 read_type, err_msg)) { | |
| 13760 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, err_msg.c_str()); | |
| 13761 return false; | |
| 13762 } | |
| 13763 return true; | |
| 13764 } | |
| 13765 | |
| 13760 void GLES2DecoderImpl::DoCopyTexImage2D( | 13766 void GLES2DecoderImpl::DoCopyTexImage2D( |
| 13761 GLenum target, | 13767 GLenum target, |
| 13762 GLint level, | 13768 GLint level, |
| 13763 GLenum internal_format, | 13769 GLenum internal_format, |
| 13764 GLint x, | 13770 GLint x, |
| 13765 GLint y, | 13771 GLint y, |
| 13766 GLsizei width, | 13772 GLsizei width, |
| 13767 GLsizei height, | 13773 GLsizei height, |
| 13768 GLint border) { | 13774 GLint border) { |
| 13769 const char* func_name = "glCopyTexImage2D"; | 13775 const char* func_name = "glCopyTexImage2D"; |
| (...skipping 2184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15954 source_internal_format == GL_RED || source_internal_format == GL_ALPHA || | 15960 source_internal_format == GL_RED || source_internal_format == GL_ALPHA || |
| 15955 source_internal_format == GL_RGB || source_internal_format == GL_RGBA || | 15961 source_internal_format == GL_RGB || source_internal_format == GL_RGBA || |
| 15956 source_internal_format == GL_RGB8 || source_internal_format == GL_RGBA8 || | 15962 source_internal_format == GL_RGB8 || source_internal_format == GL_RGBA8 || |
| 15957 source_internal_format == GL_LUMINANCE || | 15963 source_internal_format == GL_LUMINANCE || |
| 15958 source_internal_format == GL_LUMINANCE_ALPHA || | 15964 source_internal_format == GL_LUMINANCE_ALPHA || |
| 15959 source_internal_format == GL_BGRA_EXT || | 15965 source_internal_format == GL_BGRA_EXT || |
| 15960 source_internal_format == GL_BGRA8_EXT || | 15966 source_internal_format == GL_BGRA8_EXT || |
| 15961 source_internal_format == GL_RGB_YCBCR_420V_CHROMIUM || | 15967 source_internal_format == GL_RGB_YCBCR_420V_CHROMIUM || |
| 15962 source_internal_format == GL_RGB_YCBCR_422_CHROMIUM; | 15968 source_internal_format == GL_RGB_YCBCR_422_CHROMIUM; |
| 15963 if (!valid_source_format) { | 15969 if (!valid_source_format) { |
| 15964 std::string msg = "invalid source internal format " + | |
| 15965 GLES2Util::GetStringEnum(source_internal_format); | |
| 15966 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, | |
| 15967 msg.c_str()); | |
| 15968 return false; | 15970 return false; |
| 15969 } | 15971 } |
| 15970 if (!valid_dest_format) { | 15972 if (!valid_dest_format) { |
| 15971 std::string msg = "invalid dest internal format " + | |
| 15972 GLES2Util::GetStringEnum(dest_internal_format); | |
| 15973 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, | |
| 15974 msg.c_str()); | |
| 15975 return false; | 15973 return false; |
| 15976 } | 15974 } |
| 15977 return true; | 15975 return true; |
| 15978 } | 15976 } |
| 15979 | 15977 |
| 15980 bool GLES2DecoderImpl::ValidateCompressedCopyTextureCHROMIUM( | 15978 bool GLES2DecoderImpl::ValidateCompressedCopyTextureCHROMIUM( |
| 15981 const char* function_name, | 15979 const char* function_name, |
| 15982 TextureRef* source_texture_ref, | 15980 TextureRef* source_texture_ref, |
| 15983 TextureRef* dest_texture_ref) { | 15981 TextureRef* dest_texture_ref) { |
| 15984 if (!source_texture_ref || !dest_texture_ref) { | 15982 if (!source_texture_ref || !dest_texture_ref) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16031 GLenum dest_type, | 16029 GLenum dest_type, |
| 16032 GLboolean unpack_flip_y, | 16030 GLboolean unpack_flip_y, |
| 16033 GLboolean unpack_premultiply_alpha, | 16031 GLboolean unpack_premultiply_alpha, |
| 16034 GLboolean unpack_unmultiply_alpha) { | 16032 GLboolean unpack_unmultiply_alpha) { |
| 16035 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopyTextureCHROMIUM"); | 16033 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopyTextureCHROMIUM"); |
| 16036 static const char kFunctionName[] = "glCopyTextureCHROMIUM"; | 16034 static const char kFunctionName[] = "glCopyTextureCHROMIUM"; |
| 16037 | 16035 |
| 16038 TextureRef* source_texture_ref = GetTexture(source_id); | 16036 TextureRef* source_texture_ref = GetTexture(source_id); |
| 16039 TextureRef* dest_texture_ref = GetTexture(dest_id); | 16037 TextureRef* dest_texture_ref = GetTexture(dest_id); |
| 16040 | 16038 |
| 16041 if (!texture_manager()->ValidateTextureParameters( | |
| 16042 GetErrorState(), kFunctionName, true, internal_format, dest_type, | |
| 16043 internal_format, 0)) | |
| 16044 return; | |
| 16045 | |
| 16046 if (!ValidateCopyTextureCHROMIUMTextures(kFunctionName, source_texture_ref, | 16039 if (!ValidateCopyTextureCHROMIUMTextures(kFunctionName, source_texture_ref, |
| 16047 dest_texture_ref)) { | 16040 dest_texture_ref)) { |
| 16048 return; | 16041 return; |
| 16049 } | 16042 } |
| 16050 | 16043 |
| 16051 if (!ValidateCopyTextureCHROMIUMInternalFormats( | |
| 16052 kFunctionName, source_texture_ref, internal_format)) { | |
| 16053 return; | |
| 16054 } | |
| 16055 | |
| 16056 Texture* source_texture = source_texture_ref->texture(); | 16044 Texture* source_texture = source_texture_ref->texture(); |
| 16057 Texture* dest_texture = dest_texture_ref->texture(); | 16045 Texture* dest_texture = dest_texture_ref->texture(); |
| 16058 GLenum source_target = source_texture->target(); | 16046 GLenum source_target = source_texture->target(); |
| 16059 GLenum dest_target = dest_texture->target(); | 16047 GLenum dest_target = dest_texture->target(); |
| 16048 | |
| 16049 GLenum source_type = 0; | |
| 16050 GLenum source_internal_format = 0; | |
| 16051 source_texture->GetLevelType(source_target, 0, &source_type, | |
| 16052 &source_internal_format); | |
| 16053 GLenum format = TextureManager::ExtractFormatFromStorageFormat( | |
| 16054 internal_format); | |
| 16055 if (!texture_manager()->ValidateTextureParameters( | |
| 16056 GetErrorState(), kFunctionName, true, format, dest_type, | |
| 16057 internal_format, 0)) | |
| 16058 return; | |
| 16059 | |
| 16060 bool legacy_format_valid = ValidateCopyTextureCHROMIUMInternalFormats( | |
|
Zhenyao Mo
2016/11/03 22:55:35
I think you should expand this function to handle
| |
| 16061 kFunctionName, source_texture_ref, internal_format); | |
| 16062 bool source_format_color_renderable = Texture::ColorRenderable( | |
| 16063 GetFeatureInfo(), source_internal_format, source_texture->IsImmutable()); | |
| 16064 std::string err_msg; | |
| 16065 bool copy_tex_image_format_valid = source_format_color_renderable && | |
| 16066 source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D && | |
| 16067 ValidateCopyTexFormatHelper(internal_format, | |
| 16068 source_internal_format, source_type, err_msg); | |
| 16069 if (!legacy_format_valid && !copy_tex_image_format_valid) { | |
| 16070 std::string msg = "source internal format(" + | |
| 16071 GLES2Util::GetStringEnum(source_internal_format) + | |
| 16072 ") and destination internal format(" + | |
| 16073 GLES2Util::GetStringEnum(internal_format) + | |
| 16074 ") combination is invalid."; | |
| 16075 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, kFunctionName, | |
| 16076 msg.c_str()); | |
| 16077 return; | |
| 16078 } | |
| 16079 | |
| 16060 int source_width = 0; | 16080 int source_width = 0; |
| 16061 int source_height = 0; | 16081 int source_height = 0; |
| 16062 gl::GLImage* image = | 16082 gl::GLImage* image = |
| 16063 source_texture->GetLevelImage(source_target, 0); | 16083 source_texture->GetLevelImage(source_target, 0); |
| 16064 if (image) { | 16084 if (image) { |
| 16065 gfx::Size size = image->GetSize(); | 16085 gfx::Size size = image->GetSize(); |
| 16066 source_width = size.width(); | 16086 source_width = size.width(); |
| 16067 source_height = size.height(); | 16087 source_height = size.height(); |
| 16068 if (source_width <= 0 || source_height <= 0) { | 16088 if (source_width <= 0 || source_height <= 0) { |
| 16069 LOCAL_SET_GL_ERROR( | 16089 LOCAL_SET_GL_ERROR( |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 16081 } | 16101 } |
| 16082 | 16102 |
| 16083 // Check that this type of texture is allowed. | 16103 // Check that this type of texture is allowed. |
| 16084 if (!texture_manager()->ValidForTarget(source_target, 0, | 16104 if (!texture_manager()->ValidForTarget(source_target, 0, |
| 16085 source_width, source_height, 1)) { | 16105 source_width, source_height, 1)) { |
| 16086 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, "Bad dimensions"); | 16106 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, "Bad dimensions"); |
| 16087 return; | 16107 return; |
| 16088 } | 16108 } |
| 16089 } | 16109 } |
| 16090 | 16110 |
| 16091 GLenum source_type = 0; | |
| 16092 GLenum source_internal_format = 0; | |
| 16093 source_texture->GetLevelType(source_target, 0, &source_type, | |
| 16094 &source_internal_format); | |
| 16095 | |
| 16096 if (dest_texture->IsImmutable()) { | 16111 if (dest_texture->IsImmutable()) { |
| 16097 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, kFunctionName, | 16112 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, kFunctionName, |
| 16098 "texture is immutable"); | 16113 "texture is immutable"); |
| 16099 return; | 16114 return; |
| 16100 } | 16115 } |
| 16101 | 16116 |
| 16102 // Clear the source texture if necessary. | 16117 // Clear the source texture if necessary. |
| 16103 if (!texture_manager()->ClearTextureLevel(this, source_texture_ref, | 16118 if (!texture_manager()->ClearTextureLevel(this, source_texture_ref, |
| 16104 source_target, 0)) { | 16119 source_target, 0)) { |
| 16105 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, kFunctionName, "dimensions too big"); | 16120 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, kFunctionName, "dimensions too big"); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 16126 dest_height != source_height || | 16141 dest_height != source_height || |
| 16127 dest_internal_format != internal_format || | 16142 dest_internal_format != internal_format || |
| 16128 dest_type_previous != dest_type) { | 16143 dest_type_previous != dest_type) { |
| 16129 // Ensure that the glTexImage2D succeeds. | 16144 // Ensure that the glTexImage2D succeeds. |
| 16130 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(kFunctionName); | 16145 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(kFunctionName); |
| 16131 glBindTexture(dest_target, dest_texture->service_id()); | 16146 glBindTexture(dest_target, dest_texture->service_id()); |
| 16132 glTexImage2D( | 16147 glTexImage2D( |
| 16133 dest_target, 0, TextureManager::AdjustTexInternalFormat( | 16148 dest_target, 0, TextureManager::AdjustTexInternalFormat( |
| 16134 feature_info_.get(), internal_format), | 16149 feature_info_.get(), internal_format), |
| 16135 source_width, source_height, 0, | 16150 source_width, source_height, 0, |
| 16136 TextureManager::AdjustTexFormat(feature_info_.get(), internal_format), | 16151 TextureManager::AdjustTexFormat(feature_info_.get(), format), |
| 16137 dest_type, NULL); | 16152 dest_type, NULL); |
| 16138 GLenum error = LOCAL_PEEK_GL_ERROR(kFunctionName); | 16153 GLenum error = LOCAL_PEEK_GL_ERROR(kFunctionName); |
| 16139 if (error != GL_NO_ERROR) { | 16154 if (error != GL_NO_ERROR) { |
| 16140 RestoreCurrentTextureBindings(&state_, dest_target); | 16155 RestoreCurrentTextureBindings(&state_, dest_target); |
| 16141 return; | 16156 return; |
| 16142 } | 16157 } |
| 16143 | 16158 |
| 16144 texture_manager()->SetLevelInfo( | 16159 texture_manager()->SetLevelInfo( |
| 16145 dest_texture_ref, dest_target, 0, internal_format, source_width, | 16160 dest_texture_ref, dest_target, 0, internal_format, source_width, |
| 16146 source_height, 1, 0, internal_format, dest_type, | 16161 source_height, 1, 0, format, dest_type, |
| 16147 gfx::Rect(source_width, source_height)); | 16162 gfx::Rect(source_width, source_height)); |
| 16148 dest_texture->ApplyFormatWorkarounds(feature_info_.get()); | 16163 dest_texture->ApplyFormatWorkarounds(feature_info_.get()); |
| 16149 } else { | 16164 } else { |
| 16150 texture_manager()->SetLevelCleared(dest_texture_ref, dest_target, 0, | 16165 texture_manager()->SetLevelCleared(dest_texture_ref, dest_target, 0, true); |
| 16151 true); | |
| 16152 } | 16166 } |
| 16153 | 16167 |
| 16154 // Try using GLImage::CopyTexImage when possible. | 16168 // Try using GLImage::CopyTexImage when possible. |
| 16155 bool unpack_premultiply_alpha_change = | 16169 bool unpack_premultiply_alpha_change = |
| 16156 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; | 16170 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; |
| 16157 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { | 16171 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { |
| 16158 glBindTexture(dest_target, dest_texture->service_id()); | 16172 glBindTexture(dest_target, dest_texture->service_id()); |
| 16159 if (image->CopyTexImage(dest_target)) | 16173 if (image->CopyTexImage(dest_target)) |
| 16160 return; | 16174 return; |
| 16161 } | 16175 } |
| 16162 | 16176 |
| 16163 DoCopyTexImageIfNeeded(source_texture, source_target); | 16177 DoCopyTexImageIfNeeded(source_texture, source_target); |
| 16164 | 16178 |
| 16165 // GL_TEXTURE_EXTERNAL_OES texture requires that we apply a transform matrix | 16179 // GL_TEXTURE_EXTERNAL_OES texture requires that we apply a transform matrix |
| 16166 // before presenting. | 16180 // before presenting. |
| 16167 if (source_target == GL_TEXTURE_EXTERNAL_OES) { | 16181 if (source_target == GL_TEXTURE_EXTERNAL_OES) { |
| 16168 if (GLStreamTextureImage* image = | 16182 if (GLStreamTextureImage* image = |
| 16169 source_texture->GetLevelStreamTextureImage(GL_TEXTURE_EXTERNAL_OES, | 16183 source_texture->GetLevelStreamTextureImage(GL_TEXTURE_EXTERNAL_OES, |
| 16170 0)) { | 16184 0)) { |
| 16171 GLfloat transform_matrix[16]; | 16185 GLfloat transform_matrix[16]; |
| 16172 image->GetTextureMatrix(transform_matrix); | 16186 image->GetTextureMatrix(transform_matrix); |
| 16173 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( | 16187 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( |
| 16174 this, source_target, source_texture->service_id(), dest_target, | 16188 this, source_target, source_texture->service_id(), dest_target, |
| 16175 dest_texture->service_id(), source_width, source_height, | 16189 dest_texture->service_id(), source_width, source_height, |
| 16176 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE, | 16190 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE, |
| 16177 unpack_unmultiply_alpha == GL_TRUE, transform_matrix); | 16191 unpack_unmultiply_alpha == GL_TRUE, transform_matrix); |
| 16178 return; | 16192 return; |
| 16179 } | 16193 } |
| 16180 } | 16194 } |
| 16181 copy_texture_CHROMIUM_->DoCopyTexture( | 16195 if (legacy_format_valid) { |
| 16182 this, source_target, source_texture->service_id(), source_internal_format, | 16196 copy_texture_CHROMIUM_->DoCopyTexture( |
| 16183 dest_target, dest_texture->service_id(), internal_format, source_width, | 16197 this, source_target, source_texture->service_id(), |
| 16184 source_height, unpack_flip_y == GL_TRUE, | 16198 source_internal_format, dest_target, dest_texture->service_id(), |
| 16185 unpack_premultiply_alpha == GL_TRUE, unpack_unmultiply_alpha == GL_TRUE); | 16199 internal_format, source_width, source_height, unpack_flip_y == GL_TRUE, |
| 16200 unpack_premultiply_alpha == GL_TRUE, | |
| 16201 unpack_unmultiply_alpha == GL_TRUE); | |
| 16202 } else if (copy_tex_image_format_valid) { | |
| 16203 copy_texture_CHROMIUM_->DoCopyTexImage2D( | |
| 16204 this, source_target, source_texture->service_id(), | |
| 16205 dest_target, dest_texture->service_id(), | |
| 16206 internal_format, source_width, source_height); | |
| 16207 } else { | |
| 16208 NOTIMPLEMENTED(); | |
| 16209 } | |
| 16186 } | 16210 } |
| 16187 | 16211 |
| 16188 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( | 16212 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( |
| 16189 GLuint source_id, | 16213 GLuint source_id, |
| 16190 GLuint dest_id, | 16214 GLuint dest_id, |
| 16191 GLint xoffset, | 16215 GLint xoffset, |
| 16192 GLint yoffset, | 16216 GLint yoffset, |
| 16193 GLint x, | 16217 GLint x, |
| 16194 GLint y, | 16218 GLint y, |
| 16195 GLsizei width, | 16219 GLsizei width, |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16277 "destination texture is not defined"); | 16301 "destination texture is not defined"); |
| 16278 return; | 16302 return; |
| 16279 } | 16303 } |
| 16280 if (!dest_texture->ValidForTexture(dest_target, 0, xoffset, | 16304 if (!dest_texture->ValidForTexture(dest_target, 0, xoffset, |
| 16281 yoffset, 0, width, height, 1)) { | 16305 yoffset, 0, width, height, 1)) { |
| 16282 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, | 16306 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, kFunctionName, |
| 16283 "destination texture bad dimensions."); | 16307 "destination texture bad dimensions."); |
| 16284 return; | 16308 return; |
| 16285 } | 16309 } |
| 16286 | 16310 |
| 16287 if (!ValidateCopyTextureCHROMIUMInternalFormats( | 16311 bool legacy_format_valid = ValidateCopyTextureCHROMIUMInternalFormats( |
| 16288 kFunctionName, source_texture_ref, dest_internal_format)) { | 16312 kFunctionName, source_texture_ref, dest_internal_format); |
| 16313 bool source_format_color_renderable = Texture::ColorRenderable( | |
| 16314 GetFeatureInfo(), source_internal_format, source_texture->IsImmutable()); | |
| 16315 std::string err_msg; | |
| 16316 bool copy_tex_image_format_valid = source_format_color_renderable && | |
| 16317 source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D && | |
| 16318 ValidateCopyTexFormatHelper(dest_internal_format, | |
| 16319 source_internal_format, source_type, err_msg); | |
| 16320 if (!legacy_format_valid && !copy_tex_image_format_valid) { | |
| 16321 std::string msg = "source internal format(" + | |
| 16322 GLES2Util::GetStringEnum(source_internal_format) + | |
| 16323 ") and destination internal format(" + | |
| 16324 GLES2Util::GetStringEnum(dest_internal_format) + | |
| 16325 ") combination is invalid."; | |
| 16326 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, kFunctionName, | |
| 16327 msg.c_str()); | |
| 16289 return; | 16328 return; |
| 16290 } | 16329 } |
| 16291 | 16330 |
| 16292 // Clear the source texture if necessary. | 16331 // Clear the source texture if necessary. |
| 16293 if (!texture_manager()->ClearTextureLevel(this, source_texture_ref, | 16332 if (!texture_manager()->ClearTextureLevel(this, source_texture_ref, |
| 16294 source_target, 0)) { | 16333 source_target, 0)) { |
| 16295 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, kFunctionName, | 16334 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, kFunctionName, |
| 16296 "source texture dimensions too big"); | 16335 "source texture dimensions too big"); |
| 16297 return; | 16336 return; |
| 16298 } | 16337 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16355 copy_texture_CHROMIUM_->DoCopySubTextureWithTransform( | 16394 copy_texture_CHROMIUM_->DoCopySubTextureWithTransform( |
| 16356 this, source_target, source_texture->service_id(), | 16395 this, source_target, source_texture->service_id(), |
| 16357 source_internal_format, dest_target, dest_texture->service_id(), | 16396 source_internal_format, dest_target, dest_texture->service_id(), |
| 16358 dest_internal_format, xoffset, yoffset, x, y, width, height, | 16397 dest_internal_format, xoffset, yoffset, x, y, width, height, |
| 16359 dest_width, dest_height, source_width, source_height, | 16398 dest_width, dest_height, source_width, source_height, |
| 16360 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE, | 16399 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE, |
| 16361 unpack_unmultiply_alpha == GL_TRUE, transform_matrix); | 16400 unpack_unmultiply_alpha == GL_TRUE, transform_matrix); |
| 16362 return; | 16401 return; |
| 16363 } | 16402 } |
| 16364 } | 16403 } |
| 16365 copy_texture_CHROMIUM_->DoCopySubTexture( | 16404 if (legacy_format_valid) { |
| 16366 this, source_target, source_texture->service_id(), source_internal_format, | 16405 copy_texture_CHROMIUM_->DoCopySubTexture( |
| 16367 dest_target, dest_texture->service_id(), dest_internal_format, xoffset, | 16406 this, source_target, source_texture->service_id(), |
| 16368 yoffset, x, y, width, height, dest_width, dest_height, source_width, | 16407 source_internal_format, dest_target, dest_texture->service_id(), |
| 16369 source_height, unpack_flip_y == GL_TRUE, | 16408 dest_internal_format, xoffset, yoffset, x, y, width, height, |
| 16370 unpack_premultiply_alpha == GL_TRUE, unpack_unmultiply_alpha == GL_TRUE); | 16409 dest_width, dest_height, source_width, |
| 16410 source_height, unpack_flip_y == GL_TRUE, | |
| 16411 unpack_premultiply_alpha == GL_TRUE, | |
| 16412 unpack_unmultiply_alpha == GL_TRUE); | |
| 16413 } else if (copy_tex_image_format_valid) { | |
| 16414 copy_texture_CHROMIUM_->DoCopyTexSubImage2D( | |
| 16415 this, source_target, source_texture->service_id(), | |
| 16416 dest_target, dest_texture->service_id(), | |
| 16417 xoffset, yoffset, x, y, width, height); | |
| 16418 } else { | |
| 16419 NOTIMPLEMENTED(); | |
| 16420 } | |
| 16371 } | 16421 } |
| 16372 | 16422 |
| 16373 bool GLES2DecoderImpl::InitializeCopyTexImageBlitter( | 16423 bool GLES2DecoderImpl::InitializeCopyTexImageBlitter( |
| 16374 const char* function_name) { | 16424 const char* function_name) { |
| 16375 if (!copy_tex_image_blit_.get()) { | 16425 if (!copy_tex_image_blit_.get()) { |
| 16376 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(function_name); | 16426 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(function_name); |
| 16377 copy_tex_image_blit_.reset( | 16427 copy_tex_image_blit_.reset( |
| 16378 new CopyTexImageResourceManager(feature_info_.get())); | 16428 new CopyTexImageResourceManager(feature_info_.get())); |
| 16379 copy_tex_image_blit_->Initialize(this); | 16429 copy_tex_image_blit_->Initialize(this); |
| 16380 if (LOCAL_PEEK_GL_ERROR(function_name) != GL_NO_ERROR) | 16430 if (LOCAL_PEEK_GL_ERROR(function_name) != GL_NO_ERROR) |
| (...skipping 2405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 18786 } | 18836 } |
| 18787 | 18837 |
| 18788 // Include the auto-generated part of this file. We split this because it means | 18838 // Include the auto-generated part of this file. We split this because it means |
| 18789 // we can easily edit the non-auto generated parts right here in this file | 18839 // we can easily edit the non-auto generated parts right here in this file |
| 18790 // instead of having to edit some template or the code generator. | 18840 // instead of having to edit some template or the code generator. |
| 18791 #include "base/macros.h" | 18841 #include "base/macros.h" |
| 18792 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 18842 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 18793 | 18843 |
| 18794 } // namespace gles2 | 18844 } // namespace gles2 |
| 18795 } // namespace gpu | 18845 } // namespace gpu |
| OLD | NEW |