CodeEmitterNV50::emitLOAD(const Instruction *i)
{
DataFile sf = i->src(0).getFile();
- int32_t offset = i->getSrc(0)->reg.data.offset;
+ MAYBE_UNUSED int32_t offset = i->getSrc(0)->reg.data.offset;
switch (sf) {
case FILE_SHADER_INPUT:
}
static void
-interpApply(const InterpEntry *entry, uint32_t *code,
- bool force_persample_interp, bool flatshade)
+interpApply(const FixupEntry *entry, uint32_t *code, const FixupData& data)
{
int ipa = entry->ipa;
int encSize = entry->reg;
if ((ipa & NV50_IR_INTERP_SAMPLE_MASK) == NV50_IR_INTERP_DEFAULT &&
(ipa & NV50_IR_INTERP_MODE_MASK) != NV50_IR_INTERP_FLAT) {
- if (force_persample_interp) {
+ if (data.force_persample_interp) {
if (encSize == 8)
code[loc + 1] |= 1 << 16;
else
defId(i->def(0), 2);
srcAddr8(i->src(0), 16);
+ setAReg16(i, 0);
if (i->encSize != 8 && i->getInterpMode() == NV50_IR_INTERP_FLAT) {
code[0] |= 1 << 8;
}
}
+static void
+alphatestSet(const FixupEntry *entry, uint32_t *code, const FixupData& data)
+{
+ int loc = entry->loc;
+ int enc;
+
+ switch (data.alphatest) {
+ case PIPE_FUNC_NEVER: enc = 0x0; break;
+ case PIPE_FUNC_LESS: enc = 0x1; break;
+ case PIPE_FUNC_EQUAL: enc = 0x2; break;
+ case PIPE_FUNC_LEQUAL: enc = 0x3; break;
+ case PIPE_FUNC_GREATER: enc = 0x4; break;
+ case PIPE_FUNC_NOTEQUAL: enc = 0x5; break;
+ case PIPE_FUNC_GEQUAL: enc = 0x6; break;
+ default:
+ case PIPE_FUNC_ALWAYS: enc = 0xf; break;
+ }
+
+ code[loc + 1] &= ~(0x1f << 14);
+ code[loc + 1] |= enc << 14;
+}
+
void
CodeEmitterNV50::emitSET(const Instruction *i)
{
if (i->src(1).mod.abs()) code[1] |= 0x00080000;
emitForm_MAD(i);
+
+ if (i->subOp == 1) {
+ addInterp(0, 0, alphatestSet);
+ }
}
void
insn->encSize = 8;
for (int i = fn->bbCount - 1; i >= 0 && fn->bbArray[i] != insn->bb; --i) {
- fn->bbArray[i]->binPos += 4;
+ fn->bbArray[i]->binPos += adj;
}
fn->binSize += adj;
insn->bb->binSize += adj;
return;
}
}
- epilogue->binSize -= 8;
- func->binSize -= 8;
+
+ int adj = epilogue->getExit()->encSize;
+ epilogue->binSize -= adj;
+ func->binSize -= adj;
delete_Instruction(func->getProgram(), epilogue->getExit());
+
+ // There may be BB's that are laid out after the exit block
+ for (int i = func->bbCount - 1; i >= 0 && func->bbArray[i] != epilogue; --i) {
+ func->bbArray[i]->binPos -= adj;
+ }
}
void