r600g: fix regression in cubemap tests since eea1d8199b376f37027c14669e0bdf991a22872d
authorDave Airlie <airlied@redhat.com>
Mon, 31 Jan 2011 03:03:10 +0000 (13:03 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 31 Jan 2011 03:06:17 +0000 (13:06 +1000)
Although CUBE is a reduction inst, it writes to more than just PV.X
so we need to keep the dst channel.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_asm.c
src/gallium/drivers/r600/r600_texture.c

index 3b0d01b8720bdd91c7163ec76d302d7116c8d436..13bf7644e7e59dc80f5c75bcf8deb74732f9ab39 100644 (file)
@@ -355,6 +355,20 @@ static int is_alu_reduction_inst(struct r600_bc *bc, struct r600_bc_alu *alu)
        }
 }
 
+static int is_alu_cube_inst(struct r600_bc *bc, struct r600_bc_alu *alu)
+{
+       switch (bc->chiprev) {
+       case CHIPREV_R600:
+       case CHIPREV_R700:
+               return !alu->is_op3 &&
+                       alu->inst == V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE;
+       case CHIPREV_EVERGREEN:
+       default:
+               return !alu->is_op3 &&
+                       alu->inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE;
+       }
+}
+
 static int is_alu_mova_inst(struct r600_bc *bc, struct r600_bc_alu *alu)
 {
        switch (bc->chiprev) {
@@ -722,7 +736,8 @@ static int replace_gpr_with_pv_ps(struct r600_bc *bc,
        for (i = 0; i < 5; ++i) {
                if(prev[i] && prev[i]->dst.write && !prev[i]->dst.rel) {
                        gpr[i] = prev[i]->dst.sel;
-                       if (is_alu_reduction_inst(bc, prev[i]))
+                       /* cube writes more than PV.X */
+                       if (!is_alu_cube_inst(bc, prev[i]) && is_alu_reduction_inst(bc, prev[i]))
                                chan[i] = 0;
                        else
                                chan[i] = prev[i]->dst.chan;
index 91076269ec7f6a8acf78038c49501aed38b37c90..e45f4a517e0ef8d16edb16f0774d7bb455f41bdc 100644 (file)
@@ -923,7 +923,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
                            desc->channel[1].size == 10 &&
                            desc->channel[2].size == 10 &&
                            desc->channel[3].size == 2) {
-                               result = FMT_10_10_10_2;
+                               result = FMT_2_10_10_10;
                                goto out_word4;
                        }
                        goto out_unknown;