Repository navigation
Linux GCC13.3: agc_driver_graphics reports VOP2 for an all-zero vertex request #6792
Description
Resolved on main66
Main 66e290f1c includes merged #6889. Its one-line fixture-storage correction is byte-identical to the change previously validated in #6789.
Fresh validation on unmodified main66, Ubuntu24.04 WSL2 / GCC13.3 / Release, Ryzen9950X3D:
- The actual
agc_driver_graphics_teststarget and dependencies build. agc_driver_graphicspasses 3/3 fresh processes, maximum3.29s, including the formerly failing vertex case.agc_pipeline_journalpasses1/1 (0.02s).- The two heap-mirror checks report unavailable in each graphics process and remain excluded. No whole-test skips. Project shader cache disabled; CPU/mock tests only, no GPU or title run.
The reported fixture failure is resolved in main. The underlying explanation for the earlier local-array/span discrepancy remains unconfirmed; this does not claim a compiler fix. #5939's earlier combined CI report is updated with this result, while a new combined CI run remains separate validation.
Original reproduction and pre-merge validation at their original source pins
Summary
On unmodified main eb901bcf4e173128191086e7b8cd694aaf7937d4, the CPU-only agc_driver_graphics test fails 3/3 independent processes with ShaderRecompiler::Recompile: VOP2 opcode is not implemented (CTest exit 8, about 0.16 s). Both requested targets build successfully. The separate agc_pipeline_journal control passes 3/3 after merged #6784.
Environment
Ubuntu 24.04 under WSL2, x86-64, GCC 13.3, Release (-O3 -DNDEBUG), bundled dependencies, SPIRV-Tools enabled. Ryzen 9 9950X3D. These are CPU/mock tests; no GPU or title run is involved. Default test settings, project shader cache disabled.
Reproduce
With main above checked out and a Release test build configured per docs/dev/BUILD.md:
cmake --build build --target agc_driver_graphics_tests agc_driver_pipeline_journal_tests
ctest --test-dir build -V -j1 --timeout 30 -R '^agc_driver_graphics$'
ctest --test-dir build -V -j1 --timeout 30 -R '^agc_pipeline_journal$' --repeat until-fail:3Expected: the graphics fixture completes its assertions and returns zero.
Actual: the graphics fixture throws the VOP2 error. Its serialized error request is identical in all three runs. Decoding the documented request header gives vertex stage, address 0x10000, 12 zero DWORDs. The fixture's vertexBdaCode literal contains nonzero instructions; the origin of the zero data is not established. Fixture storage, compiler behavior and request handling remain to investigate.
Precompile observation: literal/span comparison finds the request span already zero before Recompile; its pre-call serialization matches the exception dump. Direct literal reads remain nonzero. Original source restored and failure repeated3/3. The initialization/storage cause remains unconfirmed.
Correction validated: existing #6789 (b88591fd44e70aede651466020ea3c0e70623a6d) passes3/3 on the same Linux/GCC13.3 configuration, against the original main3/3 failures. Cherry-picked integration 65d979b03 passes3/3 each on Windows/GCC15.2 and Linux/GCC13.3. This is CPU-only validation; unavailable Linux heap-mirror cases are excluded. No production code or assertions changed.
CI corroboration: combined Build38901085129, a seven-PR composition on main82ddae75b, builds on both OSes. Linux has one failed test among1302: agc_driver_graphics, with a decoded request byte-identical to the main control here. This is additional CI evidence, not a standalone-main run.
Related evidence
#6784's author independently noted this CPU graphics failure while fixing the journal codec. This issue tracks that remaining failure separately; the current journal test passes. No missing shader capability, GPU fault or title-blocker cause is inferred.
Serialized request from the public CPU fixture
NVNQQR8AAAABAAABAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAAAADAQBAAAAAAQAAAAUAAAAAAAAAAQAAAAsAAADjFAAAYBEAACAAAAACAAAAAAAAAB8AAAAAAAAAU1BWX0tIUl9waHlzaWNhbF9zdG9yYWdlX2J1ZmZlchQAAAAAAAAAU1BWX0tIUl84Yml0X3N0b3JhZ2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAQA0DAAEAAAAAAAAAAAA=
Decoded-byte SHA-256: c4d74f2f790b5413eff31b9637ef2f832580b4ea129e9b37e54c10c063d2c0ba.
AI-assisted investigation: Codex; builds and tests run locally. The underlying compiler/storage explanation remains unconfirmed.
Activity
MarcZX10 commentedon Oct 16, 2026
I checked the current fixture at
Graphics.cpp:5780:vertexBdaCodeis a 12-word constexpr array with nonzero VOP instructions, and theShaderBinaryaggregate assigns that array torequest.shader.code. The request serializer writes the span’s words directly. That makes the all-zero serialized payload a useful clue that the discrepancy occurs at runtime while constructing, retaining or consuming this request; it does not yet identify which step is responsible.Could you compare the 12 words in
vertexBdaCodeandrequest.shader.codeimmediately beforeShaderRecompiler::Recompile, and serialize that same request once before the call? If those are nonzero but the exception dump is zero, we can narrow the issue to mutation/lifetime during the recompile path; if already zero, the fixture/request construction is the target.milescoviello commentedon Oct 16, 2026
#6789 should fix this. The failing request is #5804's vertex terminate case (
vertexBdaCode, code address 0x10000, 12 words), and its code span reads zeros by the time the recompiler sees it. With the arraystatic constexpr,agc_driver_graphicspasses 3 of 3 on Linux (GCC 13.3, Release, RTX 4070 Ti), and it fails 3 of 3 onmaineb901bc withVOP2 opcode is not implemented.AI-assisted: yes
Amoenus commentedon Oct 16, 2026
@MarcZX100 Checked on the same unmodified-main baseline (
eb901bcf4) with temporary observation immediately beforeRecompile:All 12 direct literal reads print the expected nonzero instructions; all 12
request.shader.codereads are already zero. Serializing the request before the call produces a byte-identical payload to the later exception dump. The instrumented run still fails with the same VOP2 error.After removing the temporary observation, I rebuilt, verified the source hash was exactly restored, and reproduced the original failure3/3 again. This places the observed discrepancy before compilation; mutation during the compiler call is not needed to explain this run. Validated the existing #6789 correction (
static constexpr): exact Linux head passes3/3; our integration passes3/3 each on Windows and Linux. This confirms the focused correction for the observed failure; the underlying compiler/storage explanation remains unconfirmed. Independent review. AI-assisted: Codex.