mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
r600g: fix reserve_cfile for R700+
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.
This commit is contained in:
parent
46f7105df4
commit
ba700d2ead
1 changed files with 17 additions and 19 deletions
|
|
@ -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 &&
|
||||
int res, num_res = 4;
|
||||
if (bc->chiprev >= CHIPREV_R700) {
|
||||
num_res = 2;
|
||||
chan /= 2;
|
||||
}
|
||||
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)
|
||||
resmatch = res;
|
||||
return 0; // Read for this scalar element already reserved, nothing to do here.
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue