summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nouveau/codegen
diff options
context:
space:
mode:
authorKarol Herbst <kherbst@redhat.com>2020-07-04 22:12:10 +0200
committerMarge Bot <eric+marge@anholt.net>2020-07-07 11:32:14 +0000
commita43eb650de4b7b7f2f1378df1adf167ba9a4a2cc (patch)
treed1ef89348ee859bb17c65649ea10878a929e14d9 /src/gallium/drivers/nouveau/codegen
parent5786c63be305636450d375e9637622780dbfdc4a (diff)
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>
Diffstat (limited to 'src/gallium/drivers/nouveau/codegen')
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gv100.cpp52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gv100.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gv100.cpp
index dcd2fae5367..0b59f64f156 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gv100.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gv100.cpp
@@ -910,6 +910,40 @@ CodeEmitterGV100::emitATOMS()
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
CodeEmitterGV100::emitIPA()
{
@@ -926,17 +960,21 @@ CodeEmitterGV100::emitIPA()
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) {
- 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);
+ addInterp(insn->ipa, 0xff, interpApply);
} else {
- emitField(76, 2, 2);
emitGPR (32, insn->src(1));
+ addInterp(insn->ipa, insn->getSrc(1)->reg.data.id, interpApply);
}
assert(!insn->src(0).isIndirect(0));