Am 17.07.2018 um 19:04 schrieb Gert Wollny:
> From: Gert Wollny <gert.wol...@collabora.com>
> 
> The array index needs to be corrected and it must be insured that it is
> rounded and its value is non-negative before it is combined with the
> face id.
> 
> v5: Use RNDNE instead of ADD 0.5 and FLOOR (Ilia Mirkin)
> 
> Fixes 182 from android/cts/master/gles31-master.txt:
>   dEQP-GLES31.functional.texture.filtering.cube_array.formats.*
>   dEQP-GLES31.functional.texture.filtering.cube_array.sizes.*
>   
> dEQP-GLES31.functional.texture.filtering.cube_array.combinations.nearest_mipmap_*
>   
> dEQP-GLES31.functional.texture.filtering.cube_array.combinations.linear_mipmap_*
>   dEQP-GLES31.functional.texture.filtering.cube_array.no_edges_visible.*
> 
> Signed-off-by: Gert Wollny <gert.wol...@collabora.com>
> ---
>  src/gallium/drivers/r600/r600_shader.c | 34 
> +++++++++++++++++++++++++++++++++-
>  1 file changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/drivers/r600/r600_shader.c 
> b/src/gallium/drivers/r600/r600_shader.c
> index 15e35f006c..f170b30aee 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -7720,11 +7720,43 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
>                               if (r)
>                                       return r;
>  
> +                             /* Evaluate the array index according to 
> floor(idx + 0.5). This
> +                              * needs to be done before merging the face 
> select value, because
> +                              * otherwise the fractional part of the array 
> indes will interfere
index

> +                              * with the face select value */
> +                             memset(&alu, 0, sizeof(struct 
> r600_bytecode_alu));
> +                             r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
> +                             alu.op = ALU_OP1_RNDNE;
> +                             alu.dst.sel = ctx->temp_reg;
> +                             alu.dst.chan = 3;
> +                             alu.dst.write = 1;
> +                             alu.last = 1;
> +                             r = r600_bytecode_add_alu(ctx->bc, &alu);
> +                             if (r)
> +                                     return r;
> +
> +                             /* Because the array slice index and the cube 
> face index are merged
> +                              * into one value we have to make sure the 
> array slice index is >= 0,
> +                              * otherwise the face selection will fail */
> +                             memset(&alu, 0, sizeof(struct 
> r600_bytecode_alu));
> +                             alu.op = ALU_OP2_MAX;
> +                             alu.src[0].sel = ctx->temp_reg;
> +                             alu.src[0].chan = 3;
> +                             alu.src[1].sel = V_SQ_ALU_SRC_0;
> +                             alu.dst.sel = ctx->temp_reg;
> +                             alu.dst.chan = 3;
> +                             alu.dst.write = 1;
> +                             alu.last = 1;
> +                             r = r600_bytecode_add_alu(ctx->bc, &alu);
> +                             if (r)
> +                                     return r;
> +
Kind of lame that we have to do shader workarounds for a corner case
(who in their right mind relies on negative array indices getting
clamped to 0...), and worse it's even all dependent alu instructions,
but I don't see another way.

For the series:
Reviewed-by: Roland Scheidegger <srol...@vmware.com>

                                /* have to multiply original layer by 8 and add 
to face id (temp.w)
in Z */
>                               memset(&alu, 0, sizeof(struct 
> r600_bytecode_alu));
>                               alu.op = ALU_OP3_MULADD;
>                               alu.is_op3 = 1;
> -                             r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
> +                             alu.src[0].sel = ctx->temp_reg;
> +                             alu.src[0].chan = 3;
>                               alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
>                               alu.src[1].chan = 0;
>                               alu.src[1].value = u_bitcast_f2u(8.0f);
> 

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to