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

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: more comments, GL_STREAM_READ added Created 7 years, 9 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 6927 matching lines...) Expand 10 before | Expand all | Expand 10 after
6938 } 6938 }
6939 typedef cmds::ReadPixels::Result Result; 6939 typedef cmds::ReadPixels::Result Result;
6940 uint32 pixels_size; 6940 uint32 pixels_size;
6941 if (!GLES2Util::ComputeImageDataSizes( 6941 if (!GLES2Util::ComputeImageDataSizes(
6942 width, height, format, type, state_.pack_alignment, &pixels_size, 6942 width, height, format, type, state_.pack_alignment, &pixels_size,
6943 NULL, NULL)) { 6943 NULL, NULL)) {
6944 return error::kOutOfBounds; 6944 return error::kOutOfBounds;
6945 } 6945 }
6946 void* pixels = GetSharedMemoryAs<void*>( 6946 void* pixels = GetSharedMemoryAs<void*>(
6947 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); 6947 c.pixels_shm_id, c.pixels_shm_offset, pixels_size);
6948 Result* result = GetSharedMemoryAs<Result*>( 6948 if (!pixels) {
6949 return error::kOutOfBounds;
6950 }
6951 Result* result = NULL;
6952 if (c.result_shm_id != 0) {
6953 result = GetSharedMemoryAs<Result*>(
6949 c.result_shm_id, c.result_shm_offset, sizeof(*result)); 6954 c.result_shm_id, c.result_shm_offset, sizeof(*result));
6950 if (!pixels || !result) { 6955 if (!result) {
6951 return error::kOutOfBounds; 6956 return error::kOutOfBounds;
6957 }
6952 } 6958 }
6953 6959
6954 if (!validators_->read_pixel_format.IsValid(format)) { 6960 if (!validators_->read_pixel_format.IsValid(format)) {
6955 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", format, "format"); 6961 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", format, "format");
6956 return error::kNoError; 6962 return error::kNoError;
6957 } 6963 }
6958 if (!validators_->pixel_type.IsValid(type)) { 6964 if (!validators_->pixel_type.IsValid(type)) {
6959 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", type, "type"); 6965 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadPixels", type, "type");
6960 return error::kNoError; 6966 return error::kNoError;
6961 } 6967 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
7022 glReadPixels( 7028 glReadPixels(
7023 read_x, ry, read_width, 1, format, type, dst + dest_row_offset); 7029 read_x, ry, read_width, 1, format, type, dst + dest_row_offset);
7024 } 7030 }
7025 dst += padded_row_size; 7031 dst += padded_row_size;
7026 } 7032 }
7027 } else { 7033 } else {
7028 glReadPixels(x, y, width, height, format, type, pixels); 7034 glReadPixels(x, y, width, height, format, type, pixels);
7029 } 7035 }
7030 GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); 7036 GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels");
7031 if (error == GL_NO_ERROR) { 7037 if (error == GL_NO_ERROR) {
7032 *result = true; 7038 if (result != NULL) {
7039 *result = true;
7040 }
7033 7041
7034 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); 7042 GLenum read_format = GetBoundReadFrameBufferInternalFormat();
7035 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); 7043 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format);
7036 if ((channels_exist & 0x0008) == 0 && 7044 if ((channels_exist & 0x0008) == 0 &&
7037 workarounds().clear_alpha_in_readpixels) { 7045 workarounds().clear_alpha_in_readpixels) {
7038 // Set the alpha to 255 because some drivers are buggy in this regard. 7046 // Set the alpha to 255 because some drivers are buggy in this regard.
7039 uint32 temp_size; 7047 uint32 temp_size;
7040 7048
7041 uint32 unpadded_row_size; 7049 uint32 unpadded_row_size;
7042 uint32 padded_row_size; 7050 uint32 padded_row_size;
(...skipping 3412 matching lines...) Expand 10 before | Expand all | Expand 10 after
10455 return error::kNoError; 10463 return error::kNoError;
10456 } 10464 }
10457 10465
10458 // Include the auto-generated part of this file. We split this because it means 10466 // Include the auto-generated part of this file. We split this because it means
10459 // we can easily edit the non-auto generated parts right here in this file 10467 // we can easily edit the non-auto generated parts right here in this file
10460 // instead of having to edit some template or the code generator. 10468 // instead of having to edit some template or the code generator.
10461 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 10469 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
10462 10470
10463 } // namespace gles2 10471 } // namespace gles2
10464 } // namespace gpu 10472 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698