Index: gpu/command_buffer/client/gles2_implementation.cc |
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc |
index 0da78bcf19e1b95aa67024383ddda891e37e9eb4..1d797d8519aa0bc49cf3e25ab4dda564d7856875 100644 |
--- a/gpu/command_buffer/client/gles2_implementation.cc |
+++ b/gpu/command_buffer/client/gles2_implementation.cc |
@@ -2103,6 +2103,25 @@ void GLES2Implementation::ReadPixels( |
SetGLError(GL_INVALID_VALUE, "glReadPixels", "size too large."); |
return; |
} |
+ |
+ if (bound_pixel_unpack_transfer_buffer_id_) { |
greggman
2013/03/19 20:54:11
As pointed out else where, "unpack" is for providi
hubbe
2013/03/19 22:42:42
Done.
|
+ GLuint offset = ToGLuint(pixels); |
+ BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid( |
+ "glReadPixels", offset, temp_size); |
+ if (buffer) { |
+ helper_->ReadPixels(xoffset, yoffset, width, height, format, type, |
+ buffer->shm_id(), buffer->shm_offset(), |
+ 0, 0); |
+ buffer->set_transfer_ready_token(helper_->InsertToken()); |
+ } |
+ return; |
apatrick_chromium
2013/03/19 18:34:48
Should this not generate INVALID_OPERATION?
hubbe
2013/03/19 22:42:42
Done. (And in other similar places)
|
+ } |
+ |
+ if (!pixels) { |
+ SetGLError(GL_INVALID_VALUE, "glReadPixels", "pixels = NULL"); |
+ return; |
+ } |
+ |
// Transfer by rows. |
// The max rows we can transfer. |
while (height) { |
@@ -3304,7 +3323,7 @@ void* GLES2Implementation::MapBufferCHROMIUM(GLuint target, GLenum access) { |
GL_INVALID_ENUM, "glMapBufferCHROMIUM", "invalid target"); |
return NULL; |
} |
- if (access != GL_WRITE_ONLY) { |
+ if (access != GL_WRITE_ONLY && access != GL_READ_ONLY) { |
SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode"); |
return NULL; |
} |
@@ -3318,6 +3337,10 @@ void* GLES2Implementation::MapBufferCHROMIUM(GLuint target, GLenum access) { |
SetGLError(GL_INVALID_OPERATION, "glMapBufferCHROMIUM", "already mapped"); |
return NULL; |
} |
+ if (buffer->transfer_ready_token()) { |
greggman
2013/03/19 20:54:11
It seems like if you're going to add this check yo
hubbe
2013/03/19 22:42:42
I can do it either way.
I think I prefer implement
|
+ helper_->WaitForToken(buffer->transfer_ready_token()); |
+ buffer->set_transfer_ready_token(0); |
+ } |
buffer->set_mapped(true); |
GPU_DCHECK(buffer->address()); |