r600g: fix reserve_cfile for R700+
authorChristian König <deathsimple@vodafone.de>
Tue, 18 Jan 2011 21:45:23 +0000 (22:45 +0100)
committerChristian König <deathsimple@vodafone.de>
Tue, 18 Jan 2011 23:40:28 +0000 (00:40 +0100)
According to R700 ISA we have only two channels for cfile constants.
This patch makes piglit tests "glsl1-constant array with constant
indexing" happy on RV710.

src/gallium/drivers/r600/r600_asm.c

index 78cb60e1b3ab5056c1d751652f778b7e9d147daf..b9c74e93299a0aaf92cba75aa50fe7eafe02b0c0 100644 (file)
@@ -539,26 +539,24 @@ static int reserve_gpr(struct alu_bank_swizzle *bs, unsigned sel, unsigned chan,
        return 0;
 }
 
-static int reserve_cfile(struct alu_bank_swizzle *bs, unsigned sel, unsigned chan)
+static int reserve_cfile(struct r600_bc *bc, struct alu_bank_swizzle *bs, unsigned sel, unsigned chan)
 {
-       int res, resmatch = -1, resempty = -1;
-       for (res = 3; res >= 0; --res) {
-               if (bs->hw_cfile_addr[res] == -1)
-                       resempty = res;
-               else if (bs->hw_cfile_addr[res] == sel &&
-                       bs->hw_cfile_elem[res] == chan)
-                       resmatch = res;
+       int res, num_res = 4;
+       if (bc->chiprev >= CHIPREV_R700) {
+               num_res = 2;
+               chan /= 2;
        }
-       if (resmatch != -1)
-               return 0; // Read for this scalar element already reserved, nothing to do here.
-       else if (resempty != -1) {
-               bs->hw_cfile_addr[resempty] = sel;
-               bs->hw_cfile_elem[resempty] = chan;
-       } else {
-               // All cfile read ports are used, cannot reference vector element
-               return -1;
+       for (res = 0; res < num_res; ++res) {
+               if (bs->hw_cfile_addr[res] == -1) {
+                       bs->hw_cfile_addr[res] = sel;
+                       bs->hw_cfile_elem[res] = chan;
+                       return 0;
+               } else if (bs->hw_cfile_addr[res] == sel &&
+                       bs->hw_cfile_elem[res] == chan)
+                       return 0; // Read for this scalar element already reserved, nothing to do here.
        }
-       return 0;
+       // All cfile read ports are used, cannot reference vector element
+       return -1;
 }
 
 static int is_gpr(unsigned sel)
@@ -604,7 +602,7 @@ static int check_vector(struct r600_bc *bc, struct r600_bc_alu *alu,
                                        return r;
                        }
                } else if (is_cfile(sel)) {
-                       r = reserve_cfile(bs, sel, elem);
+                       r = reserve_cfile(bc, bs, sel, elem);
                        if (r)
                                return r;
                }
@@ -631,7 +629,7 @@ static int check_scalar(struct r600_bc *bc, struct r600_bc_alu *alu,
                                const_count++;
                }
                if (is_cfile(sel)) {
-                       r = reserve_cfile(bs, sel, elem);
+                       r = reserve_cfile(bc, bs, sel, elem);
                        if (r)
                                return r;
                }