summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-07 01:31:04 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-07 01:31:04 +0000
commit0b407aea9852913d5a3825de8e9a9db017b49982 (patch)
tree555f145a2bee0589898defd1304e45958c895fb8 /gpu
parent8a029d82777476bbebfd6bfd92f55d5c00a1273b (diff)
downloadchromium_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.cc25
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(