mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 09:00:10 +01:00
gv100/ir: implement sample shading
Fixes sample shading tests in the Khronos OpenGL(ES) CTS Signed-off-by: Karol Herbst <kherbst@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5747>
This commit is contained in:
parent
5786c63be3
commit
a43eb650de
1 changed files with 45 additions and 7 deletions
|
|
@ -910,6 +910,40 @@ CodeEmitterGV100::emitATOMS()
|
||||||
emitGPR (16, insn->def(0));
|
emitGPR (16, insn->def(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
interpApply(const FixupEntry *entry, uint32_t *code, const FixupData& data)
|
||||||
|
{
|
||||||
|
int ipa = entry->ipa;
|
||||||
|
int loc = entry->loc;
|
||||||
|
|
||||||
|
if (data.force_persample_interp &&
|
||||||
|
(ipa & NV50_IR_INTERP_SAMPLE_MASK) == NV50_IR_INTERP_DEFAULT &&
|
||||||
|
(ipa & NV50_IR_INTERP_MODE_MASK) != NV50_IR_INTERP_FLAT) {
|
||||||
|
ipa |= NV50_IR_INTERP_CENTROID;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sample;
|
||||||
|
switch (ipa & NV50_IR_INTERP_SAMPLE_MASK) {
|
||||||
|
case NV50_IR_INTERP_DEFAULT : sample = 0; break;
|
||||||
|
case NV50_IR_INTERP_CENTROID: sample = 1; break;
|
||||||
|
case NV50_IR_INTERP_OFFSET : sample = 2; break;
|
||||||
|
default: assert(!"invalid sample mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
int interp;
|
||||||
|
switch (ipa & NV50_IR_INTERP_MODE_MASK) {
|
||||||
|
case NV50_IR_INTERP_LINEAR :
|
||||||
|
case NV50_IR_INTERP_PERSPECTIVE: interp = 0; break;
|
||||||
|
case NV50_IR_INTERP_FLAT : interp = 1; break;
|
||||||
|
case NV50_IR_INTERP_SC : interp = 2; break;
|
||||||
|
default: assert(!"invalid ipa mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
code[loc + 2] &= ~(0xf << 12);
|
||||||
|
code[loc + 2] |= sample << 12;
|
||||||
|
code[loc + 2] |= interp << 14;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CodeEmitterGV100::emitIPA()
|
CodeEmitterGV100::emitIPA()
|
||||||
{
|
{
|
||||||
|
|
@ -926,17 +960,21 @@ CodeEmitterGV100::emitIPA()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (insn->getSampleMode()) {
|
||||||
|
case NV50_IR_INTERP_DEFAULT : emitField(76, 2, 0); break;
|
||||||
|
case NV50_IR_INTERP_CENTROID: emitField(76, 2, 1); break;
|
||||||
|
case NV50_IR_INTERP_OFFSET : emitField(76, 2, 2); break;
|
||||||
|
default:
|
||||||
|
assert(!"invalid sample mode");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (insn->getSampleMode() != NV50_IR_INTERP_OFFSET) {
|
if (insn->getSampleMode() != NV50_IR_INTERP_OFFSET) {
|
||||||
switch (insn->getSampleMode()) {
|
|
||||||
case NV50_IR_INTERP_DEFAULT : emitField(76, 2, 0); break;
|
|
||||||
case NV50_IR_INTERP_CENTROID: emitField(76, 2, 1); break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
emitGPR (32);
|
emitGPR (32);
|
||||||
|
addInterp(insn->ipa, 0xff, interpApply);
|
||||||
} else {
|
} else {
|
||||||
emitField(76, 2, 2);
|
|
||||||
emitGPR (32, insn->src(1));
|
emitGPR (32, insn->src(1));
|
||||||
|
addInterp(insn->ipa, insn->getSrc(1)->reg.data.id, interpApply);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(!insn->src(0).isIndirect(0));
|
assert(!insn->src(0).isIndirect(0));
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue