diff options
author | bsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-18 14:33:17 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-18 14:33:17 +0000 |
commit | 45d15a6abdfdca9d86d2cb61fa51cd72a3ccaa89 (patch) | |
tree | fabfcd716441a378036f48f3932fe3cf84135f2e /gpu | |
parent | 55578b0a705008428ef9bdfbcb53f1809a996914 (diff) | |
download | chromium_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.cc | 52 |
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); |