[Mesa-dev] [PATCH] gallivm: more integer texture format fetch fixes
Roland Scheidegger
sroland at vmware.com
Thu Jan 10 18:25:55 PST 2013
Oops sorry that was totally the wrong commit message, ignore it...
Roland
On 01/10/2013 06:22 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> Change the texel type to int/uint instead of float throughout the sampling
> code which makes it easier to catch errors (as llvm will complain about wrong
> types if we mistakenly treat these values as real floats somewhere).
> This should also get things like e.g. sampler swizzles (for unused channels)
> right.
> This fixes piglit texture_integer_glsl130 test.
> Border color not working (crashing) yet.
> (These formats are not exposed yet in llvmpipe.)
>
> v2: couple cleanups according to José's comments
>
> Reviewed-by: José Fonseca <jfonseca at vmware.com>
> ---
> 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");
>
>
More information about the mesa-dev
mailing list