r600g: fix lod bias/explicit lod with cube maps.
authorDave Airlie <airlied@redhat.com>
Tue, 6 Nov 2012 21:51:56 +0000 (07:51 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 8 Nov 2012 23:24:40 +0000 (09:24 +1000)
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@redhat.com>
src/gallium/drivers/r600/r600_shader.c

index 782fa4c469c7429375d274a33c7cb45df59b5e03..8d0a9b4569ec7948fefc5e65268d5018f964e260 100644 (file)
@@ -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 &&