From: Karol Herbst Date: Sat, 4 Jul 2020 20:12:10 +0000 (+0200) Subject: gv100/ir: implement sample shading X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a43eb650de4b7b7f2f1378df1adf167ba9a4a2cc;p=mesa.git gv100/ir: implement sample shading Fixes sample shading tests in the Khronos OpenGL(ES) CTS Signed-off-by: Karol Herbst Part-of: --- 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));