diff options
author | zmo <zmo@chromium.org> | 2016-01-12 19:40:08 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-13 03:41:01 +0000 |
commit | 795fa7d8dc6d2d211597722a40e28ae2cb9764ed (patch) | |
tree | 2b7ece121a99d93460354a046e891d6aed14c90b /gpu/command_buffer/common/gles2_cmd_utils.cc | |
parent | 35e248abf1fa696021f1e764b15a1a4b13869da1 (diff) | |
download | chromium_src-795fa7d8dc6d2d211597722a40e28ae2cb9764ed.zip chromium_src-795fa7d8dc6d2d211597722a40e28ae2cb9764ed.tar.gz chromium_src-795fa7d8dc6d2d211597722a40e28ae2cb9764ed.tar.bz2 |
Last CL to make ReadPixels ES3 conformant.
1) Make command buffer handle pack_skip_* params.
Do not send them down to driver.
2) Add a workaround to handle ReadPixels into PBO and pack params do not
work correctly.
BUG=563714
TEST=gpu_unittests,webgl2 conformance
R=piman@chromium.org
Review URL: https://codereview.chromium.org/1575013004
Cr-Commit-Position: refs/heads/master@{#369088}
Diffstat (limited to 'gpu/command_buffer/common/gles2_cmd_utils.cc')
-rw-r--r-- | gpu/command_buffer/common/gles2_cmd_utils.cc | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/gpu/command_buffer/common/gles2_cmd_utils.cc b/gpu/command_buffer/common/gles2_cmd_utils.cc index 86c0a7f..4c7fcf7 100644 --- a/gpu/command_buffer/common/gles2_cmd_utils.cc +++ b/gpu/command_buffer/common/gles2_cmd_utils.cc @@ -511,22 +511,30 @@ bool GLES2Util::ComputeImageRowSizeHelper(int width, uint32_t bytes_per_group, int alignment, uint32_t* rt_unpadded_row_size, - uint32_t* rt_padded_row_size) { + uint32_t* rt_padded_row_size, + uint32_t* rt_padding) { DCHECK(alignment == 1 || alignment == 2 || alignment == 4 || alignment == 8); uint32_t unpadded_row_size; if (!SafeMultiplyUint32(width, bytes_per_group, &unpadded_row_size)) { return false; } - uint32_t temp; - if (!SafeAddUint32(unpadded_row_size, alignment - 1, &temp)) { - return false; + uint32_t residual = unpadded_row_size % alignment; + uint32_t padding = 0; + uint32_t padded_row_size = unpadded_row_size; + if (residual > 0) { + padding = alignment - residual; + if (!SafeAddUint32(unpadded_row_size, padding, &padded_row_size)) { + return false; + } } - uint32_t padded_row_size = (temp / alignment) * alignment; + if (rt_unpadded_row_size) *rt_unpadded_row_size = unpadded_row_size; if (rt_padded_row_size) *rt_padded_row_size = padded_row_size; + if (rt_padding) + *rt_padding = padding; return true; } @@ -537,7 +545,7 @@ bool GLES2Util::ComputeImagePaddedRowSize(int width, uint32_t* padded_row_size) { uint32_t bytes_per_group = ComputeImageGroupSize(format, type); return ComputeImageRowSizeHelper( - width, bytes_per_group, alignment, nullptr, padded_row_size); + width, bytes_per_group, alignment, nullptr, padded_row_size, nullptr); } // Returns the amount of data glTexImage*D or glTexSubImage*D will access. @@ -554,14 +562,15 @@ bool GLES2Util::ComputeImageDataSizes(int width, params.alignment = alignment; return ComputeImageDataSizesES3( width, height, depth, format, type, params, - size, opt_unpadded_row_size, opt_padded_row_size, nullptr); + size, opt_unpadded_row_size, opt_padded_row_size, nullptr, nullptr); } bool GLES2Util::ComputeImageDataSizesES3( int width, int height, int depth, int format, int type, const PixelStoreParams& params, uint32_t* size, uint32_t* opt_unpadded_row_size, - uint32_t* opt_padded_row_size, uint32_t* opt_skip_size) { + uint32_t* opt_padded_row_size, uint32_t* opt_skip_size, + uint32_t* opt_padding) { DCHECK(width >= 0 && height >= 0 && depth >= 0); uint32_t bytes_per_group = ComputeImageGroupSize(format, type); @@ -569,12 +578,14 @@ bool GLES2Util::ComputeImageDataSizesES3( uint32_t unpadded_row_size; uint32_t padded_row_size; if (!ComputeImageRowSizeHelper(width, bytes_per_group, params.alignment, - &unpadded_row_size, &padded_row_size)) { + &unpadded_row_size, &padded_row_size, + opt_padding)) { return false; } if (params.row_length > 0 && !ComputeImageRowSizeHelper(params.row_length, bytes_per_group, - params.alignment, nullptr, &padded_row_size)) { + params.alignment, nullptr, &padded_row_size, + opt_padding)) { // Here we re-compute the padded_row_size, but the unpadded_row_size // isn't affected. That is, the last row isn't affected by ROW_LENGTH. return false; |