summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard Sandiford <[email protected]>2013-06-07 13:31:58 +0100
committerAdam Jackson <[email protected]>2013-06-10 16:20:45 -0400
commitba6cd796dd60635ca12f036ba9de5b907d8e82f5 (patch)
treea137597c37170c3550ec512feb91601713e79e5d /src
parenta0037cecd1d8c609070e1b464ea0693e8769e55c (diff)
llvmpipe: Use saturating add/sub for UNORM formats
lp_build_add and lp_build_sub have fallback code for cases that cannot be handled by known intrinsics. For UNORM formats, this code was using modulo rather than saturating arithmetic. This fixes some rendering issues for a gnome session on System z. It also fixes various piglit tests on z, such as spec/ARB_color_buffer_float/GL_RGBA8-render. The patch deliberately doesn't tackle the more complicated SNORM case. Tested against piglit on x86_64 and System z with no regressions. Reviewed-by: Adam Jackson <[email protected]> Signed-off-by: Richard Sandiford <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_arit.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
index 3291ec40af5..08aec799a33 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
@@ -386,6 +386,10 @@ lp_build_add(struct lp_build_context *bld,
return lp_build_intrinsic_binary(builder, intrinsic, lp_build_vec_type(bld->gallivm, bld->type), a, b);
}
+ /* TODO: handle signed case */
+ if(type.norm && !type.floating && !type.fixed && !type.sign)
+ a = lp_build_min_simple(bld, a, lp_build_comp(bld, b));
+
if(LLVMIsConstant(a) && LLVMIsConstant(b))
if (type.floating)
res = LLVMConstFAdd(a, b);
@@ -663,6 +667,10 @@ lp_build_sub(struct lp_build_context *bld,
return lp_build_intrinsic_binary(builder, intrinsic, lp_build_vec_type(bld->gallivm, bld->type), a, b);
}
+ /* TODO: handle signed case */
+ if(type.norm && !type.floating && !type.fixed && !type.sign)
+ a = lp_build_max_simple(bld, a, b);
+
if(LLVMIsConstant(a) && LLVMIsConstant(b))
if (type.floating)
res = LLVMConstFSub(a, b);