| 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 d0b040b06c411efcaa04fd216fc6b861b61417ea..d325dfe9f00c9d971b32898a08d19c0c839a530c 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -7906,15 +7906,17 @@ const int kS3TCBlockWidth = 4;
|
| const int kS3TCBlockHeight = 4;
|
| const int kS3TCDXT1BlockSize = 8;
|
| const int kS3TCDXT3AndDXT5BlockSize = 16;
|
| -const int kETC1BlockWidth = 4;
|
| -const int kETC1BlockHeight = 4;
|
| -const int kETC1BlockSize = 8;
|
|
|
| bool IsValidDXTSize(GLint level, GLsizei size) {
|
| return (size == 1) ||
|
| (size == 2) || !(size % kS3TCBlockWidth);
|
| }
|
|
|
| +bool IsValidPVRTCSize(GLint level, GLsizei size) {
|
| + // Ensure that the size is a power of two
|
| + return (size & (size - 1)) == 0;
|
| +}
|
| +
|
| } // anonymous namespace.
|
|
|
| bool GLES2DecoderImpl::ValidateCompressedTexFuncData(
|
| @@ -7923,8 +7925,10 @@ bool GLES2DecoderImpl::ValidateCompressedTexFuncData(
|
| unsigned int bytes_required = 0;
|
|
|
| switch (format) {
|
| + case GL_ATC_RGB_AMD:
|
| case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
|
| - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: {
|
| + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
|
| + case GL_ETC1_RGB8_OES: {
|
| int num_blocks_across =
|
| (width + kS3TCBlockWidth - 1) / kS3TCBlockWidth;
|
| int num_blocks_down =
|
| @@ -7933,6 +7937,8 @@ bool GLES2DecoderImpl::ValidateCompressedTexFuncData(
|
| bytes_required = num_blocks * kS3TCDXT1BlockSize;
|
| break;
|
| }
|
| + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
|
| + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
|
| case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
|
| case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: {
|
| int num_blocks_across =
|
| @@ -7943,13 +7949,14 @@ bool GLES2DecoderImpl::ValidateCompressedTexFuncData(
|
| bytes_required = num_blocks * kS3TCDXT3AndDXT5BlockSize;
|
| break;
|
| }
|
| - case GL_ETC1_RGB8_OES: {
|
| - int num_blocks_across =
|
| - (width + kETC1BlockWidth - 1) / kETC1BlockWidth;
|
| - int num_blocks_down =
|
| - (height + kETC1BlockHeight - 1) / kETC1BlockHeight;
|
| - int num_blocks = num_blocks_across * num_blocks_down;
|
| - bytes_required = num_blocks * kETC1BlockSize;
|
| + case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
|
| + case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: {
|
| + bytes_required = (std::max(width, 8) * std::max(height, 8) * 4 + 7)/8;
|
| + break;
|
| + }
|
| + case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
|
| + case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: {
|
| + bytes_required = (std::max(width, 16) * std::max(height, 8) * 2 + 7)/8;
|
| break;
|
| }
|
| default:
|
| @@ -7982,7 +7989,10 @@ bool GLES2DecoderImpl::ValidateCompressedTexDimensions(
|
| }
|
| return true;
|
| }
|
| - case GL_ETC1_RGB8_OES:
|
| + case GL_ATC_RGB_AMD:
|
| + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
|
| + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
|
| + case GL_ETC1_RGB8_OES: {
|
| if (width <= 0 || height <= 0) {
|
| LOCAL_SET_GL_ERROR(
|
| GL_INVALID_OPERATION, function_name,
|
| @@ -7990,6 +8000,20 @@ bool GLES2DecoderImpl::ValidateCompressedTexDimensions(
|
| return false;
|
| }
|
| return true;
|
| + }
|
| + case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
|
| + case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
|
| + case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
|
| + case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: {
|
| + if (!IsValidPVRTCSize(level, width) ||
|
| + !IsValidPVRTCSize(level, height)) {
|
| + LOCAL_SET_GL_ERROR(
|
| + GL_INVALID_OPERATION, function_name,
|
| + "width or height invalid for level");
|
| + return false;
|
| + }
|
| + return true;
|
| + }
|
| default:
|
| return false;
|
| }
|
| @@ -8031,12 +8055,43 @@ bool GLES2DecoderImpl::ValidateCompressedTexSubDimensions(
|
| return ValidateCompressedTexDimensions(
|
| function_name, level, width, height, format);
|
| }
|
| + case GL_ATC_RGB_AMD:
|
| + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
|
| + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: {
|
| + LOCAL_SET_GL_ERROR(
|
| + GL_INVALID_OPERATION, function_name,
|
| + "not supported for ATC textures");
|
| + return false;
|
| + }
|
| case GL_ETC1_RGB8_OES: {
|
| LOCAL_SET_GL_ERROR(
|
| GL_INVALID_OPERATION, function_name,
|
| "not supported for ECT1_RGB8_OES textures");
|
| return false;
|
| }
|
| + case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
|
| + case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
|
| + case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
|
| + case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: {
|
| + if ((xoffset != 0) || (yoffset != 0)) {
|
| + LOCAL_SET_GL_ERROR(
|
| + GL_INVALID_OPERATION, function_name,
|
| + "xoffset and yoffset must be zero");
|
| + return false;
|
| + }
|
| + GLsizei tex_width = 0;
|
| + GLsizei tex_height = 0;
|
| + if (!texture->GetLevelSize(target, level, &tex_width, &tex_height) ||
|
| + width != tex_width ||
|
| + height != tex_height) {
|
| + LOCAL_SET_GL_ERROR(
|
| + GL_INVALID_OPERATION, function_name,
|
| + "dimensions must match existing texture level dimensions");
|
| + return false;
|
| + }
|
| + return ValidateCompressedTexDimensions(
|
| + function_name, level, width, height, format);
|
| + }
|
| default:
|
| return false;
|
| }
|
|
|