Skip to content

fix(shader): declare f16 and f64 DenormPreserve together when their modes are shared - #11483

Open
tibzejoker wants to merge 2 commits into
boykopovar:mainfrom
tibzejoker:perf/coupled-f16-f64-denorms
Open

tibzejoker wants to merge 2 commits into
boykopovar:mainfrom
tibzejoker:perf/coupled-f16-f64-denorms

Conversation

@tibzejoker

@tibzejoker tibzejoker commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

What

Part of #11183. On a device whose f16 and f64 denormal modes are tied together, both are now preserved, and every module that declares DenormPreserve for one of the two widths declares it for the other.

Vulkan's denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY means an entry point must use the same denormal execution mode for 16-bit and 64-bit floats (VkShaderFloatControlsIndependence). #2977 enabled DenormPreserve 64 only with independence ALL and noted that "the backend does not yet emit coupled execution modes for 32_BIT_ONLY or NONE". float16DenormPreserve has the same ALL condition. RADV reports 32_BIT_ONLY, so on RADV today:

  • f64 denormals are left to the driver (no DenormPreserve 64), and agc_driver_f64_fma_subnormals checks the result only where the driver keeps them;
  • v_cvt_f32_f16 and the other f16 -> f32 reads use the decoded integer emulation instead of UnpackHalf2x16, because that path needs float16DenormPreserve;
  • the native f32 -> f16 conversions still declare DenormPreserve 16 by themselves (their condition, Float16 with RoundingModeRTE and DenormPreserve 16 supported, does not look at the independence), so a module with both those conversions and f64 code declares a 16-bit mode with no 64-bit one. None of the 78 GTA V compute modules below has both.

RDNA has a single f16/f64 denormal field in FLOAT_MODE (bits 7:6), so preserving both together is also the console's shape.

Change:

  • VulkanDevice: with Float64 enabled, 32_BIT_ONLY, shaderDenormPreserveFloat16 and shaderDenormPreserveFloat64, the device sets SpirvTarget::coupledF16F64Denorms, float16DenormPreserve and float64DenormPreserve, and logs [float-controls] f16 and f64 denormals share one mode on this device: DenormPreserve 16 and 64 are declared together. With independence ALL or NONE, or a missing preserve property, nothing changes.
  • Backend: EmitF16DenormPreserve and the new EmitF64DenormPreserve each declare the other when the flag is set. They are the only places that emit the 16-bit and 64-bit DenormPreserve modes (git grep ExecutionModeDenorm), so every module declares both or neither.
  • The flag is in the recompile cache key and in recompile requests (serializer format 50, after main's depth export clamp bounds of format 49; older requests read it as false). agc_shader_replay --unpreserved-f16-f64-denorms / --coupled-f16-f64-denorms replay a saved request in the two shapes, so the size numbers below can be reproduced from requests saved on any GPU.

Landing order with #11351 (agreed on #11351): both append to the request format. main has since taken formats 51, 52 and 53 and rejects 50, so #11351 now lands with 54; this PR then rebases and takes 55, keeping both flags.

Tested

Windows 11 Pro, MinGW-w64 GCC 15.2.0 (WinLibs r7), Ninja, Release, BUILD_TESTING=ON, ANYPS5_ENABLE_SPIRV_TOOLS=ON (spirv-val on every module), on main 48c160c58b.

  • SPIR-V checks (no device needed):

    • agc_driver_f64_denorm_preserve_spirv: an f64 shader declares DenormPreserve 64 and not 16 with independent modes, and both with coupledF16F64Denorms;
    • agc_float16_conversion: a native f16 conversion declares DenormPreserve 16 and not 64 with independent modes, and both when coupled.

    With the two coupling lines removed from SpirvModuleEmitter.cpp, both tests fail; with them, both pass.

  • Serializer: request_serializer round-trips the flag both ways, reads a format 49 request as false and rejects a truncated one; agc_shader_memory pins format 50.

  • Focused tests, main 48c160c58b vs this PR (406bf3fdc2), ctest -R "(^agc.*(f16|float16|f64|convert|pack|interpolation|denorm)|request_serializer|shader_memory|agc_float16_conversion)" -E "^agc_driver_bda_device$" -V, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation with VK_LOADER_DEBUG=layer (75 Insert instance layer "VK_LAYER_KHRONOS_validation" lines per run, no was not found but was requested by env var VK_INSTANCE_LAYERS), ANYPS5_NO_SHADER_CACHE=1, ANYPS5_REQUIRE_VULKAN=1:

    GPU main this PR VUID- lines
    RTX 4090 (NVIDIA 616.92) 85/85 85/85 0 / 0
    UHD 770 (Intel 101.6129) 83/85, 2 failed 83/85, 2 failed 0 / 0

    Neither device reports 32_BIT_ONLY, so neither takes the new path: this run is the no-change control. On Intel the f64 tests skip (no Float64), and the 2 failures are agc_driver_packed_unorm4444_partial_write and agc_driver_packed_unorm4444_multisample_partial_write, on both trees.

  • RADV, Radeon 860M (Mesa 26.2.5, Fedora 44, GCC 13.3), by @Lander0606, on the same change behind a switch (test/coupled-f16-f64-denorms fe10c0205c, on top of perf(shader): keep native f16 conversion NaN results when a startup probe matches RDNA #11351), validation layer 1.4.341, ctest -j1 -V -R "^agc.*(f16|float16|f64|convert|pack|interpolation)" -E "^agc_driver_bda_device$":

    without the coupling with the coupling
    focused set, with the layer (3 runs) 76/76 76/76
    full ^agc (-j8) 1031 of 1032 1031 of 1032

    Every device creation logs the share one mode line. The 13 f64 tests of the set pass with DenormPreserve 64 on (f64_fma_subnormals, f64_rounding_denormal_modes, div_fixup_f64_denormal_modes, ...), and so do interpolation_modes and pixel_exec_interpolation. The only full-suite failure is agc_driver_tessellation (the Mesa 26.2.5 crash), on both. No VUID- line, but @Lander0606 also checked that the layer does not flag an uncoupled declaration (VUID-RuntimeSpirv-denormBehaviorIndependence-06289 stayed silent with the f64 half removed), which is why the two SPIR-V checks above test the coupling directly. On lavapipe (denormBehaviorIndependence not 32_BIT_ONLY) the flag stays off. A rerun on this branch is offered.

  • Size, Grand Theft Auto V compute shaders (the requests of perf(shader): compute v_pk_fma_f16 and v_pk_fmac_f16 with OpFmaKHR #11265 saved on the RTX 4090, replayed with agc_shader_replay --spv; 78 of them recompile on current main):

    shape words change
    --unpreserved-f16-f64-denorms (a 32_BIT_ONLY device on main) 1,348,484
    --coupled-f16-f64-denorms (the same device with this PR) 1,333,848 -1.1 %
    as saved on the RTX 4090 (ALL, unchanged by this PR) 1,336,356

    0x25b393000 (RCAS) 102,227 -> 90,517 (-11.5 %), 0x25b433400 112,824 -> 110,242 (-2.3 %), 0x25b3c4e00 -0.6 %, 0x25b3c3a00 -1.0 %; modules that change nothing else gain the 4 words of the second mode. Both coupled modules checked with spirv-val --target-env vulkan1.3 (0x25b393000: 16 and 64; 0x25b433400, which has Float64: 64 and 16).

What is and is not measured. The path is taken only on 32_BIT_ONLY devices (RADV here). Measured: module shape, size and test correctness on RADV. Not measured: frame time or pipeline creation on such a device (no title runs on the 860M). Not tested: AMD's Windows driver, MoltenVK.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: perf(shader): keep native f16 conversion NaN results when a startup probe matches RDNA #11351 lands first (request format order; this PR then moves to format 55)
  • Fixes: none
  • Unblocks: none
  • GPUs tested: NVIDIA GeForce RTX 4090 (616.92, Windows 11), Intel UHD Graphics 770 (101.6129, Windows 11); AMD Radeon 860M (RADV, Mesa 26.2.5, Fedora 44) by @Lander0606 on the switched version
  • AI-assisted: yes (Claude Code)

🤖 Generated with Claude Code

https://claude.ai/code/session_01PHJtpJ4hw3KWJhobipK8ia

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked the float-control gating and paired emission, the recompile cache key, and the serializer’s format-gated backward compatibility. The submitted Windows and RADV results are detailed, and the automated policy checks pass. The branch is 87 commits behind current (merge base ); CONTRIBUTING requires keeping branches current. Please rebase onto current , resolve the serializer-version interaction with open #11351 if needed, and rerun the focused tests on the rebased head. I’ll review the new head.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked the float-control gating and paired DenormPreserve emission, the recompile cache key, and the serializer’s format-gated backward compatibility. The submitted Windows and RADV results are detailed, and the automated policy checks pass. The branch is 87 commits behind current upstream/main (merge base e476a8a); CONTRIBUTING requires keeping branches current. Please rebase onto current main, resolve the serializer-version interaction with open #11351 if needed, and rerun the focused tests on the rebased head. I’ll review the new head.

@tibzejoker
tibzejoker force-pushed the perf/coupled-f16-f64-denorms branch from 95a385d to 406bf3f Compare October 26, 2026 17:09
@tibzejoker

Copy link
Copy Markdown
Contributor Author

@MarcZX10 rebased: head 406bf3fdc2 on current main 48c160c58b, no conflict.

  • Serializer: main is still at format 46, so this PR stays at 47. perf(shader): keep native f16 conversion NaN results when a startup probe matches RDNA #11351 also uses 47. Whichever of the two merges second moves to 48 on its rebase, with the same test pins. Neither depends on the other.
  • Rerun on this exact head with the validation layer, main 48c160c58b vs the PR: RTX 4090 85/85 vs 85/85; UHD 770 83/85 vs 83/85, the same 2 unorm4444 failures on both; 0 VUID- lines. request_serializer, agc_shader_memory, agc_float16_conversion and agc_driver_f64_denorm_preserve_spirv pass.
  • Sizes recounted on this head: RADV shape 1,348,484 -> 1,333,848 words (-1.1 %), RCAS -11.5 %. The body is updated.

@github-actions

github-actions Bot commented Oct 26, 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 4448 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 4472 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 4847 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 5021 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
docs/dev/debt/shader.md
PR 5371 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 5609 core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
PR 5925 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/shader/recompiler/Recompiler.hpp
PR 6146 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6188 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/shader/recompiler/Recompiler.hpp
PR 6235 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/shader.md
PR 6280 docs/dev/debt/shader.md
PR 6290 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
PR 6412 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/shader.md
PR 6416 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
PR 6488 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
docs/dev/debt/shader.md
PR 6751 core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
PR 6782 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6804 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6858 core/shader/recompiler/Recompiler.cpp
PR 6924 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 6970 core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
PR 7002 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7085 docs/dev/debt/shader.md
PR 7275 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7369 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7392 core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
docs/dev/debt/shader.md
PR 7395 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 7410 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/shader.md
PR 7449 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7464 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7522 core/shader/recompiler/Recompiler.cpp
PR 7622 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7642 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 7643 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7684 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 7689 core/shader/recompiler/Recompiler.hpp
PR 8004 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/shader.md
PR 8212 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8939 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 9020 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/shader.md
PR 9289 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 9335 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/shader.md
PR 9356 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 9387 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/shader.md
PR 9457 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 9508 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 9633 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 9748 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/shader.md
PR 9749 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 9790 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
docs/dev/debt/shader.md
PR 9852 core/shader/recompiler/Recompiler.hpp
PR 9875 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 9889 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 9897 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
PR 9969 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
docs/dev/debt/shader.md
PR 10043 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 10049 core/shader/recompiler/Recompiler.hpp
PR 10193 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 10233 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 10351 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
PR 10359 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 10442 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 10489 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 10652 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
docs/dev/debt/shader.md
PR 10678 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 10757 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
PR 10867 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
docs/dev/debt/shader.md
PR 11435 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 11436 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 11551 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 12316 docs/dev/debt/shader.md
PR 12324 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
PR 12458 docs/dev/debt/shader.md
PR 12790 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 12828 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
PR 12840 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
PR 12855 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 12904 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 12944 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
docs/dev/debt/shader.md
PR 13148 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 13486 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
docs/dev/debt/shader.md
PR 13847 docs/dev/debt/shader.md
PR 13863 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 13920 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 13928 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 13929 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 14032 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
PR 14068 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 14072 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 14076 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 14212 docs/dev/debt/shader.md
PR 14217 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
docs/dev/debt/shader.md
PR 14218 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
docs/dev/debt/shader.md
PR 14260 core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
PR 14341 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
PR 14344 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 14367 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
PR 14377 docs/dev/debt/shader.md
PR 14561 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 14628 docs/dev/debt/shader.md
PR 14633 docs/dev/debt/shader.md
PR 14636 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 14692 docs/dev/debt/shader.md
PR 14709 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 14793 docs/dev/debt/shader.md
PR 14795 docs/dev/debt/shader.md
PR 14821 docs/dev/debt/shader.md
PR 14830 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
PR 14853 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 14871 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/shader.md
PR 14900 docs/dev/debt/shader.md
PR 14904 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 14913 docs/dev/debt/shader.md
PR 14944 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
PR 15015 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 15136 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 15169 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 15243 docs/dev/debt/shader.md
PR 15253 docs/dev/debt/shader.md
PR 15256 docs/dev/debt/shader.md
PR 15305 docs/dev/debt/shader.md
PR 15334 core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
docs/dev/debt/shader.md
PR 15338 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 15343 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 15416 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
PR 15450 docs/dev/debt/shader.md
PR 15458 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/shader.md
PR 15462 docs/dev/debt/shader.md
PR 15488 docs/dev/debt/shader.md
PR 15497 docs/dev/debt/shader.md
PR 15512 docs/dev/debt/shader.md
PR 15520 docs/dev/debt/shader.md
PR 15548 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 15555 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
docs/dev/debt/shader.md
PR 15573 docs/dev/debt/shader.md
PR 15576 docs/dev/debt/shader.md
PR 15608 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
PR 15611 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 15648 docs/dev/debt/shader.md
PR 15668 docs/dev/debt/shader.md
PR 15680 docs/dev/debt/shader.md
PR 15681 docs/dev/debt/shader.md
PR 15693 core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
PR 15719 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/shader.md
PR 15769 docs/dev/debt/shader.md
PR 15786 docs/dev/debt/shader.md
PR 15787 docs/dev/debt/shader.md
PR 15859 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 15878 docs/dev/debt/shader.md
PR 15880 docs/dev/debt/shader.md
PR 15886 docs/dev/debt/shader.md
PR 15893 docs/dev/debt/shader.md
PR 15894 core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
docs/dev/debt/shader.md
PR 15917 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
docs/dev/debt/shader.md
PR 15948 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/shader.md
PR 16013 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 16019 docs/dev/debt/shader.md
PR 16026 docs/dev/debt/shader.md
PR 16234 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
PR 16252 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 16260 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
PR 16274 docs/dev/debt/shader.md
PR 16321 docs/dev/debt/shader.md
PR 16361 docs/dev/debt/shader.md
PR 16391 core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/shader.md
PR 16413 core/shader/recompiler/Recompiler.cpp
PR 16415 docs/dev/debt/shader.md
PR 16423 docs/dev/debt/shader.md
PR 16440 docs/dev/debt/shader.md
PR 16472 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 16474 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp

@tibzejoker

Copy link
Copy Markdown
Contributor Author

On the overlap table: these PRs all bump the request serializer format, so they edit the same version pins in RequestSerializerTests.cpp and ShaderMemory.cpp. Any of them merging first only means this PR moves to the next format on rebase. None is a functional dependency (Depends on: none), and no other PR touches the denormal mode emission or coupledF16F64Denorms.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correction to my earlier review: its formatting omitted the branch refs. I fetched the current PR head 406bf3fdc2d5 and verified it is 2 commits ahead and 0 behind current upstream/main (48c160c58b58); the merge is clean. The stale-base concern is resolved.

Thanks for clarifying the serializer overlap with #11351. I agree those are independent changes that only need sequential serializer version numbers, so Depends on: none is appropriate.

I reviewed the coupled-mode device gating, cache-key and request serialization propagation, and paired SPIR-V execution-mode emission. The Vulkan rule for 32_BIT_ONLY requires identical denormal modes for 16-bit and 64-bit types; this change emits both when the device supports both and the shader uses either. The current policy checks pass. The PR reports focused NVIDIA results and a separate RADV run; I did not rerun the GPU tests locally.

@tibzejoker

Copy link
Copy Markdown
Contributor Author

Thanks @MarcZX10 for the review and for checking the branch freshness.

@THEMANnt THEMANnt left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 406bf3fdc2d5 against 48c160c58b58. No actionable findings.
The device gate requires Float64, Vulkan 32_BIT_ONLY, and preserve support for both widths. Either backend path that emits DenormPreserve also emits the paired 16/64 mode. The coupled flag is carried through the cache key and request format 47; older format 46 requests default it to false.
Validation: GCC 15.3.0, CMake 4.3.3 and Ninja 1.13.2 built libSceAgcDriver, shader_recompiler_agc_driver, the serializer/f16/f64 tests and agc_shader_replay. Focused CTest passed 4/4; replay fixture tests passed 2/2. Both replay mode switches materialized the fixture. A review-only cache-key assertion passed; removing the cache-key append made it fail as expected. On the exact-head Actions run, eligibility passed while Windows, Linux, relinker, ASan, register-context and write-watch jobs were skipped.
The local build used a cached base integration (035ac96) with the PR source overlay, not a full checkout of the pinned base/head pair. No local 32_BIT_ONLY GPU was exercised; the PR's RADV results remain author-reported.

@tibzejoker

Copy link
Copy Markdown
Contributor Author

More RADV coverage for the coupling, from @tablefrogpillow on #11351 (comment), on the switched version of this change, Mesa 25.2.8, validation layer on:

  • gfx1036 (RDNA2) and gfx1100 (RDNA3): both log the share one mode line. The f16 -> f32 NaN probe goes native with 0 of 262144 differences. The focused f16/f64/convert/pack/interpolation set passes 76/76 on each, with and without the coupling.
  • The only layer message is a VUID-VkDeviceCreateInfo-pNext-pNext from an older layer, with the same count with and without the coupling.
  • On Shader float mode (IEEE_MODE, DX10_CLAMP, FLOAT_MODE) is per shader; the recompiler assumes one #981 they measured that on gfx1036 and gfx1100 the f64 denormal flush follows the same FLOAT_MODE field as f16. That is the hardware basis for declaring the two modes together.

@github-actions github-actions Bot added shader core/shader docs agc libSceAgc* labels Oct 26, 2026
@oneandonlydean oneandonlydean self-assigned this Oct 26, 2026
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 27, 2026
@Lander0606

Copy link
Copy Markdown
Contributor

@tibzejoker, the 860M run of this PR itself, without any variable: head 406bf3fdc2 against its base main 48c160c58b, without merging onto current main. The setup is the same as on #11351: Radeon 860M (RADV KRACKAN1), Mesa 26.2.5, Fedora 44, built in an Ubuntu 24.04 container with GCC 13.3 (Release, BUILD_TESTING=ON, ANYPS5_ENABLE_SPIRV_TOOLS=ON), ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1, validation layer 1.4.341 with VK_LOADER_DEBUG=layer.

On RADV the coupling turns on by itself. Every device creation in the focused set logs this line, 74 per run; on main it never appears:

[float-controls] f16 and f64 denormals share one mode on this device: DenormPreserve 16 and 64 are declared together

The focused set is the one in the description: ctest -j1 -V -R "(^agc.*(f16|float16|f64|convert|pack|interpolation|denorm)|request_serializer|shader_memory|agc_float16_conversion)" -E "^agc_driver_bda_device$". It has 86 tests on this build.

main 48c160c58b this PR 406bf3fdc2
RADV, with the layer 86/86, 86/86, 86/86 86/86, 86/86, 86/86
RADV, without the layer 86/86 86/86
lavapipe, with the layer 86 pass, 3 of them skipped 86 pass, 3 of them skipped
RADV, full ^agc (-j8, without the layer) 1039 of 1040 1039 of 1040
  • What changes on RADV: of the tests' result lines (... tests passed ...), one differs between the two trees. On main, agc_driver_f16_to_f32_unpack logs f16 to f32 unpack tests passed (65536 halves, integer decode only). With this PR it logs (65536 halves, both decodes). So UnpackHalf2x16 now runs on RADV and matches the integer decode for every half.
  • f64: the 13 f64 tests of the set pass with DenormPreserve 64 declared, and their output is the same as on main (v_fma_f64 subnormal tests passed, for example).
  • SPIR-V and serializer checks: agc_float16_conversion, agc_driver_f64_denorm_preserve_spirv, request_serializer and agc_shader_memory pass.
  • Validation: the layer was inserted 75 times per run on both trees. No log contains the not-found line, and no run logs a VUID- line. As before, the layer does not flag an uncoupled declaration, so the SPIR-V checks above are what show the coupling.
  • lavapipe: no share one mode line. The 3 skips are agc_driver_f64_fma_subnormals, agc_driver_float16_native and agc_driver_packed_float16_native, on both trees.
  • Full ^agc run: on both trees, the only failure is agc_driver_tessellation, the Mesa 26.2.5 crash, with the same 15 skips.

The branch now conflicts with main in RequestSerializerTests.cpp. If the rebase only moves the serializer format, I can rerun the same set on the new head.

Logs of every run above, with an index in README.txt:
anyps5-pr11483-406bf3fdc2-radv-860m-logs.zip

AI assisted: yes

@ycbuzi

ycbuzi commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

A run on the case Tested lists as not covered: AMD's Windows driver. Windows 11 Home 10.0.26200, WinLibs GCC 15.2.0 r7 (MinGW-w64 UCRT), Release, BUILD_TESTING=ON. GPU: AMD Radeon(TM) Graphics (1002:164e, the Ryzen 9 7900's RDNA2 iGPU), driver 25.10.30.02 (AMD proprietary shader compiler), Vulkan 1.4.315.

vulkaninfo on this device reports denormBehaviorIndependence = SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY with shaderDenormPreserveFloat16, shaderDenormPreserveFloat64 and shaderFloat64 all true, so it takes the new path. The RTX 4070 SUPER and GTX 1650 SUPER here (NVIDIA 616.92) report INDEPENDENCE_ALL and don't.

This head now conflicts with main, so both sides are this PR's own base and head: main 48c160c58b and 406bf3fdc2. Your focused set (ctest -R "(^agc.*(f16|float16|f64|convert|pack|interpolation|denorm)|request_serializer|shader_memory|agc_float16_conversion)" -V -j1, 85 tests from 80 executables) ran with VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation (layer 1.4.363), ANYPS5_NO_SHADER_CACHE=1, ANYPS5_REQUIRE_VULKAN=1 and ANYPS5_GPU=Radeon, in a non-elevated process.

main 48c160c58b this PR 406bf3fdc2
focused set 85/85 85/85
VUID- lines 0 0
[float-controls] ... share one mode lines 0 74 (every device creation, out of 74 Selected GPU lines)
missing-layer lines 0 0

The layer was active on both sides: each log has 19 Validation messages (none of them VUID-), and a best-practices check of agc_driver_f64_fma_subnormals on the RTX 4070 SUPER, in the same process before each side, wrote a 28-line layer log.

Not run: the full ^agc suite on this device, a title, frame time.

AI-assisted: yes (Claude Code)

@tibzejoker
tibzejoker force-pushed the perf/coupled-f16-f64-denorms branch from 406bf3f to 5a8a216 Compare October 27, 2026 19:41
@tibzejoker

Copy link
Copy Markdown
Contributor Author

Rebased on main d13b3d7 (head 5a8a216c9b, conflicts were the serializer and the debt list). main took serializer format 48 for fragmentBarycentricBuiltins (a95ced5), so the flag is now the byte after it, format 49; a format 48 request reads it as false. #11351 is rebased the same way, so whichever of the two merges second moves to 50.

Focused set from the description with VK_LAYER_KHRONOS_validation + ANYPS5_NO_SHADER_CACHE=1 + ANYPS5_REQUIRE_VULKAN=1: RTX 4090 85/85, UHD 770 83/85 (the two unorm4444 partial-write failures that main has too), 0 VUID- on both.

@Lander0606 @ycbuzi thanks for the RADV 860M and AMD Windows runs.

AI-assisted: yes (Claude Code)

@ycbuzi

ycbuzi commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Same AMD Windows comparison on the rebased head 5a8a216c9b, against its base, current main d13b3d7c55. Same setup as above: Radeon iGPU, AMD 25.10.30.02 (32_BIT_ONLY with DenormPreserve 16 and 64), your focused set, Khronos layer in a non-elevated process.

main d13b3d7c55 this PR 5a8a216c9b
focused set 85/85 85/85
VUID- lines 0 0
share one mode lines 0 74
missing-layer lines 0 0

The layer check before each side wrote a 28-line log, as before. The serializer format change to 49 doesn't change anything here.

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 27, 2026
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 28, 2026
@oneandonlydean

Copy link
Copy Markdown
Collaborator

@tibzejoker this no longer merges into main: tests/ShaderMemory.cpp and recompiler/tests/RequestSerializerTests.cpp conflict. Main has also taken request serialization version 49 for its own new field, while this PR writes coupledF16F64Denorms under version >= 49. RequestSerializer.cpp merges without a textual conflict, so a merged build would read version-49 requests written by main as if they carried your trailing flag. Could you rebase onto current main and move the new flag to version 50, then renumber the serializer tests to match?

Note: #10547, #11483 and #10846 all need the next request-serializer version, so whichever lands first takes 50 and each later one takes the next number after it.

@tibzejoker

Copy link
Copy Markdown
Contributor Author

Rebased on main 319621ba2e (head b81b8a12ff). main took serializer format 49 for the depth export clamp bounds (#10348), so the flag is now format 50; a format 49 request reads it as false. The test fixtures that build legacy depth export and dithered requests drop the trailing byte before relabelling them. agc_shader_replay also conflicted with main's new --lds-lock-fences: both flags are kept. #11351 is at format 50 too, so whichever merges second moves to 51.

Focused set from the description, with VK_LAYER_KHRONOS_validation + ANYPS5_NO_SHADER_CACHE=1 + ANYPS5_REQUIRE_VULKAN=1. main 319621ba2e was run in the same session for #11351:

main 319621ba2e this PR b81b8a12ff
RTX 4090 (NVIDIA 616.92) 88/88 88/88
UHD 770 87/88 87/88
VUID- lines 0 / 0 0 / 0

The UHD 770 failure is agc_driver_packed_unorm4444_multisample_partial_write on both sides. Neither device here reports 32_BIT_ONLY, so neither takes the new path. ycbuzi's Radeon runs above cover it.

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Oct 28, 2026

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-checked — changes requested

What I checked

  • Reviewed exact head b81b8a12ff1e0b0ccaae3c7e11baebaac54b5e18 against fetched main 2960e9a6e7.
  • The author reports exact-head SPIR-V, serializer, and paired GPU tests on the earlier pinned baseline, including RADV validation-layer results. Hosted Windows, relinker, conventions, and eligibility checks pass; product Linux and specialized jobs were skipped. I did not run GPU tests locally.
  • The current-main merge preview conflicts in ShaderReplay.cpp. The pairwise preview with open #11351 conflicts in ShaderMemory.cpp, ShaderReplay.cpp, RequestSerializer.cpp, and RequestSerializerTests.cpp.

Blocking integration items

The branch's latest tested main is 319621ba2e, 232 commits behind fetched current main. Please refresh it onto current main, resolve the reported conflicts, and rerun the focused shader/SPIR-V and serializer tests on that integration head. The PR and #11351 both use the request-format version slot; agree which one lands first and record the corresponding Depends on order/version update in both PRs as required by CONTRIBUTING.md.

The older test results are useful evidence, but they do not validate the current conflicting integration. I cannot renew the earlier approval on this head until the rebase, order, and focused rerun are complete.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@tibzejoker The version-50 update addresses the earlier collision with main's version-49 depth-export layout. Please also rebase current main: the trial merge conflicts in core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp around the per-request target overrides. Preserve main's replay/refactoring behavior and apply the two coupled-denormal switches in the appropriate request path. Keep version-49 depth bounds and legacy decoding intact, and rerun request_serializer, agc_shader_memory and both focused f16/f64 SPIR-V coupling checks on the refreshed head.

@tibzejoker
tibzejoker force-pushed the perf/coupled-f16-f64-denorms branch from b81b8a1 to df510d2 Compare October 29, 2026 10:51
@tibzejoker

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Rebased on current main 1db077e876. The new head is df510d2219, and the first commit is unchanged (git range-diff =).

ShaderReplay.cpp: main (51b4591) now applies the per-request target overrides right after Deserialize, so they reach every replay mode. The coupled-denormal switch sits there too, just after --lds-lock-fences, and the old block inside the recompile try is gone. --unpreserved-f16-f64-denorms and --coupled-f16-f64-denorms therefore now apply in --prepare and --materialize as well. The usage string keeps main's options and adds ours.

Serializer: unchanged. Version 49 depth bounds, legacy decoding and the format-50 tail are as before; main is still at 49.

Tests on df510d2219. Settings: the focused set ((^agc.*(f16|float16|f64|convert|pack|interpolation|denorm)|request_serializer|shader_memory|agc_float16_conversion)), VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation (insertion checked with VK_LOADER_DEBUG=layer: 78 per run), ANYPS5_NO_SHADER_CACHE=1, ANYPS5_REQUIRE_VULKAN=1.

GPU result VUID- lines
RTX 4090 (NVIDIA 616.92) 89/89 0
UHD 770 (Intel) 88/89 0
  • UHD 770 failure: agc_driver_packed_unorm4444_multisample_partial_write. It fails the same way on main. The f64 tests skip on that device (no Float64).
  • Serializer tests: request_serializer and agc_shader_memory pass on both GPUs.
  • The two coupling checks pass on both GPUs:
    • agc_driver_f64_denorm_preserve_spirv: DenormPreserve 64 alone with independent modes, 16 and 64 together when coupled;
    • agc_float16_conversion: DenormPreserve 16 alone with independent modes, both when coupled.

Landing order. On #11351, adriadam10 proposes that #11351 lands first with format 50 and this PR then takes 51. I agree. I'll renumber this PR to 51 (serializer, the two test files, the version-52 rejection) as soon as #11351 is in main, and rerun the same set then.

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 29, 2026

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-checked — changes requested

The update resolves the earlier serializer/replay concerns and provides current-head Vulkan validation runs on an RTX 4090 and UHD 770, with the layer confirmed loaded and no new VUID- lines. Current main is now ba5b5330b3; the PR head df510d2219 does not include it, and the intervening change touches the shader debt file this PR edits. Please integrate current main and rerun conventions on the resulting tree. Since the report says the intervening change is documentation-only and the tested source is unchanged, the existing GPU results can stand if the refreshed diff confirms that. Keep the declared stack ordering intact.

tibzejoker and others added 2 commits October 29, 2026 20:43
…odes are shared

A device that reports VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY must use
the same denormal execution mode for 16-bit and 64-bit floats in an entry
point. The backend only preserved f16 and f64 denormals with independence ALL,
so on such a device (RADV) f64 denormals were left to the driver and f16 to f32
conversions were emulated, while the native f16 conversions still declared
DenormPreserve 16 alone.

When the device also has shaderDenormPreserveFloat16, shaderDenormPreserveFloat64
and Float64, both are now preserved and every module that declares one of the
two modes declares the other. RDNA keeps one denormal field for f16 and f64 in
FLOAT_MODE too. The flag is in the target, the cache key and recompile requests
(serializer format 50).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PHJtpJ4hw3KWJhobipK8ia
agc_shader_replay --unpreserved-f16-f64-denorms clears float16DenormPreserve
and float64DenormPreserve, as on a 32_BIT_ONLY device before the coupling;
--coupled-f16-f64-denorms sets both with coupledF16F64Denorms, as on such a
device now. Requests saved on another GPU can then show both module shapes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PHJtpJ4hw3KWJhobipK8ia
@tibzejoker
tibzejoker force-pushed the perf/coupled-f16-f64-denorms branch from df510d2 to 80cb2cd Compare October 29, 2026 19:49
@tibzejoker

Copy link
Copy Markdown
Contributor Author

@MarcZX10 Rebased on current main 184afa49ad (includes ba5b5330b3). The new head is 80cb2cd3ac.

Refreshed diff:

I reran the focused set on 80cb2cd3ac anyway, with the same settings as before (validation layer inserted 78 times per run, ANYPS5_NO_SHADER_CACHE=1, ANYPS5_REQUIRE_VULKAN=1):

GPU result VUID- lines
RTX 4090 (NVIDIA 616.92) 89/89 0
UHD 770 (Intel) 88/89 0

The UHD 770 failure is the same as on main: agc_driver_packed_unorm4444_multisample_partial_write. The f64 tests skip on that device.

AI-assisted: yes (Claude Code)

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-checked — new head, looks good

The rebased head resolves the current-main integration finding, preserves the serializer/replay changes, and has refreshed author-reported GPU results with no new validation IDs.

What I ran

  • Exact PR head: 80cb2cd3acfdcde0abd374bc3f8886b5bd23e092.
  • Current base: main 420b6a064eadaa7c5e50b080c7fad59c41150b4b; merge preview is clean (97f6e7e7826a2d278e1bad3d108f26170528ca44).
  • The prior reported test base 184afa49adce16e298c47d136706fd2356198852 differs from current main only in five unrelated relinker/usage paths; none of the PR's 17 changed paths changed in between.
  • Environment: Linux 6.1.0-54-amd64 x86_64, Git 2.39.5, Python 3.11.2. I did not run a local C++ build or GPU tests; available disk space is insufficient for a build.
  • Commands:
git merge-tree --write-tree upstream/main refs/remotes/review/pr-11483
git diff --check upstream/main...refs/remotes/review/pr-11483
python3 tools/check_conventions.py --base upstream/main --head refs/remotes/review/pr-11483
git diff --name-status 184afa49adce16e298c47d136706fd2356198852 upstream/main -- <the 17 PR paths>

Results

Check Result
Current-main merge preview Clean; tree 97f6e7e7826a2d278e1bad3d108f26170528ca44.
git diff --check Passed; no output.
Conventions Passed.
Intervening-main path comparison None of the PR's changed paths changed between the reported test base and current main.
Author-reported focused GPU tests Exact head 80cb2cd3ac: RTX 4090, 89/89; UHD 770, 88/89 with the same agc_driver_packed_unorm4444_multisample_partial_write failure on main; 0 VUID- lines on either. request_serializer, agc_shader_memory, and the coupled f16/f64 checks passed on both GPUs.
Hosted checks Windows, Ubuntu relinker, relinker ASan, eligibility, conventions, labels and report pass; Linux product job is skipped; two macOS relinker jobs remain queued.
Unedited local output
$ git merge-tree --write-tree upstream/main refs/remotes/review/pr-11483
97f6e7e7826a2d278e1bad3d108f26170528ca44
$ python3 tools/check_conventions.py --base upstream/main --head refs/remotes/review/pr-11483
All conventions checks passed.
$ git diff --name-status 184afa49adce16e298c47d136706fd2356198852 upstream/main -- <the 17 PR paths>
(no output)

Negative control

Assertion Change to code under test Did the new test fail?
Paired baseline for the focused serializer/SPIR-V behavior Author ran unchanged main 184afa49adce and the PR head on each GPU; this is a baseline comparison, not a mutation. No new failure reported; UHD 770's one failure is reported on both trees. No mutation control was run.

Findings

Blocking

None found on this exact head.

Non-blocking

#11351 remains open and also currently targets serializer format 50. The PR description records the agreed order: if #11351 lands first, this PR will move to 51 and rerun the focused set. Recheck that exact changed head before approval of any subsequent revision.

Sources

Not verified

I did not build or run the C++ tests locally, independently repeat the NVIDIA/Intel runs, test the console, or wait for the queued macOS jobs. The GPU results above are author-reported.

To get this to a good state

No change is requested on the reviewed head. Keep the stated serializer landing order; if #11351 lands first and this PR moves to format 51, I will review and rerun the focused commands on that new head.

@TechLevelZero

TechLevelZero commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 80cb2cd merged onto main 0836dfd · tested 2026-11-01 02:48 UTC · 19 min

GPU NVIDIA RTX 2000 Ada Generation, driver 595.99.02, Vulkan 1.4.329
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-38-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,399 passed · 6 failed (0 new, 4 also fail on main, 2 unstable on main) · 44 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,449 of 3,087 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (925 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 61.3 s, ⚠️ agc_driver_lookup_log_fits_build 40.7 s, ⚠️ agc_driver_graphics_maps_fallback 31.0 s, ⚠️ agc_driver_graphics 30.6 s
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)
agc_submit_progress: failed in 7 of the last 10 main runs
agc_submit_progress_no_timeline: failed in 9 of the last 10 main runs
Failing on main too (4, not counted against this PR)
agc_driver_idle_store_yields
agc_driver_image_table
guest_mmap_executable
guest_socket_options_multicast
Passed on retry (1, failed in the parallel run, passed when re-run with a 360 s timeout; not counted against this PR)
agc_driver_job_manager_compute_capacity: Failed in the parallel run; also passed only on retry in 211 other runs in the last 7 days
Validation IDs already present on main (5 IDs in 476 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (476 tests): agc_driver, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, agc_driver_bda_span_reads, and 468 more
VUID-vkCmdCopyImage-srcImage-01548 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_prepared_exports
VUID-VkShaderModuleCreateInfo-pCode-08737 (1 test): agc_driver_image_sample_derivatives
Skipped (44)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_dcc: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_deferred: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_main: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_fresh: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_f
Reproduce
git fetch origin 80cb2cd3acfdcde0abd374bc3f8886b5bd23e092 0836dfdf4fecb1e0326100c490476e15d3a74da5
git checkout 0836dfdf4fecb1e0326100c490476e15d3a74da5 && git merge --no-ff 80cb2cd3acfdcde0abd374bc3f8886b5bd23e092
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 32 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 4 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated build and test on a contributor's NVIDIA machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs.

@tibzejoker

Copy link
Copy Markdown
Contributor Author

Another device for this PR: savvaniss ran #11483 on an RX 9070 XT (RDNA 4, AMD Windows driver 26.8.1, 32_BIT_ONLY) in this run on #11368.

  • Every device logs DenormPreserve 16 and 64 are declared together.
  • The f64 add, mul and rounding tests print 0 device-dependent results skipped.
  • The focused set passes 110/110 with validation on, with 0 VUID- lines.

That adds RDNA 4 on AMD's own driver to the earlier iGPU and RADV results.

AI-assisted: yes (Claude Code)

@XairRrR XairRrR left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed — changes requested

This pull request does not merge cleanly into main (4f41f4c): head 80cb2cd conflicts in

  • core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
  • core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
  • core/shader/recompiler/tests/RequestSerializerTests.cpp
  • docs/dev/debt/shader.md

Please rebase it onto current main. I will review the change once it merges cleanly.

@tibzejoker

Copy link
Copy Markdown
Contributor Author

The conflicts are the request format. adriadam10 agreed on the landing order on #11351: #11351 goes first, then this PR rebases and takes the next number. main is now at format 53 (fe18496c95) and #11351 moves to 54, so this PR will take 55. I'll rebase it right after #11351 merges and re-run the focused tests on both GPUs. The body's Depends on line has the order.

AI-assisted: yes (Claude Code)

@XairRrR XairRrR left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed — changes requested

This pull request does not merge cleanly into main (1e65852): head 80cb2cd conflicts in

  • core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
  • core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
  • core/shader/recompiler/tests/RequestSerializerTests.cpp
  • docs/dev/debt/shader.md

Please rebase it onto current main. I will review the change once it merges cleanly.

This branch has not been deployed

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

Labels

agc libSceAgc* docs needs rebase Conflicts with main, rebase needed shader core/shader

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants