summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/common/gles2_cmd_utils.cc
diff options
context:
space:
mode:
authorzmo <zmo@chromium.org>2016-01-12 19:40:08 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-13 03:41:01 +0000
commit795fa7d8dc6d2d211597722a40e28ae2cb9764ed (patch)
tree2b7ece121a99d93460354a046e891d6aed14c90b /gpu/command_buffer/common/gles2_cmd_utils.cc
parent35e248abf1fa696021f1e764b15a1a4b13869da1 (diff)
downloadchromium_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.cc31
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;