mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 20:28:04 +02:00
nv50/ir: fetch indirect sources BEFORE the op that uses them
All the BuildUtil helpers just insert the operation into the current BB. So we have to take care that any fetchSrc() operations happen before the operation whose setIndirect() it goes into. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Cc: mesa-stable@lists.freedesktop.org
This commit is contained in:
parent
9545139ce5
commit
8c02ee4a8b
1 changed files with 32 additions and 19 deletions
|
|
@ -2632,6 +2632,10 @@ Converter::handleLOAD(Value *dst0[4])
|
|||
const int r = tgsi.getSrc(0).getIndex(0);
|
||||
int c;
|
||||
std::vector<Value *> off, src, ldv, def;
|
||||
Value *ind = NULL;
|
||||
|
||||
if (tgsi.getSrc(0).isIndirect(0))
|
||||
ind = fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0);
|
||||
|
||||
switch (tgsi.getSrc(0).getFile()) {
|
||||
case TGSI_FILE_BUFFER:
|
||||
|
|
@ -2658,8 +2662,8 @@ Converter::handleLOAD(Value *dst0[4])
|
|||
|
||||
Instruction *ld = mkLoad(TYPE_U32, dst0[c], sym, off);
|
||||
ld->cache = tgsi.getCacheMode();
|
||||
if (tgsi.getSrc(0).isIndirect(0))
|
||||
ld->setIndirect(0, 1, fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0));
|
||||
if (ind)
|
||||
ld->setIndirect(0, 1, ind);
|
||||
}
|
||||
break;
|
||||
case TGSI_FILE_IMAGE: {
|
||||
|
|
@ -2681,8 +2685,8 @@ Converter::handleLOAD(Value *dst0[4])
|
|||
ld->tex.mask = tgsi.getDst(0).getMask();
|
||||
ld->tex.format = getImageFormat(code, r);
|
||||
ld->cache = tgsi.getCacheMode();
|
||||
if (tgsi.getSrc(0).isIndirect(0))
|
||||
ld->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
|
||||
if (ind)
|
||||
ld->setIndirectR(ind);
|
||||
|
||||
FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi)
|
||||
if (dst0[c] != def[c])
|
||||
|
|
@ -2770,6 +2774,10 @@ Converter::handleSTORE()
|
|||
const int r = tgsi.getDst(0).getIndex(0);
|
||||
int c;
|
||||
std::vector<Value *> off, src, dummy;
|
||||
Value *ind = NULL;
|
||||
|
||||
if (tgsi.getDst(0).isIndirect(0))
|
||||
ind = fetchSrc(tgsi.getDst(0).getIndirect(0), 0, 0);
|
||||
|
||||
switch (tgsi.getDst(0).getFile()) {
|
||||
case TGSI_FILE_BUFFER:
|
||||
|
|
@ -2792,8 +2800,8 @@ Converter::handleSTORE()
|
|||
|
||||
Instruction *st = mkStore(OP_STORE, TYPE_U32, sym, off, fetchSrc(1, c));
|
||||
st->cache = tgsi.getCacheMode();
|
||||
if (tgsi.getDst(0).isIndirect(0))
|
||||
st->setIndirect(0, 1, fetchSrc(tgsi.getDst(0).getIndirect(0), 0, 0));
|
||||
if (ind)
|
||||
st->setIndirect(0, 1, ind);
|
||||
}
|
||||
break;
|
||||
case TGSI_FILE_IMAGE: {
|
||||
|
|
@ -2811,8 +2819,8 @@ Converter::handleSTORE()
|
|||
st->tex.mask = tgsi.getDst(0).getMask();
|
||||
st->tex.format = getImageFormat(code, r);
|
||||
st->cache = tgsi.getCacheMode();
|
||||
if (tgsi.getDst(0).isIndirect(0))
|
||||
st->setIndirectR(fetchSrc(tgsi.getDst(0).getIndirect(0), 0, NULL));
|
||||
if (ind)
|
||||
st->setIndirectR(ind);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
@ -2881,6 +2889,10 @@ Converter::handleATOM(Value *dst0[4], DataType ty, uint16_t subOp)
|
|||
std::vector<Value *> srcv;
|
||||
std::vector<Value *> defv;
|
||||
LValue *dst = getScratch();
|
||||
Value *ind = NULL;
|
||||
|
||||
if (tgsi.getSrc(0).isIndirect(0))
|
||||
ind = fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0);
|
||||
|
||||
switch (tgsi.getSrc(0).getFile()) {
|
||||
case TGSI_FILE_BUFFER:
|
||||
|
|
@ -2890,23 +2902,21 @@ Converter::handleATOM(Value *dst0[4], DataType ty, uint16_t subOp)
|
|||
continue;
|
||||
|
||||
Instruction *insn;
|
||||
Value *off = fetchSrc(1, c), *off2 = NULL;
|
||||
Value *off = fetchSrc(1, c);
|
||||
Value *sym;
|
||||
if (tgsi.getSrc(1).getFile() == TGSI_FILE_IMMEDIATE)
|
||||
sym = makeSym(tgsi.getSrc(0).getFile(), r, -1, c,
|
||||
tgsi.getSrc(1).getValueU32(c, info));
|
||||
else
|
||||
sym = makeSym(tgsi.getSrc(0).getFile(), r, -1, c, 0);
|
||||
if (tgsi.getSrc(0).isIndirect(0))
|
||||
off2 = fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0);
|
||||
if (subOp == NV50_IR_SUBOP_ATOM_CAS)
|
||||
insn = mkOp3(OP_ATOM, ty, dst, sym, fetchSrc(2, c), fetchSrc(3, c));
|
||||
else
|
||||
insn = mkOp2(OP_ATOM, ty, dst, sym, fetchSrc(2, c));
|
||||
if (tgsi.getSrc(1).getFile() != TGSI_FILE_IMMEDIATE)
|
||||
insn->setIndirect(0, 0, off);
|
||||
if (off2)
|
||||
insn->setIndirect(0, 1, off2);
|
||||
if (ind)
|
||||
insn->setIndirect(0, 1, ind);
|
||||
insn->subOp = subOp;
|
||||
}
|
||||
for (int c = 0; c < 4; ++c)
|
||||
|
|
@ -2929,8 +2939,8 @@ Converter::handleATOM(Value *dst0[4], DataType ty, uint16_t subOp)
|
|||
tex->tex.mask = 1;
|
||||
tex->tex.format = getImageFormat(code, r);
|
||||
tex->setType(ty);
|
||||
if (tgsi.getSrc(0).isIndirect(0))
|
||||
tex->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
|
||||
if (ind)
|
||||
tex->setIndirectR(ind);
|
||||
|
||||
for (int c = 0; c < 4; ++c)
|
||||
if (dst0[c])
|
||||
|
|
@ -3802,12 +3812,14 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
|
|||
break;
|
||||
case TGSI_OPCODE_RESQ:
|
||||
if (tgsi.getSrc(0).getFile() == TGSI_FILE_BUFFER) {
|
||||
Value *ind = NULL;
|
||||
if (tgsi.getSrc(0).isIndirect(0))
|
||||
ind = fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0);
|
||||
geni = mkOp1(OP_BUFQ, TYPE_U32, dst0[0],
|
||||
makeSym(tgsi.getSrc(0).getFile(),
|
||||
tgsi.getSrc(0).getIndex(0), -1, 0, 0));
|
||||
if (tgsi.getSrc(0).isIndirect(0))
|
||||
geni->setIndirect(0, 1,
|
||||
fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0));
|
||||
if (ind)
|
||||
geni->setIndirect(0, 1, ind);
|
||||
} else {
|
||||
assert(tgsi.getSrc(0).getFile() == TGSI_FILE_IMAGE);
|
||||
|
||||
|
|
@ -3820,10 +3832,11 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
|
|||
}
|
||||
texi->tex.r = tgsi.getSrc(0).getIndex(0);
|
||||
texi->tex.target = getImageTarget(code, texi->tex.r);
|
||||
bb->insertTail(texi);
|
||||
|
||||
if (tgsi.getSrc(0).isIndirect(0))
|
||||
texi->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
|
||||
|
||||
bb->insertTail(texi);
|
||||
}
|
||||
break;
|
||||
case TGSI_OPCODE_IBFE:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue