summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorErik Faye-Lund <[email protected]>2019-03-12 21:17:59 +0100
committerErik Faye-Lund <[email protected]>2019-04-17 07:27:08 +0000
commit749bbd39c719a600cd2555932bb47aa73ca42336 (patch)
treec475b9a44b7cff9176c5396da8cef54d377a8512 /src/gallium
parentf31b65f1c1444e36baffb414aa11de2d70a14c19 (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/gallium')
-rw-r--r--src/gallium/auxiliary/util/u_format.c62
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;