Mesa (master): r600g: fix lod bias/explicit lod with cube maps.

Dave Airlie airlied at kemper.freedesktop.org
Thu Nov 8 23:30:56 UTC 2012


Module: Mesa
Branch: master
Commit: 037b4f80384c72c12e31192d1a30411d4660972d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=037b4f80384c72c12e31192d1a30411d4660972d

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Nov  7 07:51:56 2012 +1000

r600g: fix lod bias/explicit lod with cube maps.

While developing cube map array support I found that we didn't
support this properly, also piglit didn't test for it at all.

I've submitted a test to piglit to check for this, and this
fixes explicit lod and lod bias with cube maps.

NOTE: This is a candidate for the 9.0 branch.

Signed-off-by: Dave Airlie <airlied at redhat.com>

---

 src/gallium/drivers/r600/r600_shader.c |   28 ++++++++++++++++++++--------
 1 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index 782fa4c..8d0a9b4 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -4087,6 +4087,23 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
 			if (r)
 				return r;
 		}
+
+		/* for cube forms of lod and bias we need to route the lod
+		   value into Z */
+		if (inst->Instruction.Opcode == TGSI_OPCODE_TXB ||
+		    inst->Instruction.Opcode == TGSI_OPCODE_TXL) {
+			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
+			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
+			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
+			alu.dst.sel = ctx->temp_reg;
+			alu.dst.chan = 2;
+			alu.last = 1;
+			alu.dst.write = 1;
+			r = r600_bytecode_add_alu(ctx->bc, &alu);
+			if (r)
+				return r;
+		}
+
 		src_loaded = TRUE;
 		src_gpr = ctx->temp_reg;
 	}
@@ -4283,17 +4300,12 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
 		tex.src_rel = ctx->src[0].rel;
 	}
 
-	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
-		tex.src_sel_x = 1;
-		tex.src_sel_y = 0;
-		tex.src_sel_z = 3;
-		tex.src_sel_w = 1;
-	}
-	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
+	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
+	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
 		tex.src_sel_x = 1;
 		tex.src_sel_y = 0;
 		tex.src_sel_z = 3;
-		tex.src_sel_w = 2; /* route Z compare value into W */
+		tex.src_sel_w = 2; /* route Z compare or Lod value into W */
 	}
 
 	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&




More information about the mesa-commit mailing list