| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| index c7fab686353c00671275af1f55d6f70938779f3e..58e742e69c751bd914a4d988b3e7b6dc0aa0fc41 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -7538,10 +7538,12 @@ void GLES2DecoderImpl::FinishReadPixels(
|
| if (buffer != 0) {
|
| glDeleteBuffersARB(1, &buffer);
|
| }
|
| + if (result)
|
| + *result = GL_INVALID_VALUE;
|
| return;
|
| }
|
|
|
| - if (buffer != 0) {
|
| + if (buffer != 0) { // Asynchronous readback path.
|
| glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer);
|
| void* data;
|
| if (features().map_buffer_range) {
|
| @@ -7550,16 +7552,17 @@ void GLES2DecoderImpl::FinishReadPixels(
|
| } else {
|
| data = glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY);
|
| }
|
| - memcpy(pixels, data, pixels_size);
|
| + if (result)
|
| + *result = glGetError();
|
| + if (data)
|
| + memcpy(pixels, data, pixels_size);
|
| // GL_PIXEL_PACK_BUFFER_ARB is currently unused, so we don't
|
| // have to restore the state.
|
| glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB);
|
| glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);
|
| glDeleteBuffersARB(1, &buffer);
|
| - }
|
| -
|
| - if (result != NULL) {
|
| - *result = true;
|
| + if (!data)
|
| + return;
|
| }
|
|
|
| GLenum read_format = GetBoundReadFrameBufferInternalFormat();
|
| @@ -7574,6 +7577,8 @@ void GLES2DecoderImpl::FinishReadPixels(
|
| if (!GLES2Util::ComputeImageDataSizes(
|
| width, 2, format, type, state_.pack_alignment, &temp_size,
|
| &unpadded_row_size, &padded_row_size)) {
|
| + if (result)
|
| + *result = GL_INVALID_VALUE;
|
| return;
|
| }
|
|
|
| @@ -7751,17 +7756,25 @@ error::Error GLES2DecoderImpl::HandleReadPixels(uint32 immediate_data_size,
|
| GLuint buffer = 0;
|
| glGenBuffersARB(1, &buffer);
|
| glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer);
|
| - glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, GL_STREAM_READ);
|
| + // For ANGLE client version 2, GL_STREAM_READ is not available.
|
| + const GLenum usage_hint =
|
| + features().is_angle ? GL_STATIC_DRAW : GL_STREAM_READ;
|
| + glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, usage_hint);
|
| GLenum error = glGetError();
|
| if (error == GL_NO_ERROR) {
|
| glReadPixels(x, y, width, height, format, type, 0);
|
| - pending_readpixel_fences_.push(linked_ptr<FenceCallback>(
|
| - new FenceCallback()));
|
| - WaitForReadPixels(base::Bind(
|
| - &GLES2DecoderImpl::FinishReadPixels,
|
| - base::internal::SupportsWeakPtrBase::StaticAsWeakPtr
|
| - <GLES2DecoderImpl>(this),
|
| - c, buffer));
|
| + error = glGetError();
|
| + if (result)
|
| + *result = error;
|
| + if (error == GL_NO_ERROR) {
|
| + pending_readpixel_fences_.push(linked_ptr<FenceCallback>(
|
| + new FenceCallback()));
|
| + WaitForReadPixels(base::Bind(
|
| + &GLES2DecoderImpl::FinishReadPixels,
|
| + base::internal::SupportsWeakPtrBase::StaticAsWeakPtr
|
| + <GLES2DecoderImpl>(this),
|
| + c, buffer));
|
| + }
|
| glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);
|
| return error::kNoError;
|
| } else {
|
| @@ -7772,13 +7785,11 @@ error::Error GLES2DecoderImpl::HandleReadPixels(uint32 immediate_data_size,
|
| }
|
| glReadPixels(x, y, width, height, format, type, pixels);
|
| }
|
| - GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels");
|
| - if (error == GL_NO_ERROR) {
|
| - if (result != NULL) {
|
| - *result = true;
|
| - }
|
| + const GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels");
|
| + if (result)
|
| + *result = error;
|
| + if (error == GL_NO_ERROR)
|
| FinishReadPixels(c, 0);
|
| - }
|
|
|
| return error::kNoError;
|
| }
|
|
|