From ddf0f097e74d57858238fcdb13003ab5c974abc3 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Thu, 24 Nov 2016 18:02:31 -0500 Subject: [PATCH] swr: [rasterizer jit] use signed integer representation for logic op Instead of (incorrectly) biasing the snorm value to make it look like a unorm, just use signed integer math. This fixes arb_color_buffer_float-render GL_RGBA8_SNORM Signed-off-by: Ilia Mirkin Reviewed-by: Tim Rowley --- src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp b/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp index ad809c4..2fd011f 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp @@ -692,9 +692,13 @@ struct BlendJit : public Builder dst[i] = BITCAST(dst[i], mSimdInt32Ty); break; case SWR_TYPE_SNORM: - src[i] = FADD(src[i], VIMMED1(0.5f)); - dst[i] = FADD(dst[i], VIMMED1(0.5f)); - /* fallthrough */ + src[i] = FP_TO_SI( + FMUL(src[i], VIMMED1(scale[i])), + mSimdInt32Ty); + dst[i] = FP_TO_SI( + FMUL(dst[i], VIMMED1(scale[i])), + mSimdInt32Ty); + break; case SWR_TYPE_UNORM: src[i] = FP_TO_UI( FMUL(src[i], VIMMED1(scale[i])), @@ -728,11 +732,14 @@ struct BlendJit : public Builder result[i] = BITCAST(result[i], mSimdFP32Ty); break; case SWR_TYPE_SNORM: + result[i] = SHL(result[i], C(32 - info.bpc[i])); + result[i] = ASHR(result[i], C(32 - info.bpc[i])); + result[i] = FMUL(SI_TO_FP(result[i], mSimdFP32Ty), + VIMMED1(1.0f / scale[i])); + break; case SWR_TYPE_UNORM: result[i] = FMUL(UI_TO_FP(result[i], mSimdFP32Ty), VIMMED1(1.0f / scale[i])); - if (info.type[i] == SWR_TYPE_SNORM) - result[i] = FADD(result[i], VIMMED1(-0.5f)); break; } -- 2.7.4