Mesa (main): aco/gfx10: NGG zero output workaround for conservative rasterization.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jun 22 14:52:11 UTC 2021
Module: Mesa
Branch: main
Commit: f9447abb365c0e33a1afeb2ed25a5f10cc4aa968
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f9447abb365c0e33a1afeb2ed25a5f10cc4aa968
Author: Timur Kristóf <timur.kristof at gmail.com>
Date: Mon May 17 12:28:15 2021 +0200
aco/gfx10: NGG zero output workaround for conservative rasterization.
Navi 1x GPUs have an issue: they can hang when the output vertex
and primitive counts are zero. The workaround is exporting a dummy
triangle.
This commit changes the dummy triangle's vertex so its positions
are all NaN. This should make sure the triangle is never rendered.
Cc: mesa-stable
Signed-off-by: Timur Kristóf <timur.kristof at gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10837>
---
src/amd/compiler/aco_instruction_selection.cpp | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp
index 78d2137fff6..34cad69b868 100644
--- a/src/amd/compiler/aco_instruction_selection.cpp
+++ b/src/amd/compiler/aco_instruction_selection.cpp
@@ -11215,7 +11215,9 @@ void ngg_emit_sendmsg_gs_alloc_req(isel_context *ctx, Temp vtx_cnt, Temp prm_cnt
bld.sopp(aco_opcode::s_sendmsg, bld.m0(tmp), -1, sendmsg_gs_alloc_req);
if (prm_cnt_0.id()) {
- /* Navi 1x workaround: export a zero-area triangle when GS has no output. */
+ /* Navi 1x workaround: export a triangle with NaN coordinates when GS has no output.
+ * It can't have all-zero positions because that would render an undesired pixel with conservative rasterization.
+ */
Temp first_lane = bld.sop1(Builder::s_ff1_i32, bld.def(s1), Operand(exec, bld.lm));
Temp cond = bld.sop2(Builder::s_lshl, bld.def(bld.lm), bld.def(s1, scc),
Operand(1u, ctx->program->wave_size == 64), first_lane);
@@ -11226,11 +11228,15 @@ void ngg_emit_sendmsg_gs_alloc_req(isel_context *ctx, Temp vtx_cnt, Temp prm_cnt
bld.reset(ctx->block);
ctx->block->kind |= block_kind_export_end;
+ /* Use zero: means that it's a triangle whose every vertex index is 0. */
Temp zero = bld.copy(bld.def(v1), Operand(0u));
+ /* Use NaN for the coordinates, so that the rasterizer allways culls it. */
+ Temp nan_coord = bld.copy(bld.def(v1), Operand(-1u));
+
bld.exp(aco_opcode::exp, zero, Operand(v1), Operand(v1), Operand(v1),
1 /* enabled mask */, V_008DFC_SQ_EXP_PRIM /* dest */,
false /* compressed */, true /* done */, false /* valid mask */);
- bld.exp(aco_opcode::exp, zero, zero, zero, zero,
+ bld.exp(aco_opcode::exp, nan_coord, nan_coord, nan_coord, nan_coord,
0xf /* enabled mask */, V_008DFC_SQ_EXP_POS /* dest */,
false /* compressed */, true /* done */, true /* valid mask */);
More information about the mesa-commit
mailing list