Chromium Code Reviews| Index: cc/scheduler/texture_uploader.cc |
| diff --git a/cc/scheduler/texture_uploader.cc b/cc/scheduler/texture_uploader.cc |
| index cebc98689118949bb9081a33b215552133db0aa4..3bafa194d31c558f35c72688496c0855ec4c97a9 100644 |
| --- a/cc/scheduler/texture_uploader.cc |
| +++ b/cc/scheduler/texture_uploader.cc |
| @@ -76,13 +76,15 @@ unsigned TextureUploader::Query::Value() { |
| TextureUploader::TextureUploader(WebKit::WebGraphicsContext3D* context, |
| bool use_map_tex_sub_image, |
| - bool use_shallow_flush) |
| + bool use_shallow_flush, |
| + bool use_compressed_texture_etc1) |
| : context_(context), |
| num_blocking_texture_uploads_(0), |
| use_map_tex_sub_image_(use_map_tex_sub_image), |
| sub_image_size_(0), |
| use_shallow_flush_(use_shallow_flush), |
| - num_texture_uploads_since_last_flush_(0) { |
| + num_texture_uploads_since_last_flush_(0), |
| + use_compressed_texture_etc1_(use_compressed_texture_etc1) { |
|
no sievers
2013/10/23 20:33:15
nit: I'd rename this to 'have_compressed_texture_e
powei
2013/10/23 22:20:07
Done. Removed.
|
| for (size_t i = kUploadHistorySizeInitial; i > 0; i--) |
| textures_per_second_history_.insert(kDefaultEstimatedTexturesPerSecond); |
| } |
| @@ -186,11 +188,17 @@ void TextureUploader::UploadWithTexSubImage(const uint8* image, |
| return; |
| DCHECK(image); |
| + if (format == ETC1) { |
| + UploadWithTexSubImageETC1( |
| + image, image_rect, source_rect, dest_offset, format); |
| + return; |
| + } |
| + |
| // Offset from image-rect to source-rect. |
| gfx::Vector2d offset(source_rect.origin() - image_rect.origin()); |
| const uint8* pixel_source; |
| - unsigned bytes_per_pixel = BytesPerPixel(format); |
| + unsigned bytes_per_pixel = BitsPerPixel(format) / 8; |
|
kaanb
2013/10/23 20:30:09
could you keep a BytesPerPixel method in resource_
powei
2013/10/23 22:20:07
Done.
|
| // Use 4-byte row alignment (OpenGL default) for upload performance. |
| // Assuming that GL_UNPACK_ALIGNMENT has not changed from default. |
| unsigned upload_image_stride = |
| @@ -239,11 +247,13 @@ void TextureUploader::UploadWithMapTexSubImage(const uint8* image, |
| if (source_rect.IsEmpty()) |
| return; |
| DCHECK(image); |
| + // Compressed textures have no implementation of mapTexSubImage. |
| + DCHECK_NE(ETC1, format); |
| // Offset from image-rect to source-rect. |
| gfx::Vector2d offset(source_rect.origin() - image_rect.origin()); |
| - unsigned bytes_per_pixel = BytesPerPixel(format); |
| + unsigned bytes_per_pixel = BitsPerPixel(format) / 8; |
| // Use 4-byte row alignment (OpenGL default) for upload performance. |
| // Assuming that GL_UNPACK_ALIGNMENT has not changed from default. |
| unsigned upload_image_stride = |
| @@ -285,6 +295,34 @@ void TextureUploader::UploadWithMapTexSubImage(const uint8* image, |
| context_->unmapTexSubImage2DCHROMIUM(pixel_dest); |
| } |
| +void TextureUploader::UploadWithTexSubImageETC1(const uint8* image, |
| + gfx::Rect image_rect, |
| + gfx::Rect source_rect, |
| + gfx::Vector2d dest_offset, |
| + ResourceFormat format) { |
| + TRACE_EVENT0("cc", "TextureUploader::UploadWithTexSubImageETC1"); |
| + DCHECK(use_compressed_texture_etc1_); |
| + // ETC1 does not support subimage uploads yet. |
| + DCHECK(image_rect == source_rect); |
| + DCHECK_EQ(0, dest_offset.x()); |
| + DCHECK_EQ(0, dest_offset.y()); |
| + |
| + gfx::Size size = source_rect.size(); |
| + DCHECK_EQ(0, size.width() % 4); |
| + DCHECK_EQ(0, size.height() % 4); |
| + |
| + context_->compressedTexSubImage2D( |
|
no sievers
2013/10/23 20:33:15
Wait, I'm confused. Like your comment says above,
powei
2013/10/23 22:20:07
Done. My comment above was to discourage users fr
|
| + GL_TEXTURE_2D, |
| + 0, /* level */ |
| + 0, /* x */ |
| + 0, /* y */ |
| + size.width(), |
| + size.height(), |
| + GLDataFormat(format), |
| + Resource::MemorySizeBytes(size, format), |
| + image); |
| +} |
| + |
| void TextureUploader::ProcessQueries() { |
| while (!pending_queries_.empty()) { |
| if (pending_queries_.front()->IsPending()) |