Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(260)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 12892005: Implement client side PBOs for glReadPixel (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: make GLHelper constructor explicit Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 6929 matching lines...) Expand 10 before | Expand all | Expand 10 after
6940 } 6940 }
6941 typedef cmds::ReadPixels::Result Result; 6941 typedef cmds::ReadPixels::Result Result;
6942 uint32 pixels_size; 6942 uint32 pixels_size;
6943 if (!GLES2Util::ComputeImageDataSizes( 6943 if (!GLES2Util::ComputeImageDataSizes(
6944 width, height, format, type, state_.pack_alignment, &pixels_size, 6944 width, height, format, type, state_.pack_alignment, &pixels_size,
6945 NULL, NULL)) { 6945 NULL, NULL)) {
6946 return error::kOutOfBounds; 6946 return error::kOutOfBounds;
6947 } 6947 }
6948 void* pixels = GetSharedMemoryAs<void*>( 6948 void* pixels = GetSharedMemoryAs<void*>(
6949 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); 6949 c.pixels_shm_id, c.pixels_shm_offset, pixels_size);
6950 Result* result = GetSharedMemoryAs<Result*>( 6950 if (!pixels) {
6951 return error::kOutOfBounds;
6952 }
6953 Result* result = NULL;
6954 if (c.result_shm_id != 0) {
6955 result = GetSharedMemoryAs<Result*>(
6951 c.result_shm_id, c.result_shm_offset, sizeof(*result)); 6956 c.result_shm_id, c.result_shm_offset, sizeof(*result));
6952 if (!pixels || !result) { 6957 if (!result) {
6953 return error::kOutOfBounds; 6958 return error::kOutOfBounds;
6959 }
6954 } 6960 }
6955 6961
6956 if (!validators_->read_pixel_format.IsValid(format)) { 6962 if (!validators_->read_pixel_format.IsValid(format)) {
6957 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", format, "format"); 6963 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", format, "format");
6958 return error::kNoError; 6964 return error::kNoError;
6959 } 6965 }
6960 if (!validators_->pixel_type.IsValid(type)) { 6966 if (!validators_->pixel_type.IsValid(type)) {
6961 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", type, "type"); 6967 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", type, "type");
6962 return error::kNoError; 6968 return error::kNoError;
6963 } 6969 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
7024 glReadPixels( 7030 glReadPixels(
7025 read_x, ry, read_width, 1, format, type, dst + dest_row_offset); 7031 read_x, ry, read_width, 1, format, type, dst + dest_row_offset);
7026 } 7032 }
7027 dst += padded_row_size; 7033 dst += padded_row_size;
7028 } 7034 }
7029 } else { 7035 } else {
7030 glReadPixels(x, y, width, height, format, type, pixels); 7036 glReadPixels(x, y, width, height, format, type, pixels);
7031 } 7037 }
7032 GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); 7038 GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels");
7033 if (error == GL_NO_ERROR) { 7039 if (error == GL_NO_ERROR) {
7034 *result = true; 7040 if (result != NULL) {
7041 *result = true;
7042 }
7035 7043
7036 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); 7044 GLenum read_format = GetBoundReadFrameBufferInternalFormat();
7037 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); 7045 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format);
7038 if ((channels_exist & 0x0008) == 0 && 7046 if ((channels_exist & 0x0008) == 0 &&
7039 workarounds().clear_alpha_in_readpixels) { 7047 workarounds().clear_alpha_in_readpixels) {
7040 // Set the alpha to 255 because some drivers are buggy in this regard. 7048 // Set the alpha to 255 because some drivers are buggy in this regard.
7041 uint32 temp_size; 7049 uint32 temp_size;
7042 7050
7043 uint32 unpadded_row_size; 7051 uint32 unpadded_row_size;
7044 uint32 padded_row_size; 7052 uint32 padded_row_size;
(...skipping 3421 matching lines...) Expand 10 before | Expand all | Expand 10 after
10466 return error::kNoError; 10474 return error::kNoError;
10467 } 10475 }
10468 10476
10469 // Include the auto-generated part of this file. We split this because it means 10477 // Include the auto-generated part of this file. We split this because it means
10470 // we can easily edit the non-auto generated parts right here in this file 10478 // we can easily edit the non-auto generated parts right here in this file
10471 // instead of having to edit some template or the code generator. 10479 // instead of having to edit some template or the code generator.
10472 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 10480 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
10473 10481
10474 } // namespace gles2 10482 } // namespace gles2
10475 } // namespace gpu 10483 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation_unittest.cc ('k') | gpu/command_buffer/tests/gl_readback_unittests.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698