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
+                                * 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;
+
                                /* 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);
-- 
2.16.4

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

Reply via email to