summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorbsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-18 14:33:17 +0000
committerbsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-18 14:33:17 +0000
commit45d15a6abdfdca9d86d2cb61fa51cd72a3ccaa89 (patch)
treefabfcd716441a378036f48f3932fe3cf84135f2e /gpu
parent55578b0a705008428ef9bdfbcb53f1809a996914 (diff)
downloadchromium_src-45d15a6abdfdca9d86d2cb61fa51cd72a3ccaa89.zip
chromium_src-45d15a6abdfdca9d86d2cb61fa51cd72a3ccaa89.tar.gz
chromium_src-45d15a6abdfdca9d86d2cb61fa51cd72a3ccaa89.tar.bz2
Tile clearing of large textures.
BUG=122920 Review URL: https://chromiumcodereview.appspot.com/10008049 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132791 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc52
1 files changed, 40 insertions, 12 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 68b844f..d4fd8af 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -6453,22 +6453,50 @@ bool GLES2DecoderImpl::ClearLevel(
int width,
int height,
bool is_texture_immutable) {
- // Assumes the size has already been checked.
- uint32 pixels_size = 0;
+ static const uint32 kMaxZeroSize = 1024 * 1024 * 4;
+
+ uint32 size;
+ uint32 padded_row_size;
if (!GLES2Util::ComputeImageDataSizes(
- width, height, format, type, unpack_alignment_, &pixels_size, NULL,
- NULL)) {
+ width, height, format, type, unpack_alignment_, &size,
+ NULL, &padded_row_size)) {
return false;
}
- scoped_array<char> zero(new char[pixels_size]);
- memset(zero.get(), 0, pixels_size);
- glBindTexture(bind_target, service_id);
- if (is_texture_immutable) {
- glTexSubImage2D(
- target, level, 0, 0, width, height, format, type, zero.get());
+
+ int tile_height;
+
+ if (size > kMaxZeroSize) {
+ if (kMaxZeroSize < padded_row_size) {
+ // That'd be an awfully large texture.
+ return false;
+ }
+ // We should never have a large total size with a zero row size.
+ DCHECK_GT(padded_row_size, 0U);
+ tile_height = kMaxZeroSize / padded_row_size;
+ if (!GLES2Util::ComputeImageDataSizes(
+ width, tile_height, format, type, unpack_alignment_, &size, NULL,
+ NULL)) {
+ return false;
+ }
} else {
- WrappedTexImage2D(
- target, level, format, width, height, 0, format, type, zero.get());
+ tile_height = height;
+ }
+
+ // Assumes the size has already been checked.
+ scoped_array<char> zero(new char[size]);
+ memset(zero.get(), 0, size);
+ glBindTexture(bind_target, service_id);
+
+ GLint y = 0;
+ while (y < height) {
+ GLint h = y + tile_height > height ? height - y : tile_height;
+ if (is_texture_immutable || h != height) {
+ glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get());
+ } else {
+ WrappedTexImage2D(
+ target, level, format, width, h, 0, format, type, zero.get());
+ }
+ y += tile_height;
}
TextureManager::TextureInfo* info = GetTextureInfoForTarget(bind_target);
glBindTexture(bind_target, info ? info->service_id() : 0);