diff options
author | Erik Faye-Lund <[email protected]> | 2019-03-12 21:17:59 +0100 |
---|---|---|
committer | Erik Faye-Lund <[email protected]> | 2019-04-17 07:27:08 +0000 |
commit | 749bbd39c719a600cd2555932bb47aa73ca42336 (patch) | |
tree | c475b9a44b7cff9176c5396da8cef54d377a8512 /src | |
parent | f31b65f1c1444e36baffb414aa11de2d70a14c19 (diff) |
gallium/util: support translating between uint and sint formats
Without this, we can't for instance convert between r8_sint and
r8g8b8a8_sint. But that's pretty useful, so let's support it as well.
Signed-off-by: Erik Faye-Lund <[email protected]>
Reviewed-by: Gurchetan Singh <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/util/u_format.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c index 3a61d54f726..5d3ee861a73 100644 --- a/src/gallium/auxiliary/util/u_format.c +++ b/src/gallium/auxiliary/util/u_format.c @@ -716,6 +716,68 @@ util_format_translate(enum pipe_format dst_format, FREE(tmp_row); } + else if (util_format_is_pure_sint(src_format) || + util_format_is_pure_sint(dst_format)) { + unsigned tmp_stride; + int *tmp_row; + + if (!src_format_desc->unpack_rgba_sint || + !dst_format_desc->pack_rgba_sint) { + return FALSE; + } + + tmp_stride = MAX2(width, x_step) * 4 * sizeof *tmp_row; + tmp_row = MALLOC(y_step * tmp_stride); + if (!tmp_row) + return FALSE; + + while (height >= y_step) { + src_format_desc->unpack_rgba_sint(tmp_row, tmp_stride, src_row, src_stride, width, y_step); + dst_format_desc->pack_rgba_sint(dst_row, dst_stride, tmp_row, tmp_stride, width, y_step); + + dst_row += dst_step; + src_row += src_step; + height -= y_step; + } + + if (height) { + src_format_desc->unpack_rgba_sint(tmp_row, tmp_stride, src_row, src_stride, width, height); + dst_format_desc->pack_rgba_sint(dst_row, dst_stride, tmp_row, tmp_stride, width, height); + } + + FREE(tmp_row); + } + else if (util_format_is_pure_uint(src_format) || + util_format_is_pure_uint(dst_format)) { + unsigned tmp_stride; + unsigned int *tmp_row; + + if (!src_format_desc->unpack_rgba_uint || + !dst_format_desc->pack_rgba_uint) { + return FALSE; + } + + tmp_stride = MAX2(width, x_step) * 4 * sizeof *tmp_row; + tmp_row = MALLOC(y_step * tmp_stride); + if (!tmp_row) + return FALSE; + + while (height >= y_step) { + src_format_desc->unpack_rgba_uint(tmp_row, tmp_stride, src_row, src_stride, width, y_step); + dst_format_desc->pack_rgba_uint(dst_row, dst_stride, tmp_row, tmp_stride, width, y_step); + + dst_row += dst_step; + src_row += src_step; + height -= y_step; + } + + if (height) { + src_format_desc->unpack_rgba_uint(tmp_row, tmp_stride, src_row, src_stride, width, height); + dst_format_desc->pack_rgba_uint(dst_row, dst_stride, tmp_row, tmp_stride, width, height); + } + + FREE(tmp_row); + } else { unsigned tmp_stride; float *tmp_row; |