Chromium Code Reviews| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| index af0a62f7e1654040e449fcf73891d4a2a83cee72..d0c8614df87fb556febb2e27d39ae4cdaaca45c9 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| @@ -1782,6 +1782,11 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
| GLenum target, |
| TextureRef* source_texture_ref, |
| TextureRef* dest_texture_ref); |
| + bool ValidateCompressedCopySubTextureDimensions( |
|
reveman
2015/12/02 18:28:50
btw, do we still need this? we're not using copysu
christiank
2015/12/03 12:58:00
No we don't need it at the moment. I'll revert the
|
| + const char* function_name, |
| + GLenum target, GLint xoffset, GLint yoffset, |
| + GLsizei width, GLsizei height, GLenum format, |
| + Texture* texture); |
| void RenderWarning(const char* filename, int line, const std::string& msg); |
| void PerformanceWarning( |
| @@ -12732,6 +12737,47 @@ bool GLES2DecoderImpl::ValidateCompressedCopyTextureCHROMIUM( |
| return true; |
| } |
| +bool GLES2DecoderImpl::ValidateCompressedCopySubTextureDimensions( |
| + const char* function_name, |
| + GLenum target, GLint xoffset, GLint yoffset, |
| + GLsizei width, GLsizei height, GLenum format, |
| + Texture* texture) { |
| + if (xoffset < 0 || yoffset < 0) { |
| + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "x/y offset < 0"); |
| + return false; |
| + } |
| + |
| + switch (format) { |
| + case GL_ATC_RGB_AMD: |
| + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: |
| + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: |
| + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: |
| + case GL_ETC1_RGB8_OES: { |
| + const int kBlockWidth = 4; |
| + const int kBlockHeight = 4; |
| + if ((xoffset % kBlockWidth) || (yoffset % kBlockHeight)) { |
| + LOCAL_SET_GL_ERROR( |
| + GL_INVALID_OPERATION, function_name, |
| + "xoffset or yoffset not multiple of 4"); |
| + return false; |
| + } |
| + GLsizei tex_width = 0; |
| + GLsizei tex_height = 0; |
| + if (!texture->GetLevelSize(target, 0, &tex_width, &tex_height, nullptr) || |
| + width - xoffset > tex_width || |
| + height - yoffset > tex_height) { |
| + LOCAL_SET_GL_ERROR( |
| + GL_INVALID_OPERATION, function_name, "dimensions out of range"); |
| + return false; |
| + } |
| + return ValidateCompressedTexDimensions( |
| + function_name, target, 0, width, height, 1, format); |
| + } |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
| GLenum target, |
| GLuint source_id, |
| @@ -13291,16 +13337,18 @@ void GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM(GLenum target, |
| return; |
| } |
| - if (!ValidateCompressedTexSubDimensions("glCompressedCopySubTextureCHROMIUM", |
| - source_texture->target(), 0, x, y, 0, |
| - width, height, 1, |
| - source_internal_format, |
| - source_texture) || |
| - !ValidateCompressedTexSubDimensions("glCompressedCopySubTextureCHROMIUM", |
| - dest_texture->target(), 0, |
| - xoffset, yoffset, 0, width, height, 1, |
| - dest_internal_format, |
| - dest_texture)) { |
| + if (!ValidateCompressedCopySubTextureDimensions( |
| + "glCompressedCopySubTextureCHROMIUM", |
| + source_texture->target(), x, y, |
| + width, height, |
| + source_internal_format, |
| + source_texture) || |
| + !ValidateCompressedCopySubTextureDimensions( |
| + "glCompressedCopySubTextureCHROMIUM", |
| + dest_texture->target(), |
| + xoffset, yoffset, width, height, |
| + dest_internal_format, |
| + dest_texture)) { |
| return; |
| } |