summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/common/gles2_cmd_utils.cc
diff options
context:
space:
mode:
authorzmo <zmo@chromium.org>2015-12-09 09:16:01 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-09 17:17:33 +0000
commite0b58d1f24bce6a6f19dcbe5e857e3731d0631ca (patch)
treea2f969c3fc1735a25e4ef4034952086493ca4e3c /gpu/command_buffer/common/gles2_cmd_utils.cc
parentf633fa08d9b5c938e8a6202ea751b6fa6011912e (diff)
downloadchromium_src-e0b58d1f24bce6a6f19dcbe5e857e3731d0631ca.zip
chromium_src-e0b58d1f24bce6a6f19dcbe5e857e3731d0631ca.tar.gz
chromium_src-e0b58d1f24bce6a6f19dcbe5e857e3731d0631ca.tar.bz2
Implement helper functionalities for computing image size with ES3 settings.
This will be used in ReadPixels, Tex{Sub}Image* in followup CLs. BUG=429053,563714 TEST=gpu_unittests R=piman@chromium.org Review URL: https://codereview.chromium.org/1508953002 Cr-Commit-Position: refs/heads/master@{#364095}
Diffstat (limited to 'gpu/command_buffer/common/gles2_cmd_utils.cc')
-rw-r--r--gpu/command_buffer/common/gles2_cmd_utils.cc158
1 files changed, 122 insertions, 36 deletions
diff --git a/gpu/command_buffer/common/gles2_cmd_utils.cc b/gpu/command_buffer/common/gles2_cmd_utils.cc
index 8b547fa..93f1980 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils.cc
+++ b/gpu/command_buffer/common/gles2_cmd_utils.cc
@@ -509,67 +509,153 @@ uint32 GLES2Util::ComputeImageGroupSize(int format, int type) {
return bytes_per_element * elements_per_group;
}
-bool GLES2Util::ComputeImagePaddedRowSize(
- int width, int format, int type, int unpack_alignment,
- uint32* padded_row_size) {
- DCHECK(unpack_alignment == 1 || unpack_alignment == 2 ||
- unpack_alignment == 4 || unpack_alignment == 8);
- uint32 bytes_per_group = ComputeImageGroupSize(format, type);
+bool GLES2Util::ComputeImageRowSizeHelper(
+ int width, uint32 bytes_per_group, int alignment,
+ uint32* rt_unpadded_row_size, uint32* rt_padded_row_size) {
+ DCHECK(alignment == 1 || alignment == 2 ||
+ alignment == 4 || alignment == 8);
uint32 unpadded_row_size;
if (!SafeMultiplyUint32(width, bytes_per_group, &unpadded_row_size)) {
return false;
}
uint32 temp;
- if (!SafeAddUint32(unpadded_row_size, unpack_alignment - 1, &temp)) {
- return false;
+ if (!SafeAddUint32(unpadded_row_size, alignment - 1, &temp)) {
+ return false;
}
- *padded_row_size = (temp / unpack_alignment) * unpack_alignment;
+ uint32 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;
return true;
}
+bool GLES2Util::ComputeImagePaddedRowSize(
+ int width, int format, int type, int alignment, uint32* padded_row_size) {
+ uint32 bytes_per_group = ComputeImageGroupSize(format, type);
+ return ComputeImageRowSizeHelper(
+ width, bytes_per_group, alignment, nullptr, padded_row_size);
+}
+
// Returns the amount of data glTexImage*D or glTexSubImage*D will access.
bool GLES2Util::ComputeImageDataSizes(
int width, int height, int depth, int format, int type,
- int unpack_alignment, uint32* size, uint32* ret_unpadded_row_size,
- uint32* ret_padded_row_size) {
- DCHECK(unpack_alignment == 1 || unpack_alignment == 2 ||
- unpack_alignment == 4 || unpack_alignment == 8);
+ int alignment, uint32* size, uint32* opt_unpadded_row_size,
+ uint32* opt_padded_row_size) {
+ DCHECK(width >= 0 && height >= 0 && height >=0);
+ if (width == 0 || height == 0 || depth == 0) {
+ *size = 0;
+ return true;
+ }
+
uint32 bytes_per_group = ComputeImageGroupSize(format, type);
- uint32 row_size;
- if (!SafeMultiplyUint32(width, bytes_per_group, &row_size)) {
+
+ uint32 unpadded_row_size;
+ uint32 padded_row_size;
+ if (!ComputeImageRowSizeHelper(width, bytes_per_group, alignment,
+ &unpadded_row_size, &padded_row_size)) {
return false;
}
uint32 num_of_rows;
if (!SafeMultiplyUint32(height, depth, &num_of_rows)) {
return false;
}
- if (num_of_rows > 1) {
- uint32 temp;
- if (!SafeAddUint32(row_size, unpack_alignment - 1, &temp)) {
+ DCHECK(num_of_rows > 0);
+ uint32 size_of_all_but_last_row;
+ if (!SafeMultiplyUint32((num_of_rows - 1), padded_row_size,
+ &size_of_all_but_last_row)) {
+ return false;
+ }
+ if (!SafeAddUint32(size_of_all_but_last_row, unpadded_row_size, size)) {
+ return false;
+ }
+ if (opt_padded_row_size) {
+ *opt_padded_row_size = padded_row_size;
+ }
+ if (opt_unpadded_row_size) {
+ *opt_unpadded_row_size = unpadded_row_size;
+ }
+
+ return true;
+}
+
+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) {
+ DCHECK(width >= 0 && height >= 0 && height >=0);
+ if (width == 0 || height == 0 || depth == 0) {
+ *size = 0;
+ return true;
+ }
+
+ uint32 bytes_per_group = ComputeImageGroupSize(format, type);
+
+ uint32 unpadded_row_size;
+ uint32 padded_row_size;
+ if (!ComputeImageRowSizeHelper(width, bytes_per_group, params.alignment,
+ &unpadded_row_size, &padded_row_size)) {
+ return false;
+ }
+ if (params.row_length > 0 &&
+ !ComputeImageRowSizeHelper(params.row_length, bytes_per_group,
+ params.alignment, nullptr, &padded_row_size)) {
+ // 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;
+ }
+
+ int image_height = params.image_height > 0 ? params.image_height : height;
+ uint32 num_of_rows;
+ if (!SafeMultiplyUint32(image_height, depth - 1, &num_of_rows) ||
+ !SafeAddUint32(num_of_rows, height, &num_of_rows)) {
+ return false;
+ }
+ DCHECK(num_of_rows > 0);
+ uint32 size_of_all_but_last_row;
+ if (!SafeMultiplyUint32((num_of_rows - 1), padded_row_size,
+ &size_of_all_but_last_row)) {
+ return false;
+ }
+ if (!SafeAddUint32(size_of_all_but_last_row, unpadded_row_size, size)) {
+ return false;
+ }
+
+ uint32 skip_size = 0;
+ if (params.skip_images > 0) {
+ uint32 image_size;
+ if (!SafeMultiplyUint32(image_height, padded_row_size, &image_size))
return false;
- }
- uint32 padded_row_size = (temp / unpack_alignment) * unpack_alignment;
- uint32 size_of_all_but_last_row;
- if (!SafeMultiplyUint32((num_of_rows - 1), padded_row_size,
- &size_of_all_but_last_row)) {
+ if (!SafeMultiplyUint32(image_size, params.skip_images, &skip_size))
return false;
- }
- if (!SafeAddUint32(size_of_all_but_last_row, row_size, size)) {
+ }
+ if (params.skip_rows > 0) {
+ uint32 temp;
+ if (!SafeMultiplyUint32(padded_row_size, params.skip_rows, &temp))
+ return false;
+ if (!SafeAddUint32(skip_size, temp, &skip_size))
return false;
- }
- if (ret_padded_row_size) {
- *ret_padded_row_size = padded_row_size;
- }
- } else {
- *size = row_size;
- if (ret_padded_row_size) {
- *ret_padded_row_size = row_size;
- }
}
- if (ret_unpadded_row_size) {
- *ret_unpadded_row_size = row_size;
+ if (params.skip_pixels > 0) {
+ uint32 temp;
+ if (!SafeMultiplyUint32(bytes_per_group, params.skip_pixels, &temp))
+ return false;
+ if (!SafeAddUint32(skip_size, temp, &skip_size))
+ return false;
}
+ uint32 total_size;
+ if (!SafeAddUint32(*size, skip_size, &total_size))
+ return false;
+ if (opt_padded_row_size) {
+ *opt_padded_row_size = padded_row_size;
+ }
+ if (opt_unpadded_row_size) {
+ *opt_unpadded_row_size = unpadded_row_size;
+ }
+ if (opt_skip_size)
+ *opt_skip_size = skip_size;
return true;
}