[Mesa-dev] [PATCH 1/2] llvmpipe: Fix deferred depth writes for Z16_UNORM.

Roland Scheidegger sroland at vmware.com
Tue Jan 29 08:33:23 PST 2013


Am 29.01.2013 14:28, schrieb jfonseca at vmware.com:
> From: José Fonseca <jfonseca at vmware.com>
> 
> 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.
> ---
>  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);
>  }
> 

Both patches look good to me, though I guess at some point we should fix
stencil-only for real.

Roland


More information about the mesa-dev mailing list