Skip to content

Linux GCC13.3: agc_driver_graphics reports VOP2 for an all-zero vertex request #6792

Closed

Description

@Amoenus

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_tests target and dependencies build.
  • agc_driver_graphics passes 3/3 fresh processes, maximum3.29s, including the formerly failing vertex case.
  • agc_pipeline_journal passes1/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:3

Expected: 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

  1. MarcZX10 commented on Oct 16, 2026

    @MarcZX10
    Contributor

    I checked the current fixture at Graphics.cpp:5780: vertexBdaCode is a 12-word constexpr array with nonzero VOP instructions, and the ShaderBinary aggregate assigns that array to request.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 vertexBdaCode and request.shader.code immediately before ShaderRecompiler::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.

  2. milescoviello commented on Oct 16, 2026

    @milescoviello
    Contributor

    #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 array static constexpr, agc_driver_graphics passes 3 of 3 on Linux (GCC 13.3, Release, RTX 4070 Ti), and it fails 3 of 3 on main eb901bc with VOP2 opcode is not implemented.

    AI-assisted: yes

  3. Amoenus commented on Oct 16, 2026

    @Amoenus
    ContributorAuthor

    @MarcZX100 Checked on the same unmodified-main baseline (eb901bcf4) with temporary observation immediately before Recompile:

    word[0]  literal=7e040f00 span=00000000
    word[1]  literal=7e060280 span=00000000
    ...
    word[11] literal=bf810000 span=00000000
    

    All 12 direct literal reads print the expected nonzero instructions; all 12 request.shader.code reads 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions