diff options
author | zmo <zmo@chromium.org> | 2015-12-09 09:16:01 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-09 17:17:33 +0000 |
commit | e0b58d1f24bce6a6f19dcbe5e857e3731d0631ca (patch) | |
tree | a2f969c3fc1735a25e4ef4034952086493ca4e3c /gpu/command_buffer/common/gles2_cmd_utils.cc | |
parent | f633fa08d9b5c938e8a6202ea751b6fa6011912e (diff) | |
download | chromium_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.cc | 158 |
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; } |