Index: cc/resources/texture_uploader.cc |
diff --git a/cc/resources/texture_uploader.cc b/cc/resources/texture_uploader.cc |
index 601fa8fbff89de41c26075cf1be5d97dff61fdd3..3d0f68163c955969364e1abc519a1dd4a7304f1f 100644 |
--- a/cc/resources/texture_uploader.cc |
+++ b/cc/resources/texture_uploader.cc |
@@ -146,7 +146,14 @@ void TextureUploader::Upload(const uint8* image, |
if (is_full_upload) |
BeginQuery(); |
- UploadWithMapTexSubImage(image, image_rect, source_rect, dest_offset, format); |
+ if (format == ETC1) { |
+ // ETC1 does not support subimage uploads. |
+ DCHECK(is_full_upload); |
+ UploadWithTexImageETC1(image, size); |
+ } else { |
+ UploadWithMapTexSubImage( |
+ image, image_rect, source_rect, dest_offset, format); |
+ } |
if (is_full_upload) |
EndQuery(); |
@@ -284,6 +291,22 @@ void TextureUploader::UploadWithMapTexSubImage(const uint8* image, |
gl_->UnmapTexSubImage2DCHROMIUM(pixel_dest); |
} |
+void TextureUploader::UploadWithTexImageETC1(const uint8* image, |
+ const gfx::Size& size) { |
+ TRACE_EVENT0("cc", "TextureUploader::UploadWithTexImageETC1"); |
+ DCHECK_EQ(0, size.width() % 4); |
+ DCHECK_EQ(0, size.height() % 4); |
+ |
+ gl_->CompressedTexImage2D(GL_TEXTURE_2D, |
+ 0, |
+ GLInternalFormat(ETC1), |
+ size.width(), |
+ size.height(), |
+ 0, |
+ Resource::MemorySizeBytes(size, ETC1), |
+ image); |
+} |
+ |
void TextureUploader::ProcessQueries() { |
while (!pending_queries_.empty()) { |
if (pending_queries_.front()->IsPending()) |