diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-07 01:31:04 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-07 01:31:04 +0000 |
commit | 0b407aea9852913d5a3825de8e9a9db017b49982 (patch) | |
tree | 555f145a2bee0589898defd1304e45958c895fb8 /gpu | |
parent | 8a029d82777476bbebfd6bfd92f55d5c00a1273b (diff) | |
download | chromium_src-0b407aea9852913d5a3825de8e9a9db017b49982.zip chromium_src-0b407aea9852913d5a3825de8e9a9db017b49982.tar.gz chromium_src-0b407aea9852913d5a3825de8e9a9db017b49982.tar.bz2 |
Optimize TexImage2D.
TEST=none
BUG=none
R=apatrick@chromium.org
Review URL: http://codereview.chromium.org/7111024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@88077 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/client/gles2_implementation.cc | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index e03575b..c3d2876 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc @@ -1006,12 +1006,27 @@ void GLES2Implementation::TexImage2D( SetGLError(GL_INVALID_VALUE, "glTexImage2D: image size too large"); return; } - helper_->TexImage2D( - target, level, internalformat, width, height, border, format, type, 0, 0); - if (pixels) { - TexSubImage2DImpl( - target, level, 0, 0, width, height, format, type, pixels, GL_TRUE); + + // Check if we can send it all at once. + unsigned int max_size = transfer_buffer_.GetLargestFreeOrPendingSize(); + if (size > max_size || !pixels) { + // No, so send it using TexSubImage2D. + helper_->TexImage2D( + target, level, internalformat, width, height, border, format, type, + 0, 0); + if (pixels) { + TexSubImage2DImpl( + target, level, 0, 0, width, height, format, type, pixels, GL_TRUE); + } + return; } + + void* buffer = transfer_buffer_.Alloc(size); + memcpy(buffer, pixels, size); + helper_->TexImage2D( + target, level, internalformat, width, height, border, format, type, + transfer_buffer_id_, transfer_buffer_.GetOffset(buffer)); + transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken()); } void GLES2Implementation::TexSubImage2D( |