From 037b4f80384c72c12e31192d1a30411d4660972d Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 7 Nov 2012 07:51:56 +1000 Subject: [PATCH] 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 --- src/gallium/drivers/r600/r600_shader.c | 28 ++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 782fa4c469c..8d0a9b4569e 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 && -- 2.30.2