From 3b683700efe81f82ba2f978d6c645385e5ccfa97 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Tue, 29 Jan 2013 10:45:01 +0000 Subject: [PATCH] llvmpipe: Fix deferred depth writes for Z16_UNORM. This special path hadn't been exercised by my earlier testing, and mask values weren't being properly truncated to match the values. This change fixes that. Reviewed-by: Brian Paul Reviewed-by: Roland Scheidegger --- src/gallium/drivers/llvmpipe/lp_bld_depth.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/llvmpipe/lp_bld_depth.c b/src/gallium/drivers/llvmpipe/lp_bld_depth.c index 1c899b3..24c997d 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_depth.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_depth.c @@ -893,6 +893,7 @@ lp_build_deferred_depth_write(struct gallivm_state *gallivm, struct lp_build_context z_bld; LLVMValueRef z_dst; LLVMBuilderRef builder = gallivm->builder; + LLVMValueRef mask_value; /* XXX: pointlessly redo type logic: */ @@ -904,11 +905,15 @@ lp_build_deferred_depth_write(struct gallivm_state *gallivm, z_dst = LLVMBuildLoad(builder, zs_dst_ptr, "zsbufval"); + mask_value = lp_build_mask_value(mask); + if (z_type.width < z_src_type.width) { + /* Truncate incoming ZS and mask values (e.g., when writing to Z16_UNORM) */ zs_value = LLVMBuildTrunc(builder, zs_value, z_bld.vec_type, ""); + mask_value = LLVMBuildTrunc(builder, mask_value, z_bld.int_vec_type, ""); } - z_dst = lp_build_select(&z_bld, lp_build_mask_value(mask), zs_value, z_dst); + z_dst = lp_build_select(&z_bld, mask_value, zs_value, z_dst); LLVMBuildStore(builder, z_dst, zs_dst_ptr); } -- 2.7.4