| Index: cc/scheduler/texture_uploader.cc
|
| diff --git a/cc/scheduler/texture_uploader.cc b/cc/scheduler/texture_uploader.cc
|
| index 920c38e669275d0992d6b5166a1683464aecaad4..c24b2c47f760efc9383eca6e11c1cc9fd340ae5a 100644
|
| --- a/cc/scheduler/texture_uploader.cc
|
| +++ b/cc/scheduler/texture_uploader.cc
|
| @@ -77,13 +77,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_16_bit_textures)
|
| : 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_16_bit_textures_(use_16_bit_textures) {
|
| for (size_t i = kUploadHistorySizeInitial; i > 0; i--)
|
| textures_per_second_history_.insert(kDefaultEstimatedTexturesPerSecond);
|
| }
|
| @@ -207,11 +209,13 @@ void TextureUploader::UploadWithTexSubImage(const uint8* image,
|
| gfx::Vector2d offset(source_rect.origin() - image_rect.origin());
|
|
|
| const uint8* pixel_source;
|
| - unsigned int bytes_per_pixel = Resource::BytesPerPixel(format);
|
| + unsigned int bytes_per_pixel = Resource::BytesPerPixel(format,
|
| + use_16_bit_textures_);
|
| + // TODO(kaanb): anything to do to GL_UNPACK_ALIGNMENT for 16_bit?
|
| // Use 4-byte row alignment (OpenGL default) for upload performance.
|
| // Assuming that GL_UNPACK_ALIGNMENT has not changed from default.
|
| unsigned int upload_image_stride =
|
| - RoundUp(bytes_per_pixel * source_rect.width(), 4u);
|
| + RoundUp(bytes_per_pixel * source_rect.width(), bytes_per_pixel);
|
|
|
| if (upload_image_stride == image_rect.width() * bytes_per_pixel &&
|
| !offset.x()) {
|
| @@ -233,6 +237,8 @@ void TextureUploader::UploadWithTexSubImage(const uint8* image,
|
| pixel_source = &sub_image_[0];
|
| }
|
|
|
| + GLenum texture_data_type = use_16_bit_textures_
|
| + ? GL_UNSIGNED_SHORT_4_4_4_4 : GL_UNSIGNED_BYTE;
|
| context_->texSubImage2D(GL_TEXTURE_2D,
|
| 0,
|
| dest_offset.x(),
|
| @@ -240,7 +246,7 @@ void TextureUploader::UploadWithTexSubImage(const uint8* image,
|
| source_rect.width(),
|
| source_rect.height(),
|
| format,
|
| - GL_UNSIGNED_BYTE,
|
| + texture_data_type,
|
| pixel_source);
|
| }
|
|
|
| @@ -277,12 +283,16 @@ void TextureUploader::UploadWithMapTexSubImage(const uint8* image,
|
| // Offset from image-rect to source-rect.
|
| gfx::Vector2d offset(source_rect.origin() - image_rect.origin());
|
|
|
| - unsigned int bytes_per_pixel = Resource::BytesPerPixel(format);
|
| + unsigned int bytes_per_pixel = Resource::BytesPerPixel(format,
|
| + use_16_bit_textures_);
|
| + // TODO(kaanb): anything to do to GL_UNPACK_ALIGNMENT for 16 bit?
|
| // Use 4-byte row alignment (OpenGL default) for upload performance.
|
| // Assuming that GL_UNPACK_ALIGNMENT has not changed from default.
|
| unsigned int upload_image_stride =
|
| - RoundUp(bytes_per_pixel * source_rect.width(), 4u);
|
| + RoundUp(bytes_per_pixel * source_rect.width(), bytes_per_pixel);
|
|
|
| + GLenum texture_data_type = use_16_bit_textures_
|
| + ? GL_UNSIGNED_SHORT_4_4_4_4 : GL_UNSIGNED_BYTE;
|
| // Upload tile data via a mapped transfer buffer
|
| uint8* pixel_dest = static_cast<uint8*>(
|
| context_->mapTexSubImage2DCHROMIUM(GL_TEXTURE_2D,
|
| @@ -292,7 +302,7 @@ void TextureUploader::UploadWithMapTexSubImage(const uint8* image,
|
| source_rect.width(),
|
| source_rect.height(),
|
| format,
|
| - GL_UNSIGNED_BYTE,
|
| + texture_data_type,
|
| GL_WRITE_ONLY));
|
|
|
| if (!pixel_dest) {
|
|
|