diff options
author | Karol Herbst <[email protected]> | 2018-06-24 22:10:28 +0200 |
---|---|---|
committer | Karol Herbst <[email protected]> | 2018-07-15 19:28:37 +0200 |
commit | 4d0d9118756325ea83d254515d4c7a410df96f0e (patch) | |
tree | ddf7ae987dbde0b21ea3fecaf39021e1ed101ff6 /src | |
parent | 87c8af283672bfd42ce84b81e9609ab7d59ec36b (diff) |
nouveau: fix 3D blitter for unsigned to signed integer conversions
fixes a couple of packed_pixel CTS tests. No regressions inside a CTS run.
v2: simplify the changes a bit
Reviewed-by: Ilia Mirkin <[email protected]>
Signed-off-by: Karol Herbst <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/nouveau/nv50/nv50_blit.h | 21 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nv50/nv50_surface.c | 11 |
2 files changed, 22 insertions, 10 deletions
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_blit.h b/src/gallium/drivers/nouveau/nv50/nv50_blit.h index 10fe5274b10..01667bb5f66 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_blit.h +++ b/src/gallium/drivers/nouveau/nv50/nv50_blit.h @@ -17,16 +17,17 @@ nv50_blit_select_mode(const struct pipe_blit_info *); void nv50_resource_resolve(struct pipe_context *, const struct pipe_resolve_info *); -#define NV50_BLIT_MODE_PASS 0 /* pass through TEX $t0/$s0 output */ -#define NV50_BLIT_MODE_Z24S8 1 /* encode ZS values for RGBA unorm8 */ -#define NV50_BLIT_MODE_S8Z24 2 -#define NV50_BLIT_MODE_X24S8 3 -#define NV50_BLIT_MODE_S8X24 4 -#define NV50_BLIT_MODE_Z24X8 5 -#define NV50_BLIT_MODE_X8Z24 6 -#define NV50_BLIT_MODE_ZS 7 /* put $t0/$s0 into R, $t1/$s1 into G */ -#define NV50_BLIT_MODE_XS 8 /* put $t1/$s1 into G */ -#define NV50_BLIT_MODES 9 +#define NV50_BLIT_MODE_PASS 0 /* pass through TEX $t0/$s0 output */ +#define NV50_BLIT_MODE_Z24S8 1 /* encode ZS values for RGBA unorm8 */ +#define NV50_BLIT_MODE_S8Z24 2 +#define NV50_BLIT_MODE_X24S8 3 +#define NV50_BLIT_MODE_S8X24 4 +#define NV50_BLIT_MODE_Z24X8 5 +#define NV50_BLIT_MODE_X8Z24 6 +#define NV50_BLIT_MODE_ZS 7 /* put $t0/$s0 into R, $t1/$s1 into G */ +#define NV50_BLIT_MODE_XS 8 /* put $t1/$s1 into G */ +#define NV50_BLIT_MODE_INT_CLAMP 9 /* unsigned to signed integer conversion */ +#define NV50_BLIT_MODES 10 /* CUBE and RECT textures are reinterpreted as 2D(_ARRAY) */ #define NV50_BLIT_TEXTURE_BUFFER 0 diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c index 037e14a4d60..1ef0f5030a5 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c @@ -892,6 +892,10 @@ nv50_blitter_make_fp(struct pipe_context *pipe, bool tex_s = false; bool cvt_un8 = false; + bool int_clamp = mode == NV50_BLIT_MODE_INT_CLAMP; + if (int_clamp) + mode = NV50_BLIT_MODE_PASS; + if (mode != NV50_BLIT_MODE_PASS && mode != NV50_BLIT_MODE_Z24X8 && mode != NV50_BLIT_MODE_X8Z24) @@ -936,6 +940,10 @@ nv50_blitter_make_fp(struct pipe_context *pipe, target, tc, ureg_DECL_sampler(ureg, 0)); } + /* handle signed to unsigned integer conversions */ + if (int_clamp) + ureg_UMIN(ureg, data, ureg_src(data), ureg_imm1u(ureg, 0x7fffffff)); + if (cvt_un8) { struct ureg_src mask; struct ureg_src scale; @@ -1058,6 +1066,9 @@ nv50_blit_select_mode(const struct pipe_blit_info *info) return NV50_BLIT_MODE_XS; } default: + if (util_format_is_pure_uint(info->src.format) && + util_format_is_pure_sint(info->dst.format)) + return NV50_BLIT_MODE_INT_CLAMP; return NV50_BLIT_MODE_PASS; } } |