Keep the position descriptor that GXClearVtxDesc leaves set

Nintendo's GXClearVtxDesc, and Aurora's, keep GX_VA_POS at GX_DIRECT. The
HLE mirror cleared it to GX_NONE, so the next draw could publish no
position attribute and abort shader generation while a scene loads.
Keep the mirror in step, and give the shader a zero position if a
stream still arrives without one.

Ported from heurazy/Wiicompiled_VR-PLUS (c2b2500).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Sabhzu6VgoWcHtpSk4C9KZ
This commit is contained in:
Claude committed 2026-10-05 12:27:23 +00:00
1 parent 56b853d5ef
commit 6b0251e6d6
2 files changed
+12

No files matched your search

+6
View File
@@ -41,6 +41,11 @@ static void GX__ClearVtxDesc_8016dc34_gx() {
changed |= g_hleGxState.vtxDesc[i] != GX_NONE;
g_hleGxState.vtxDesc[i]=GX_NONE;
}
// Nintendo's GXClearVtxDesc retains a direct position descriptor. Aurora's
// GXClearVtxDesc does the same; keep the HLE mirror in sync so the next
// draw does not publish GX_VA_POS=GX_NONE and abort shader generation.
changed |= g_hleGxState.vtxDesc[GX_VA_POS] != GX_DIRECT;
g_hleGxState.vtxDesc[GX_VA_POS] = GX_DIRECT;
if (changed) g_hleGxState.InvalidateVtxLayoutHash();
// GXClearVtxDesc resets descriptors only; array base/stride state persists.
GXClearVtxDesc();
@@ -49,6 +54,7 @@ extern "C" void GX__ClearVtxDesc_8016dc34() {
for (int i = 0; i < 26; ++i) {
g_gxGameVertexState.vtxDesc[i] = GX_NONE;
}
g_gxGameVertexState.vtxDesc[GX_VA_POS] = GX_DIRECT;
GxThread::Post(&GX__ClearVtxDesc_8016dc34_gx);
}
PPC_NATIVE_OVERRIDE_VOID(8016dc34, GX__ClearVtxDesc_8016dc34, (), ());