[Mesa-dev] [PATCH] llvmpipe: fix using wrong format with MRT in blend code
Jose Fonseca
jfonseca at vmware.com
Tue Jan 15 13:53:31 PST 2013
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
----- Original Message -----
> From: Roland Scheidegger <sroland at vmware.com>
>
> We were passing in the rt index however this was always 0 for
> non-independent
> blend case. (The format was only actually used to decide if the color
> mask
> covered all channels so this went unnoticed and was discovered by
> accident.)
> (Also do some trivial cleanup.)
> ---
> src/gallium/drivers/llvmpipe/lp_bld_blend.h | 2 +-
> src/gallium/drivers/llvmpipe/lp_bld_blend_aos.c | 6 +++---
> src/gallium/drivers/llvmpipe/lp_state_fs.c | 22
> +++++++++++-----------
> src/gallium/drivers/llvmpipe/lp_test_blend.c | 2 +-
> 4 files changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_bld_blend.h
> b/src/gallium/drivers/llvmpipe/lp_bld_blend.h
> index 0a1cea1..3a3be81 100644
> --- a/src/gallium/drivers/llvmpipe/lp_bld_blend.h
> +++ b/src/gallium/drivers/llvmpipe/lp_bld_blend.h
> @@ -56,7 +56,7 @@ lp_build_blend(struct lp_build_context *bld,
> LLVMValueRef
> lp_build_blend_aos(struct gallivm_state *gallivm,
> const struct pipe_blend_state *blend,
> - const enum pipe_format *cbuf_format,
> + const enum pipe_format cbuf_format,
> struct lp_type type,
> unsigned rt,
> LLVMValueRef src,
> diff --git a/src/gallium/drivers/llvmpipe/lp_bld_blend_aos.c
> b/src/gallium/drivers/llvmpipe/lp_bld_blend_aos.c
> index 641c253..2dc2082 100644
> --- a/src/gallium/drivers/llvmpipe/lp_bld_blend_aos.c
> +++ b/src/gallium/drivers/llvmpipe/lp_bld_blend_aos.c
> @@ -266,7 +266,7 @@ lp_build_blend_factor(struct
> lp_build_blend_aos_context *bld,
> * @param blend the blend state of the shader variant
> * @param cbuf_format format of the colour buffer
> * @param type data type of the pixel vector
> - * @param rt rt number
> + * @param rt blend state index number
> * @param src blend src
> * @param dst blend dst
> * @param mask optional mask to apply to the blending
> result
> @@ -278,7 +278,7 @@ lp_build_blend_factor(struct
> lp_build_blend_aos_context *bld,
> LLVMValueRef
> lp_build_blend_aos(struct gallivm_state *gallivm,
> const struct pipe_blend_state *blend,
> - const enum pipe_format *cbuf_format,
> + const enum pipe_format cbuf_format,
> struct lp_type type,
> unsigned rt,
> LLVMValueRef src,
> @@ -298,7 +298,7 @@ lp_build_blend_aos(struct gallivm_state *gallivm,
> unsigned alpha_swizzle = UTIL_FORMAT_SWIZZLE_NONE;
> unsigned i;
>
> - desc = util_format_description(cbuf_format[rt]);
> + desc = util_format_description(cbuf_format);
>
> /* Setup build context */
> memset(&bld, 0, sizeof bld);
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> index 5a8351b..551fba6 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> @@ -1010,7 +1010,7 @@ lp_blend_type_from_format_desc(const struct
> util_format_description *format_desc
>
>
> /**
> - * Scale a normalised value from src_bits to dst_bits
> + * Scale a normalized value from src_bits to dst_bits
> */
> static INLINE LLVMValueRef
> scale_bits(struct gallivm_state *gallivm,
> @@ -1578,6 +1578,7 @@ generate_unswizzled_blend(struct gallivm_state
> *gallivm,
> unsigned pixels = block_size / src_count;
> unsigned channels = pad_inline ? TGSI_NUM_CHANNELS :
> dst_channels;
> unsigned alpha_span = 1;
> + LLVMValueRef shuffles[LP_MAX_VECTOR_LENGTH];
>
> /* Check if we need 2 src_alphas for our shuffles */
> if (pixels > alpha_type.length) {
> @@ -1585,8 +1586,15 @@ generate_unswizzled_blend(struct gallivm_state
> *gallivm,
> }
>
> /* Broadcast alpha across all channels, e.g. a1a2 to
> a1a1a1a1a2a2a2a2 */
> + for (j = 0; j < row_type.length; ++j) {
> + if (j < pixels * channels) {
> + shuffles[j] = lp_build_const_int32(gallivm, j /
> channels);
> + } else {
> + shuffles[j] =
> LLVMGetUndef(LLVMInt32TypeInContext(gallivm->context));
> + }
> + }
> +
> for (i = 0; i < src_count; ++i) {
> - LLVMValueRef shuffles[LP_MAX_VECTOR_LENGTH];
> unsigned idx1 = i, idx2 = i;
>
> if (alpha_span > 1){
> @@ -1594,14 +1602,6 @@ generate_unswizzled_blend(struct gallivm_state
> *gallivm,
> idx2 = idx1 + 1;
> }
>
> - for (j = 0; j < row_type.length; ++j) {
> - if (j < pixels * channels) {
> - shuffles[j] = lp_build_const_int32(gallivm, j /
> channels);
> - } else {
> - shuffles[j] =
> LLVMGetUndef(LLVMInt32TypeInContext(gallivm->context));
> - }
> - }
> -
> src_alpha[i] = LLVMBuildShuffleVector(builder,
> src_alpha[idx1],
> src_alpha[idx2],
> @@ -1650,7 +1650,7 @@ generate_unswizzled_blend(struct gallivm_state
> *gallivm,
> for (i = 0; i < src_count; ++i) {
> dst[i] = lp_build_blend_aos(gallivm,
> &variant->key.blend,
> - variant->key.cbuf_format,
> + out_format,
> row_type,
> rt,
> src[i],
> diff --git a/src/gallium/drivers/llvmpipe/lp_test_blend.c
> b/src/gallium/drivers/llvmpipe/lp_test_blend.c
> index 9c0a076..754434d 100644
> --- a/src/gallium/drivers/llvmpipe/lp_test_blend.c
> +++ b/src/gallium/drivers/llvmpipe/lp_test_blend.c
> @@ -172,7 +172,7 @@ add_blend_test(struct gallivm_state *gallivm,
> dst = LLVMBuildLoad(builder, dst_ptr, "dst");
> con = LLVMBuildLoad(builder, const_ptr, "const");
>
> - res = lp_build_blend_aos(gallivm, blend, &format, type, rt, src,
> NULL, dst, NULL, con, NULL, swizzle, 4);
> + res = lp_build_blend_aos(gallivm, blend, format, type, rt, src,
> NULL, dst, NULL, con, NULL, swizzle, 4);
>
> lp_build_name(res, "res");
>
> --
> 1.7.9.5
>
More information about the mesa-dev
mailing list