[Mesa-dev] [PATCH] llvmpipe: fix txq for 1d/2d arrays. (v2)
Roland Scheidegger
sroland at vmware.com
Mon Dec 10 15:24:26 PST 2012
Am 10.12.2012 22:36, schrieb Dave Airlie:
> From: Dave Airlie <airlied at redhat.com>
>
> Noticed would fail, we were doing two things wrong
>
> a) 1d arrays require the layers in height
> b) minifying the layers field.
>
> v2: don't change height code, fixup completely inside txq
> as suggested by Roland.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 26 +++++++++++++++++++----
> 1 file changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> index ba265b2..dbedd01 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> @@ -1681,6 +1681,7 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
> LLVMValueRef lod;
> LLVMValueRef size;
> int dims, i;
> + boolean has_array = FALSE;
> struct lp_build_context bld_int_vec;
>
> switch (static_state->target) {
> @@ -1688,6 +1689,10 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
> case PIPE_BUFFER:
> dims = 1;
> break;
> + case PIPE_TEXTURE_1D_ARRAY:
> + dims = 1;
> + has_array = TRUE;
> + break;
> case PIPE_TEXTURE_2D:
> case PIPE_TEXTURE_CUBE:
> case PIPE_TEXTURE_RECT:
> @@ -1696,7 +1701,10 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
> case PIPE_TEXTURE_3D:
> dims = 3;
> break;
> -
> + case PIPE_TEXTURE_2D_ARRAY:
> + dims = 2;
> + has_array = TRUE;
> + break;
> default:
> assert(0);
> return;
> @@ -1723,21 +1731,31 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
> dynamic_state->width(dynamic_state, gallivm, unit),
> lp_build_const_int32(gallivm, 0), "");
>
> + if (dims == 1)
> + size = lp_build_minify(&bld_int_vec, size, lod);
> +
> if (dims >= 2) {
> size = LLVMBuildInsertElement(gallivm->builder, size,
> dynamic_state->height(dynamic_state, gallivm, unit),
> lp_build_const_int32(gallivm, 1), "");
> + if (dims == 2)
> + size = lp_build_minify(&bld_int_vec, size, lod);
> }
>
> if (dims >= 3) {
> size = LLVMBuildInsertElement(gallivm->builder, size,
> dynamic_state->depth(dynamic_state, gallivm, unit),
> lp_build_const_int32(gallivm, 2), "");
> + if (dims == 3)
> + size = lp_build_minify(&bld_int_vec, size, lod);
> }
> +
> + if (has_array)
> + size = LLVMBuildInsertElement(gallivm->builder, size,
> + dynamic_state->depth(dynamic_state, gallivm, unit),
> + lp_build_const_int32(gallivm, dims), "");
>
> - size = lp_build_minify(&bld_int_vec, size, lod);
> -
> - for (i=0; i < dims; i++) {
> + for (i = 0; i < dims + (has_array ? 1 : 0); i++) {
> sizes_out[i] = lp_build_extract_broadcast(gallivm, bld_int_vec.type, int_type,
> size,
> lp_build_const_int32(gallivm, i));
>
Minor nitpick, the (if dims == 1/2/3) clauses seem a bit unnecessary you
could simply do the minify just before the (if has_array) clause like it
was before (and inserting the array layers into size seems unnecessary
too could just use lp_build_broadcast_scalar directly) but either way
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
More information about the mesa-dev
mailing list