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 82e9052c63b7cc621771c35f4c0442676194ed3a..16a1ce59950a27d4c3d28a29be9d136e13c7c82f 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -3165,6 +3165,8 @@ Capabilities GLES2DecoderImpl::GetCapabilities() { |
caps.egl_image_external = |
feature_info_->feature_flags().oes_egl_image_external; |
+ caps.texture_format_astc = |
+ feature_info_->feature_flags().ext_texture_format_astc; |
caps.texture_format_atc = |
feature_info_->feature_flags().ext_texture_format_atc; |
caps.texture_format_bgra8888 = |
@@ -6937,7 +6939,6 @@ bool GLES2DecoderImpl::PrepareTexturesForRender() { |
!texture_manager()->HaveImages()) { |
return true; |
} |
- |
bool textures_set = false; |
const Program::SamplerIndices& sampler_indices = |
state_.current_program->sampler_indices(); |
@@ -9214,12 +9215,34 @@ bool GLES2DecoderImpl::ClearLevel(Texture* texture, |
namespace { |
+const int kASTCBlockSize = 16; |
const int kS3TCBlockWidth = 4; |
const int kS3TCBlockHeight = 4; |
const int kS3TCDXT1BlockSize = 8; |
const int kS3TCDXT3AndDXT5BlockSize = 16; |
const int kEACAndETC2BlockSize = 4; |
+typedef struct { |
+ int blockWidth; |
+ int blockHeight; |
+} ASTCBlockArray; |
+ |
+const ASTCBlockArray kASTCBlockArray[] = { |
+ {4, 4}, /* GL_COMPRESSED_RGBA_ASTC_4x4_KHR */ |
+ {5, 4}, /* and GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR */ |
+ {5, 5}, |
+ {6, 5}, |
+ {6, 6}, |
+ {8, 5}, |
+ {8, 6}, |
+ {8, 8}, |
+ {10, 5}, |
+ {10, 6}, |
+ {10, 8}, |
+ {10, 10}, |
+ {12, 10}, |
+ {12, 12}}; |
+ |
bool IsValidDXTSize(GLint level, GLsizei size) { |
return (size == 1) || |
(size == 2) || !(size % kS3TCBlockWidth); |
@@ -9247,6 +9270,49 @@ bool GLES2DecoderImpl::GetCompressedTexSizeInBytes( |
(height + kS3TCBlockHeight - 1) / kS3TCBlockHeight; |
bytes_required *= kS3TCDXT1BlockSize; |
break; |
+ case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: { |
+ const int index = (format < GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR) ? |
+ static_cast<int>(format - GL_COMPRESSED_RGBA_ASTC_4x4_KHR) : |
+ static_cast<int>(format - GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR); |
+ |
+ const int kBlockWidth = kASTCBlockArray[index].blockWidth; |
+ const int kBlockHeight = kASTCBlockArray[index].blockHeight; |
+ |
+ bytes_required = |
+ (width + kBlockWidth - 1) / kBlockWidth; |
+ bytes_required *= |
+ (height + kBlockHeight - 1) / kBlockHeight; |
+ |
+ bytes_required *= kASTCBlockSize; |
+ break; |
+ } |
case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: |
case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: |
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: |
@@ -9347,6 +9413,34 @@ bool GLES2DecoderImpl::ValidateCompressedTexDimensions( |
return false; |
} |
return true; |
+ case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: |
+ case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: |
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: |
case GL_ATC_RGB_AMD: |
case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: |
case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: |
@@ -9552,7 +9646,6 @@ error::Error GLES2DecoderImpl::DoCompressedTexImage2D( |
"glCompressedTexImage2D", "texture is immutable"); |
return error::kNoError; |
} |
- |
if (!ValidateCompressedTexDimensions("glCompressedTexImage2D", target, level, |
width, height, 1, internal_format) || |
!ValidateCompressedTexFuncData("glCompressedTexImage2D", width, height, |