Skip to content

AGC: the pipeline binary store corrupts the heap on Windows with an RTX 5070 Ti since #13931 #14826

Closed

Description

@Superseabas

What happens

Since #13931, four tests fail on Windows with an RTX 5070 Ti: agc_driver_pipeline_journal and the capture step of agc_pipeline_binary_vulkan exit with 0xc0000374 (STATUS_HEAP_CORRUPTION), and agc_driver_lazy_resolved_abi and agc_driver_lazy_resolved_abi_switch_set stop with AGC graphics: lazy resolved ABI: the eager reference process failed.

Title, test or build step

agc_driver_pipeline_journal, agc_pipeline_binary_vulkan, agc_driver_lazy_resolved_abi, agc_driver_lazy_resolved_abi_switch_set

AnyPS5 commit

main f2d874c1fd, nothing merged on top. Bisected over first-parent merges:

Commit Result
d94fad17de (first parent of the #13931 merge) the three older tests pass, 3 of 3 each; agc_pipeline_binary_vulkan does not exist yet
d8b60b46ed (#13931 merge) all four fail
f2d874c1fd all four fail on every run

System

Windows 11 Home 10.0.26200, NVIDIA GeForce RTX 5070 Ti (10de:2c05), driver 621.01, Vulkan 1.4.357. WinLibs GCC 16.2.0 (x86_64-ucrt-posix-seh, r3), Ninja, Release, BUILD_TESTING=ON. The machine also has the integrated Radeon of a Ryzen 7 7700X (1002:164e, AMD 24.30.18).

Host report

AnyPS5 host report (format 1)
commit: f2d874c1fdcc
[system]
os: Windows 10.0.26200
cpu: AMD Ryzen 7 7700X 8-Core Processor
cpu_threads: 16
memory_mib: 31849
cpu_gate: passed
[sdl]
linked: 2.33.0
compiled: 2.33.0
[gpu]
device: NVIDIA GeForce RTX 5070 Ti
type: discrete
vendor_id: 0x10de
device_id: 0x2c05
vulkan_api: 1.4.357
driver: NVIDIA
driver_info: 621.01
driver_version_raw: 0x9b404000
subgroup_size: 32
device_local_mib: 15995
candidates: NVIDIA GeForce RTX 5070 Ti, AMD Radeon(TM) Graphics
present_modes: unknown
present_mode_requested: default
[vulkan]
VK_KHR_8bit_storage: extension required present
VK_KHR_buffer_device_address: extension required present
VK_KHR_shader_float_controls: extension required present
bufferDeviceAddress: feature required present
fragmentStoresAndAtomics: feature required present
samplerAnisotropy: feature required present
shaderInt64: feature required present
shaderSignedZeroInfNanPreserveFloat32: feature required present
storageBuffer8BitAccess: feature required present
textureCompressionBC: feature required present
vertexPipelineStoresAndAtomics: feature required present
VK_EXT_external_memory_host: extension optional present
VK_EXT_fragment_shader_interlock: extension optional present
VK_EXT_hdr_metadata: extension optional present
VK_EXT_memory_budget: extension optional present
VK_EXT_mesh_shader: extension optional present
VK_EXT_present_mode_fifo_latest_ready: extension optional present
VK_EXT_provoking_vertex: extension optional present
VK_EXT_sample_locations: extension optional present
VK_EXT_sampler_filter_minmax: extension optional present
VK_EXT_shader_demote_to_helper_invocation: extension optional present
VK_EXT_shader_image_atomic_int64: extension optional present
VK_KHR_draw_indirect_count: extension optional present
VK_KHR_driver_properties: extension optional present
VK_KHR_fragment_shader_barycentric: extension optional present
VK_KHR_maintenance5: extension optional present
VK_KHR_present_mode_fifo_latest_ready: extension optional present
VK_KHR_shader_atomic_int64: extension optional present
VK_KHR_shader_clock: extension optional present
VK_KHR_shader_terminate_invocation: extension optional present
VK_KHR_spirv_1_4: extension optional present
[shader_cache]
state: present
size_mib: 0
[environment]
ANYPS5_GPU: RTX 5070
ANYPS5_HOST_REPORT: 1
ANYPS5_NO_SHADER_CACHE: 0
ANYPS5_REQUIRE_VULKAN: 1
ANYPS5_SHADER_CACHE_DIR: <path>
APS5_NO_PIPELINE_JOURNAL: 0
APS5_PIPELINE_JOURNAL_MAX_MIB: 1
APS5_PIPELINE_JOURNAL_THREADS: 2
APS5_VERIFY_SET_LAYOUTS: 1

Steps to reproduce

ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 ANYPS5_GPU="RTX 5070" ctest --test-dir build -R "^(agc_driver_pipeline_journal|agc_pipeline_binary_vulkan|agc_driver_lazy_resolved_abi|agc_driver_lazy_resolved_abi_switch_set)$" --output-on-failure

Each test stops within 2 s.

Log

agc_driver_pipeline_journal prints nothing after device creation and the write-watch probe, and no [pipeline-binary] line. Under gdb, in a RelWithDebInfo build of the same commit:

warning: HEAP[agc_driver_pipeline_journal_tests.exe]:
warning: Invalid address specified to RtlSizeHeap( 0000000000100000, 000000FC41F29948 )
#3  (anonymous namespace)::Release (block=0xfc41f29948, bytes=8456599133855809538) at core/libs/prx/libSceAgcDriver/Execution/src/HostAllocator.cpp:181
#23 std::filesystem::__cxx11::path::~path (this=0x105f40)
#24 AgcDriver::Graphics::PipelineBinaryStore::PipelineBinaryStore (this=<optimized out>, context=..., properties=...) at core/libs/prx/libSceAgcDriver/Graphics/src/PipelineBinaryStore.cpp:128

Frames 4 to 16 do not unwind, so the line is approximate: a std::filesystem::path with a garbage capacity is freed while the store is constructed.

What was checked

Run Result
RTX 5070 Ti, as above all four fail on every run
RTX 5070 Ti, APS5_NO_PIPELINE_BINARIES=1 agc_driver_pipeline_journal and both lazy_resolved_abi tests pass; agc_pipeline_binary_vulkan still fails in capture with 0xc0000374
RTX 5070 Ti, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation (SDK 1.4.363.0) all four pass, 3 of 3 each, no VUID-; agc_pipeline_binary_vulkan logs 36 [pipeline-binary] lines
RTX 5070 Ti, VK_LOADER_LAYERS_DISABLE=~implicit~ (no layer inserted) agc_driver_pipeline_journal fails
RTX 5070 Ti, Debug build agc_driver_pipeline_journal passes
Radeon iGPU, ANYPS5_GPU=Radeon all four pass; the store builds, saves and loads binaries
  • vkGetPipelineKeyKHR(device, nullptr, &key) called from a standalone program on a device with VK_KHR_maintenance5 and VK_KHR_pipeline_binary enabled returns VK_SUCCESS with keySize 8 on the RTX 5070 Ti (20 on the Radeon) and writes nothing past the struct.
  • Stopped at PipelineBinaryStore.cpp:127 in the RelWithDebInfo build, globalKey holds keySize 8 after the call and directory is unchanged.
  • The include directories and compile flags of PipelineBinaryStore.cpp, VulkanDevice.cpp and PipelineJournal.cpp are the same (3rdparty/Vulkan-Headers, -O3).

I have not found the write that corrupts the heap. #13931 was tested on an RTX 4080 with driver 610.88, so the driver version or GCC 16.2 may be what separates this machine.

AI-assisted: yes (Claude Code)

Activity

  1. LeandroLP23 commented on Nov 1, 2026

    @LeandroLP23
    Contributor

    I can't reproduce this on two other Windows machines with main e0caf13600, which includes #13931. Setup: ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, the same four tests, 3 runs each.

    GPU Driver Vulkan devices Compiler Result
    NVIDIA GeForce RTX 5060 Ti (Blackwell) 621.01 1 WinLibs GCC 15.2.0 r7 4 of 4 pass, 3 of 3 runs
    AMD Radeon 860M 32.0.13058.8001 1 WinLibs GCC 15.2.0 r7 4 of 4 pass, 3 of 3 runs

    There is no 0xc0000374, no VUID- line, and the layer loaded. agc_driver_pipeline_journal takes about 18 s on the RTX 5060 Ti.

    The RTX 5060 Ti has the same driver as your RTX 5070 Ti, so the two differences left between your machine and these two are:

    • Compiler: WinLibs GCC 16.2.0 r3 for you, 15.2.0 r7 here. Heap corruption that shows up with one toolchain only would point at undefined behaviour or a lifetime bug in the new store that GCC 16 exposes.
    • A second Vulkan device: your RTX 5070 Ti plus the 7700X iGPU. If the pipeline binary store or its cache key ever sees both devices, for example while enumerating them, that could matter even with ANYPS5_GPU selecting one.

    If you can, a build with GCC 15.2.0 r7, or a run with the iGPU disabled in Device Manager, would show which of the two it is.

    AI-assisted: yes (Claude Code)

  2. mashingaan commented on Nov 2, 2026

    @mashingaan
    Contributor

    A potentially relevant upstream change landed after the reported f2d874c1fd: PR #14839 fully reverted #13931, which this report bisected as the first bad change. The revert's Windows hosted CI passed (run), and the current main tree no longer contains PipelineBinaryStore.cpp. This strongly suggests that the reported path has been removed, but it does not verify the RTX 5070 Ti / GCC 16.2 setup. Could you rerun the four listed tests on current main and update this issue with the result? If they pass, this issue can be closed as fixed by the revert.

  3. Superseabas commented on Nov 2, 2026

    @Superseabas
    ContributorAuthor

    Fixed on current main by the revert in #14839: on b28bb77217, agc_driver_pipeline_journal, agc_driver_lazy_resolved_abi and agc_driver_lazy_resolved_abi_switch_set pass 3 of 3 each on the RTX 5070 Ti, with the same setup and WinLibs GCC 16.2.0 r3. agc_pipeline_binary_vulkan no longer exists.

    @LeandroLP23, on the second device: it is not that. The RelWithDebInfo build of f2d874c1fd (with #13931) still exits with 0xc0000374 3 of 3 with VK_LOADER_DRIVERS_DISABLE=*amd*, where the loader reports one physical device, the RTX 5070 Ti. With both devices visible it fails the same way. That leaves the compiler as the difference from your two machines; I have not built #13931 with GCC 15.2.0 r7. If the store comes back, it is worth running these tests with GCC 16.2 before it lands.

    Closing as fixed by #14839.

    AI-assisted: yes (Claude Code)

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