| 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; | 
| } | 
|  |