| 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 6790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6801 } | 6801 } |
| 6802 break; | 6802 break; |
| 6803 } | 6803 } |
| 6804 default: | 6804 default: |
| 6805 break; | 6805 break; |
| 6806 } | 6806 } |
| 6807 } | 6807 } |
| 6808 } | 6808 } |
| 6809 | 6809 |
| 6810 | 6810 |
| 6811 static inline GLenum GetTexType(GLenum type) { |
| 6812 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { |
| 6813 if (type == GL_HALF_FLOAT_OES) |
| 6814 return GL_HALF_FLOAT_ARB; |
| 6815 } |
| 6816 return type; |
| 6817 } |
| 6818 |
| 6811 error::Error GLES2DecoderImpl::HandleReadPixels( | 6819 error::Error GLES2DecoderImpl::HandleReadPixels( |
| 6812 uint32 immediate_data_size, const cmds::ReadPixels& c) { | 6820 uint32 immediate_data_size, const cmds::ReadPixels& c) { |
| 6813 if (ShouldDeferReads()) | 6821 if (ShouldDeferReads()) |
| 6814 return error::kDeferCommandUntilLater; | 6822 return error::kDeferCommandUntilLater; |
| 6815 GLint x = c.x; | 6823 GLint x = c.x; |
| 6816 GLint y = c.y; | 6824 GLint y = c.y; |
| 6817 GLsizei width = c.width; | 6825 GLsizei width = c.width; |
| 6818 GLsizei height = c.height; | 6826 GLsizei height = c.height; |
| 6819 GLenum format = c.format; | 6827 GLenum format = c.format; |
| 6820 GLenum type = c.type; | 6828 GLenum type = c.type; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6906 GLint read_width = read_end_x - read_x; | 6914 GLint read_width = read_end_x - read_x; |
| 6907 for (GLint yy = 0; yy < height; ++yy) { | 6915 for (GLint yy = 0; yy < height; ++yy) { |
| 6908 GLint ry = y + yy; | 6916 GLint ry = y + yy; |
| 6909 | 6917 |
| 6910 // Clear the row. | 6918 // Clear the row. |
| 6911 memset(dst, 0, unpadded_row_size); | 6919 memset(dst, 0, unpadded_row_size); |
| 6912 | 6920 |
| 6913 // If the row is in range, copy it. | 6921 // If the row is in range, copy it. |
| 6914 if (ry >= 0 && ry < max_size.height() && read_width > 0) { | 6922 if (ry >= 0 && ry < max_size.height() && read_width > 0) { |
| 6915 glReadPixels( | 6923 glReadPixels( |
| 6916 read_x, ry, read_width, 1, format, type, dst + dest_row_offset); | 6924 read_x, ry, read_width, 1, format, GetTexType(type), |
| 6925 dst + dest_row_offset); |
| 6917 } | 6926 } |
| 6918 dst += padded_row_size; | 6927 dst += padded_row_size; |
| 6919 } | 6928 } |
| 6920 } else { | 6929 } else { |
| 6921 if (async && features().use_async_readpixels) { | 6930 if (async && features().use_async_readpixels) { |
| 6922 GLuint buffer; | 6931 GLuint buffer; |
| 6923 glGenBuffersARB(1, &buffer); | 6932 glGenBuffersARB(1, &buffer); |
| 6924 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer); | 6933 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer); |
| 6925 glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, GL_STREAM_READ); | 6934 glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, GL_STREAM_READ); |
| 6926 GLenum error = glGetError(); | 6935 GLenum error = glGetError(); |
| 6927 if (error == GL_NO_ERROR) { | 6936 if (error == GL_NO_ERROR) { |
| 6928 glReadPixels(x, y, width, height, format, type, 0); | 6937 glReadPixels(x, y, width, height, format, GetTexType(type), 0); |
| 6929 pending_readpixel_fences_.push(linked_ptr<FenceCallback>( | 6938 pending_readpixel_fences_.push(linked_ptr<FenceCallback>( |
| 6930 new FenceCallback())); | 6939 new FenceCallback())); |
| 6931 WaitForReadPixels(base::Bind( | 6940 WaitForReadPixels(base::Bind( |
| 6932 &GLES2DecoderImpl::FinishReadPixels, | 6941 &GLES2DecoderImpl::FinishReadPixels, |
| 6933 base::internal::SupportsWeakPtrBase::StaticAsWeakPtr | 6942 base::internal::SupportsWeakPtrBase::StaticAsWeakPtr |
| 6934 <GLES2DecoderImpl>(this), | 6943 <GLES2DecoderImpl>(this), |
| 6935 c, buffer)); | 6944 c, buffer)); |
| 6936 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); | 6945 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); |
| 6937 return error::kNoError; | 6946 return error::kNoError; |
| 6938 } | 6947 } |
| 6939 } | 6948 } |
| 6940 glReadPixels(x, y, width, height, format, type, pixels); | 6949 glReadPixels(x, y, width, height, format, GetTexType(type), pixels); |
| 6941 } | 6950 } |
| 6942 GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); | 6951 GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); |
| 6943 if (error == GL_NO_ERROR) { | 6952 if (error == GL_NO_ERROR) { |
| 6944 if (result != NULL) { | 6953 if (result != NULL) { |
| 6945 *result = true; | 6954 *result = true; |
| 6946 } | 6955 } |
| 6947 FinishReadPixels(c, 0); | 6956 FinishReadPixels(c, 0); |
| 6948 } | 6957 } |
| 6949 | 6958 |
| 6950 return error::kNoError; | 6959 return error::kNoError; |
| (...skipping 3498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10449 return error::kNoError; | 10458 return error::kNoError; |
| 10450 } | 10459 } |
| 10451 | 10460 |
| 10452 // Include the auto-generated part of this file. We split this because it means | 10461 // Include the auto-generated part of this file. We split this because it means |
| 10453 // we can easily edit the non-auto generated parts right here in this file | 10462 // we can easily edit the non-auto generated parts right here in this file |
| 10454 // instead of having to edit some template or the code generator. | 10463 // instead of having to edit some template or the code generator. |
| 10455 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10464 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 10456 | 10465 |
| 10457 } // namespace gles2 | 10466 } // namespace gles2 |
| 10458 } // namespace gpu | 10467 } // namespace gpu |
| OLD | NEW |