[Mesa-dev] [PATCH 1/6] gallivm: (trivial) handle non-aligned fetch for lp_build_fetch_rgba_soa

Jose Fonseca jfonseca at vmware.com
Tue Dec 20 14:14:54 UTC 2016


On 12/12/16 00:11, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> soa fetch so far always assumed that data was aligned. However, we want to
> use this for vertex fetch, and data might not be aligned there, so handle
> it in this path too (basically just pass through alignment through to other
> functions). (It looks like it wouldn't work for for cached s3tc but this is
> no different than with AoS fetch.)
> ---
>  src/gallium/auxiliary/gallivm/lp_bld_format.h     |  1 +
>  src/gallium/auxiliary/gallivm/lp_bld_format_soa.c | 15 +++++++++------
>  src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c |  4 ++--
>  3 files changed, 12 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format.h b/src/gallium/auxiliary/gallivm/lp_bld_format.h
> index 5c866f4..6540caa 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_format.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_format.h
> @@ -143,6 +143,7 @@ void
>  lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
>                          const struct util_format_description *format_desc,
>                          struct lp_type type,
> +                        boolean aligned,
>                          LLVMValueRef base_ptr,
>                          LLVMValueRef offsets,
>                          LLVMValueRef i,
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
> index 7444c51..389bfa0 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
> @@ -349,6 +349,7 @@ lp_build_rgba8_to_fi32_soa(struct gallivm_state *gallivm,
>   *
>   * \param type  the desired return type for 'rgba'.  The vector length
>   *              is the number of texels to fetch
> + * \param aligned if the offset is guaranteed to be aligned to element width
>   *
>   * \param base_ptr  points to the base of the texture mip tree.
>   * \param offset    offset to start of the texture image block.  For non-
> @@ -365,6 +366,7 @@ void
>  lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
>                          const struct util_format_description *format_desc,
>                          struct lp_type type,
> +                        boolean aligned,
>                          LLVMValueRef base_ptr,
>                          LLVMValueRef offset,
>                          LLVMValueRef i,
> @@ -402,7 +404,7 @@ lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
>                                 type.length,
>                                 format_desc->block.bits,
>                                 type.width,
> -                               TRUE,
> +                               aligned,
>                                 base_ptr, offset, FALSE);
>
>        /*
> @@ -428,7 +430,7 @@ lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
>
>        packed = lp_build_gather(gallivm, type.length,
>                                 format_desc->block.bits,
> -                               type.width, TRUE,
> +                               type.width, aligned,
>                                 base_ptr, offset, FALSE);
>        if (format_desc->format == PIPE_FORMAT_R11G11B10_FLOAT) {
>           lp_build_r11g11b10_to_float(gallivm, packed, rgba_out);
> @@ -456,14 +458,14 @@ lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
>           LLVMValueRef s_offset = lp_build_const_int_vec(gallivm, type, 4);
>           offset = LLVMBuildAdd(builder, offset, s_offset, "");
>           packed = lp_build_gather(gallivm, type.length, 32, type.width,
> -                                  TRUE, base_ptr, offset, FALSE);
> +                                  aligned, base_ptr, offset, FALSE);
>           packed = LLVMBuildAnd(builder, packed,
>                                 lp_build_const_int_vec(gallivm, type, mask), "");
>        }
>        else {
>           assert (format_desc->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT);
>           packed = lp_build_gather(gallivm, type.length, 32, type.width,
> -                                  TRUE, base_ptr, offset, TRUE);
> +                                  aligned, base_ptr, offset, TRUE);
>           packed = LLVMBuildBitCast(builder, packed,
>                                     lp_build_vec_type(gallivm, type), "");
>        }
> @@ -489,7 +491,7 @@ lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
>        tmp_type.norm = TRUE;
>
>        tmp = lp_build_fetch_rgba_aos(gallivm, format_desc, tmp_type,
> -                                    TRUE, base_ptr, offset, i, j, cache);
> +                                    aligned, base_ptr, offset, i, j, cache);
>
>        lp_build_rgba8_to_fi32_soa(gallivm,
>                                  type,
> @@ -509,6 +511,7 @@ lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
>        const struct util_format_description *flinear_desc;
>        LLVMValueRef packed;
>        flinear_desc = util_format_description(util_format_linear(format_desc->format));
> +      /* This probably only works with aligned data */
>        packed = lp_build_fetch_cached_texels(gallivm,
>                                              flinear_desc,
>                                              type.length,
> @@ -572,7 +575,7 @@ lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
>
>           /* Get a single float[4]={R,G,B,A} pixel */
>           tmp = lp_build_fetch_rgba_aos(gallivm, format_desc, tmp_type,
> -                                       TRUE, base_ptr, offset_elem,
> +                                       aligned, base_ptr, offset_elem,
>                                         i_elem, j_elem, cache);
>
>           /*
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> index 939cd43..161a03f 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> @@ -159,7 +159,7 @@ lp_build_sample_texel_soa(struct lp_build_sample_context *bld,
>
>     lp_build_fetch_rgba_soa(bld->gallivm,
>                             bld->format_desc,
> -                           bld->texel_type,
> +                           bld->texel_type, TRUE,
>                             data_ptr, offset,
>                             i, j,
>                             bld->cache,
> @@ -2406,7 +2406,7 @@ lp_build_fetch_texel(struct lp_build_sample_context *bld,
>
>     lp_build_fetch_rgba_soa(bld->gallivm,
>                             bld->format_desc,
> -                           bld->texel_type,
> +                           bld->texel_type, TRUE,
>                             bld->base_ptr, offset,
>                             i, j,
>                             bld->cache,
>

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>


More information about the mesa-dev mailing list