[Mesa-dev] [PATCH] llvmpipe: Fix rendering into PIPE_FORMAT_X8B8G8R8_UNORM.

Jose Fonseca jfonseca at vmware.com
Fri Feb 22 08:18:48 PST 2013


Roland found a better fix. Please ignore.

Jose

----- Original Message -----
> From: José Fonseca <jose.r.fonseca at gmail.com>
> 
> Weird format, which Mesa state tracker recently started using.
> 
> Fixes segfault in
> 
>   ./bin/texture-packed-formats -auto
> 
> because swizzle[foo] was 0xff for padding channel (X). It still fails though.
> 
> I believe the only reason this doesn't BGRX doesn't crash is that we have
> special code for when X in in the last channel.
> ---
>  src/gallium/drivers/llvmpipe/lp_state_fs.c |   16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> index 44a9fcb..9bf9b9c 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> @@ -1493,7 +1493,7 @@ generate_unswizzled_blend(struct gallivm_state
> *gallivm,
>     vector_width    = dst_type.floating ? lp_native_vector_width :
>     lp_integer_vector_width;
>  
>     /* Compute correct swizzle and count channels */
> -   memset(swizzle, 0xFF, TGSI_NUM_CHANNELS);
> +   memset(swizzle, LP_BLD_SWIZZLE_DONTCARE, TGSI_NUM_CHANNELS);
>     dst_channels = 0;
>  
>     for (i = 0; i < TGSI_NUM_CHANNELS; ++i) {
> @@ -1538,7 +1538,12 @@ generate_unswizzled_blend(struct gallivm_state
> *gallivm,
>  
>        /* Load each channel */
>        for (j = 0; j < dst_channels; ++j) {
> -         fs_src[i][j] = LLVMBuildLoad(builder,
> fs_out_color[rt][swizzle[j]][i], "");
> +         unsigned src_channel = swizzle[j];
> +         if (src_channel < 4) {
> +            fs_src[i][j] = LLVMBuildLoad(builder,
> fs_out_color[rt][src_channel][i], "");
> +         } else {
> +            fs_src[i][j] = lp_build_undef(gallivm, fs_type);
> +         }
>        }
>  
>        /* If 3 channels then pad to include alpha for 4 element transpose */
> @@ -1568,7 +1573,12 @@ generate_unswizzled_blend(struct gallivm_state
> *gallivm,
>           LLVMValueRef alpha = LLVMBuildLoad(builder,
>           fs_out_color[1][alpha_channel][i], "");
>  
>           for (j = 0; j < dst_channels; ++j) {
> -            fs_src1[i][j] = LLVMBuildLoad(builder,
> fs_out_color[1][swizzle[j]][i], "");
> +            unsigned src_channel = swizzle[j];
> +            if (src_channel < 4) {
> +               fs_src1[i][j] = LLVMBuildLoad(builder,
> fs_out_color[1][src_channel][i], "");
> +            } else {
> +               fs_src1[i][j] = lp_build_undef(gallivm, fs_type);
> +            }
>           }
>           if (dst_channels == 3 && !has_alpha) {
>              fs_src1[i][3] = alpha;
> --
> 1.7.10.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list