diff options
-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; } } |