| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <list> | 10 #include <list> |
| (...skipping 7560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7571 | 7571 |
| 7572 if (buffer != 0) { | 7572 if (buffer != 0) { |
| 7573 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer); | 7573 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer); |
| 7574 void* data; | 7574 void* data; |
| 7575 if (features().map_buffer_range) { | 7575 if (features().map_buffer_range) { |
| 7576 data = glMapBufferRange( | 7576 data = glMapBufferRange( |
| 7577 GL_PIXEL_PACK_BUFFER_ARB, 0, pixels_size, GL_MAP_READ_BIT); | 7577 GL_PIXEL_PACK_BUFFER_ARB, 0, pixels_size, GL_MAP_READ_BIT); |
| 7578 } else { | 7578 } else { |
| 7579 data = glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY); | 7579 data = glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY); |
| 7580 } | 7580 } |
| 7581 if (!data) { |
| 7582 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glMapBuffer", |
| 7583 "Unable to map memory for readback."); |
| 7584 return; |
| 7585 } |
| 7581 memcpy(pixels, data, pixels_size); | 7586 memcpy(pixels, data, pixels_size); |
| 7582 // GL_PIXEL_PACK_BUFFER_ARB is currently unused, so we don't | 7587 // GL_PIXEL_PACK_BUFFER_ARB is currently unused, so we don't |
| 7583 // have to restore the state. | 7588 // have to restore the state. |
| 7584 glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); | 7589 glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); |
| 7585 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); | 7590 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); |
| 7586 glDeleteBuffersARB(1, &buffer); | 7591 glDeleteBuffersARB(1, &buffer); |
| 7587 } | 7592 } |
| 7588 | 7593 |
| 7589 if (result != NULL) { | 7594 if (result != NULL) { |
| 7590 *result = true; | 7595 *result = true; |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7772 glReadPixels( | 7777 glReadPixels( |
| 7773 read_x, ry, read_width, 1, format, type, dst + dest_row_offset); | 7778 read_x, ry, read_width, 1, format, type, dst + dest_row_offset); |
| 7774 } | 7779 } |
| 7775 dst += padded_row_size; | 7780 dst += padded_row_size; |
| 7776 } | 7781 } |
| 7777 } else { | 7782 } else { |
| 7778 if (async && features().use_async_readpixels) { | 7783 if (async && features().use_async_readpixels) { |
| 7779 GLuint buffer = 0; | 7784 GLuint buffer = 0; |
| 7780 glGenBuffersARB(1, &buffer); | 7785 glGenBuffersARB(1, &buffer); |
| 7781 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer); | 7786 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer); |
| 7782 glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, GL_STREAM_READ); | 7787 // For ANGLE client version 2, GL_STREAM_READ is not available. |
| 7788 const GLenum usage_hint = |
| 7789 features().is_angle ? GL_STATIC_DRAW : GL_STREAM_READ; |
| 7790 glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, usage_hint); |
| 7783 GLenum error = glGetError(); | 7791 GLenum error = glGetError(); |
| 7784 if (error == GL_NO_ERROR) { | 7792 if (error == GL_NO_ERROR) { |
| 7785 glReadPixels(x, y, width, height, format, type, 0); | 7793 glReadPixels(x, y, width, height, format, type, 0); |
| 7786 pending_readpixel_fences_.push(linked_ptr<FenceCallback>( | 7794 pending_readpixel_fences_.push(linked_ptr<FenceCallback>( |
| 7787 new FenceCallback())); | 7795 new FenceCallback())); |
| 7788 WaitForReadPixels(base::Bind( | 7796 WaitForReadPixels(base::Bind( |
| 7789 &GLES2DecoderImpl::FinishReadPixels, | 7797 &GLES2DecoderImpl::FinishReadPixels, |
| 7790 base::internal::SupportsWeakPtrBase::StaticAsWeakPtr | 7798 base::internal::SupportsWeakPtrBase::StaticAsWeakPtr |
| 7791 <GLES2DecoderImpl>(this), | 7799 <GLES2DecoderImpl>(this), |
| 7792 c, buffer)); | 7800 c, buffer)); |
| (...skipping 3615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11408 } | 11416 } |
| 11409 } | 11417 } |
| 11410 | 11418 |
| 11411 // Include the auto-generated part of this file. We split this because it means | 11419 // Include the auto-generated part of this file. We split this because it means |
| 11412 // we can easily edit the non-auto generated parts right here in this file | 11420 // we can easily edit the non-auto generated parts right here in this file |
| 11413 // instead of having to edit some template or the code generator. | 11421 // instead of having to edit some template or the code generator. |
| 11414 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 11422 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 11415 | 11423 |
| 11416 } // namespace gles2 | 11424 } // namespace gles2 |
| 11417 } // namespace gpu | 11425 } // namespace gpu |
| OLD | NEW |