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 8be63b095c41b3833ddc5b4f8029d28cf47203c0..6f0d2e8db079242a81d3e81a1c5dcb2d04f1e9c2 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -13677,11 +13677,24 @@ error::Error GLES2DecoderImpl::DoCompressedTexSubImage( |
return error::kNoError; |
} |
- // Note: There is no need to deal with texture cleared tracking here |
- // because the validation above means you can only get here if the level |
- // is already a matching compressed format and in that case |
- // CompressedTexImage{2|3}D already cleared the texture. |
- DCHECK(texture->IsLevelCleared(target, level)); |
+ if (!texture->IsLevelCleared(target, level)) { |
+ // This can only happen if the compressed texture was allocated |
+ // using TexStorage{2|3}D. |
+ DCHECK(texture->IsImmutable()); |
+ GLsizei level_width = 0, level_height = 0, level_depth = 0; |
+ bool success = texture->GetLevelSize( |
+ target, level, &level_width, &level_height, &level_depth); |
+ DCHECK(success); |
+ if (xoffset == 0 && width == level_width && |
+ yoffset == 0 && height == level_height && |
+ zoffset == 0 && depth == level_depth) { |
+ // We can skip the clear if we're uploading the entire level. |
+ texture_manager()->SetLevelCleared(texture_ref, target, level, true); |
+ } else { |
+ texture_manager()->ClearTextureLevel(this, texture_ref, target, level); |
+ } |
+ DCHECK(texture->IsLevelCleared(target, level)); |
+ } |
const CompressedFormatInfo* format_info = |
GetCompressedFormatInfo(internal_format); |