From: José Fonseca <jose.r.fons...@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@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev