Skip to content

fix(agc): key shader modules by pipeline library mode - #6262

Closed
MarcZX10 wants to merge 1 commit into
boykopovar:mainfrom
MarcZX10:codex/amd-gpl-driver-cache-key
Closed

MarcZX10 wants to merge 1 commit into
boykopovar:mainfrom
MarcZX10:codex/amd-gpl-driver-cache-key

Conversation

@MarcZX10

Copy link
Copy Markdown
Contributor

What

Fixes #4768. AMD's Windows Vulkan driver can reuse a cached pipeline compiled with the opposite VK_EXT_graphics_pipeline_library device-feature mode. In that case, shader writes may not land. When the feature is disabled, change bit 15 of the SPIR-V generator word before creating each shader module. Vulkan ignores that word, while the driver's on-disk cache hashes the changed module separately. Apply this to recompiled and embedded modules so all AGC shader paths use distinct cache keys.

Tested

  • Linux GCC 12.2 Release build: agc_shader_memory_tests and agc_driver_alpha_to_coverage_tests compile; agc_shader_memory_tests passes (ANYPS5_NO_SHADER_CACHE=1).
  • python3 tools/check_conventions.py --base upstream/main --head HEAD: passed.
  • git diff upstream/main...HEAD --check: passed.
  • AMD Windows validation is reported in AMD Windows: alpha-to-coverage still fails at the original executable path after #6436 #4768: the fix passes GPL-on/off switching on RX 7800 XT and Radeon 860M, including the four affected AGC fixtures. I did not reproduce that hardware matrix in this Linux environment.

Checklist

@github-actions github-actions Bot added the agc libSceAgc* label Oct 15, 2026
@MarcZX10
MarcZX10 force-pushed the codex/amd-gpl-driver-cache-key branch 2 times, most recently from bbd9cda to da8e370 Compare October 15, 2026 10:14
This was referenced Oct 15, 2026
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 1395 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 2434 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 4040 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 4072 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 4472 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 4847 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 5021 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 5431 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 5441 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 5499 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 5581 core/libs/prx/libSceAgcDriver/Graphics/src/GpuColorTransfer.cpp
PR 5609 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 5925 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6146 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6185 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6186 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6188 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6202 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6249 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6290 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6292 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6481 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 6539 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6553 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 6612 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6615 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6639 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6658 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6682 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6683 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6718 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6741 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6782 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6788 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6801 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6804 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 6820 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6879 core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 6887 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 6905 core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 6946 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6947 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 6948 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6959 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6960 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6965 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 6970 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 6973 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 6977 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 6987 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 6989 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 6995 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 7002 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 7154 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7201 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7275 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7292 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7307 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 7369 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7371 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7426 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7449 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7464 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 7474 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7484 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 7618 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 7642 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 7643 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7647 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 7668 core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 7800 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 7803 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 7869 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7883 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7888 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7893 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7894 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 7920 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7922 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8004 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8014 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8066 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 8083 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 8105 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8115 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 8134 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8145 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 8160 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 8161 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 8180 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8212 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8267 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8278 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8336 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 8380 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8432 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8484 core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
PR 8489 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8538 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 8556 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 8564 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 8578 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8612 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp

AMD's Windows driver compiles pipelines differently when
VK_EXT_graphics_pipeline_library is enabled on the device, but its
on-disk cache (%LOCALAPPDATA%\AMD\VkCache) does not key on it. A process
in one mode is then served pipelines compiled in the other, and their
writes never land (boykopovar#4768, boykopovar#5271).

With the library feature off, every module now flips bit 15 of the SPIR-V
generator word, which no driver interprets, so the two modes hash to
separate cache entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MarcZX10
MarcZX10 force-pushed the codex/amd-gpl-driver-cache-key branch from da8e370 to 1618399 Compare October 16, 2026 20:35
@MarcZX10

Copy link
Copy Markdown
Contributor Author

Rebased onto current main a7f108030 and pushed as 161839944. The original commit author PYTHONRETARDE and Co-Authored-By: Claude Opus 5.5 trailer are preserved. I kept main’s shared createComputePipeline helper and journal recording; the pipeline-library cache discriminator now applies when that helper creates the shader module, including replay, while compute-pipeline captures continue to save the original SPIR-V. git diff --check, conventions, and individual compilation of all six modified C++ sources pass using the current Release build flags. No AMD GPU runtime check was available locally; existing hardware evidence remains tied to the earlier reported heads.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 16, 2026
@oneandonlydean oneandonlydean self-assigned this Oct 17, 2026
@github-actions github-actions Bot added the fix error Closes an issue (Fixes #N) label Oct 17, 2026
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 20, 2026
@oneandonlydean

Copy link
Copy Markdown
Collaborator

Thanks for this. #6436 has now merged (2ea00aa) with the same pipeline-library-mode keying for #4768, so this one is covered and conflicts with main. Closing it; thank you for the work on it.

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

Labels

agc libSceAgc* fix error Closes an issue (Fixes #N) needs rebase Conflicts with main, rebase needed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AMD Windows: alpha-to-coverage still fails at the original executable path after #6436

3 participants