[Mesa-dev] [PATCH v4 4/4] r600: Correct evaluation of cube array index and face

Gert Wollny gw.fossdev at gmail.com
Mon Jul 16 08:26:20 UTC 2018


From: Gert Wollny <gert.wollny at collabora.com>

The array index needs to be corrected and it must be insured that its
value is non-negative before it is combined with the face id.

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.wollny at collabora.com>
---
 src/gallium/drivers/r600/r600_shader.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index 6f1e0b34f3..e05a93ca62 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -7754,11 +7754,38 @@ 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 index 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);
+				r = r600_shader_evaluate_array_index(&alu, ctx->temp_reg, 3, 0, ctx->bc);
+				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 might 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



More information about the mesa-dev mailing list