Commit Graph
3025 Commits
Author SHA1 Message Date
Adrià d64134f09e Merge pull request #1866 from adriadam10/feat/shader-dx10-clamp
feat(shader): follow DX10_CLAMP in the clamp modifier
2026-10-09 00:31:40 +02:00
Adrià FranchandClaude f04ce007b6 feat(shader): follow DX10_CLAMP in the clamp modifier
Co-Authored-By: Claude <[email protected]>
2026-10-09 00:25:07 +02:00
Adrià ce64d8eb36 Merge pull request #1850 from adriadam10/feat/shader-f32-denormal-flush
feat(shader): flush f32 denormals in the float modes that flush them
2026-10-09 00:24:54 +02:00
Adrià 1be6f9f1c5 Merge pull request #1851 from adriadam10/feat/shader-omod-float-mode
fix(shader): apply the output modifier only in the float modes where the hardware does
2026-10-09 00:18:27 +02:00
Adrià FranchandClaude f132f16155 feat(shader): flush f32 denormals in the float modes that flush them
Co-Authored-By: Claude <[email protected]>
2026-10-08 23:59:24 +02:00
Adrià FranchandClaude d3f2611384 fix(shader): apply the output modifier only in the float modes where the hardware does
Co-Authored-By: Claude <[email protected]>
2026-10-08 23:58:08 +02:00
Adrià ae91d9780b Merge pull request #697 from queeeef/feat/interp-f16
feat(shader): implement v_interp_p1ll_f16, v_interp_p1lv_f16 and v_interp_p2_f16
2026-10-08 23:56:17 +02:00
Adrià 94b1eecb59 Merge pull request #533 from adriadam10/test/vop3p-packed
fix(shader): choose packed f16 NaN results on the bits, as RDNA does
2026-10-08 23:41:34 +02:00
Adrià dc79e9b1d6 Merge pull request #938 from CnRJay/feat/ds-src2-b32
feat(shader): implement the 32-bit DS src2 operations
2026-10-08 23:36:33 +02:00
Adrià FranchandClaude 8f663d0123 feat(shader): follow the float mode in 16-bit interpolation
Co-Authored-By: Claude <[email protected]>
2026-10-08 23:36:04 +02:00
Daan DehingandClaude Opus 5.5 425836e73f fix(shader): give 16-bit interpolation NaNs the hardware priority
Measured on RDNA2 in #697: an invalid product or sum (inf * 0, inf - inf)
gives the negative default NaN, 0xffc00000 or 0xfe00, and beats a NaN
addend. A NaN delta, then a NaN coordinate, still wins, quieted; a NaN
addend is returned quieted only when the product is valid.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 23:36:04 +02:00
Daan DehingandClaude Opus 5.5 7f53a48131 fix(shader): round each 16-bit interpolation step once, as on hardware
Measured on RDNA2 in #697: v_interp_p1ll_f16 and v_interp_p1lv_f16 are a
fused multiply-add rounded once to f32, and v_interp_p2_f16 rounds the exact
P20 * J + S2 once to f16. The separate multiply and add matched about 85% and
4% of the measured rows.

Both steps now use FPInterpolateF32 and FPInterpolateF16: the f16 delta times
the f32 coordinate is exact in f64, the sum is rounded to odd and then once to
nearest even at the target precision, so no driver can split or reround it.
Infinite and NaN operands take the unbounded f64 result.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 23:36:04 +02:00
Daan DehingandClaude Opus 5.5 daa6bee7cf feat(shader): implement v_interp_p1ll_f16, v_interp_p1lv_f16 and v_interp_p2_f16
Decode the three VOP3 16-bit interpolation instructions (attribute, channel
and high-half select in the src0 field, the I/J VGPR in src1, P0 or the first
step's result in src2) and translate them with a new
GetInterpolationParameterF16 IR value. It reads the selected 16-bit half of
each vertex's parameter through VK_KHR_fragment_shader_barycentric, so P10 and
P20 are vertex differences rounded to f16; both steps are a multiply and an
add, as in the f32 forms.

An input in FP16_INTERP_MODE whose low half is defaulted is still declared at
its slot when its high half is read, and the high half takes its default from
USE_DEFAULT_ATTR1 and DEFAULT_VAL_ATTR1. Without barycentrics, on an input
without FP16_INTERP_MODE or on a pass-through input the instructions throw.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 23:36:04 +02:00
Adrià FranchandClaude a000305181 fix(shader): choose packed f16 NaN results on the bits, as RDNA does
Co-Authored-By: Claude <[email protected]>
2026-10-08 23:34:18 +02:00
Adrià aa258760dc Merge pull request #1826 from adriadam10/feat/shader-ieee-minmax
feat(shader): follow IEEE_MODE in f32 min, max, min3, max3 and med3
2026-10-08 23:33:59 +02:00
Adrià 364a56b681 Merge pull request #1816 from adriadam10/feat/shader-float-mode-carry
feat(shader): carry the shader float mode into the recompile request
2026-10-08 23:16:04 +02:00
Adrià FranchandClaude be3bd9fbd7 fix(shader): refuse the f32 DS src2 operations until LDS float denormals are modelled
Co-Authored-By: Claude <[email protected]>
2026-10-08 23:13:23 +02:00
Adrià FranchandClaude fe1f7b38af feat(shader): follow IEEE_MODE in f32 min, max, min3, max3 and med3
Co-Authored-By: Claude <[email protected]>
2026-10-08 23:09:31 +02:00
Claude c0519cc814 feat(shader): implement the 32-bit DS src2 operations
The decoder threw on the GFX10.1 DS src2 opcodes 0x80-0x8b, 0x8d,
0x92, 0x93 and 0x95. Each reads DS[B], where B is the address plus
four times the 15-bit signed offset in offset1[6:0]:offset0, and
applies the matching operation to DS[A]: add, sub, rsub, inc, dec,
signed and unsigned min and max, and, or, xor, f32 min, max and add
through the 32-bit LDS atomics, and a plain write for
ds_write_src2_b32. The form that takes the offset from the address
bits (offset1[7]), the 64-bit forms and GDS still throw.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 23:06:15 +02:00
Adrià 0447793216 Merge pull request #1809 from adriadam10/feat/image-pck2-pck4
feat(shader): implement MIMG PCK2/PCK4 loads as measured on hardware
2026-10-08 23:05:02 +02:00
Adrià aa277b3818 Merge pull request #1821 from adriadam10/ci/repeat-on-main
ci: repeat the tests three times on main only
2026-10-08 22:35:30 +02:00
Adrià FranchandClaude 8adb7db88e ci: repeat the tests three times on main only
Co-Authored-By: Claude <[email protected]>
2026-10-08 22:31:54 +02:00
Adrià FranchandClaude 0cbc9586bc feat(shader): carry the shader float mode into the recompile request
Co-Authored-By: Claude <[email protected]>
2026-10-08 22:17:07 +02:00
Adrià FranchandClaude 57d4be33bb feat(shader): implement MIMG PCK2/PCK4 loads as measured on hardware
Co-Authored-By: Claude <[email protected]>
2026-10-08 21:54:10 +02:00
Adrià 4b6ab6bb73 Merge pull request #1797 from adriadam10/ci/keep-main-cache
ci: save the compiler cache before the tests
2026-10-08 21:40:48 +02:00
Adrià 2cc7f09d1d Merge pull request #1793 from adriadam10/feat/image-by-measured
feat(shader): implement MIMG BY2/BY4 loads as measured on hardware
2026-10-08 21:37:24 +02:00
Adrià FranchandClaude fe7e0e6098 ci: save the compiler cache before the tests
Co-Authored-By: Claude <[email protected]>
2026-10-08 21:35:13 +02:00
Adrià FranchandClaude d5a3a4321c fix(shader): follow measured hardware for MIMG BY2/BY4 loads
Co-Authored-By: Claude <[email protected]>
2026-10-08 21:28:22 +02:00
Petre 88f7a5e0e4 feat(shader): lower full-width MIMG BY2 and BY4 transfers 2026-10-08 21:10:51 +02:00
Adrià b858fdc48e Merge pull request #1701 from pandather/feat/shader-decode-gather-h-pck
feat(shader): implement image_gather4h_pck end to end
2026-10-08 21:05:27 +02:00
Adrià FranchandClaude 028bea7818 test(shader): use raw buffer bounds in the packed horizontal gather test
Co-Authored-By: Claude <[email protected]>
2026-10-08 20:42:14 +02:00
Adrià FranchandClaude 7f25d49fb8 fix(shader): fetch packed horizontal gather texels and cover edge coordinates
Co-Authored-By: Claude <[email protected]>
2026-10-08 20:42:14 +02:00
Mark Kuebel d0551d381b feat(shader): implement image_gather4h_pck end to end
Decodes IMAGE_GATHER4H_PCK (MIMG opcode 98) and IMAGE_GATHER8H_PCK
(opcode 99), implements gather4h_pck through translation, the SPIR-V
backend and a GPU execution test, and documents gather8h_pck as a
desktop null-op.

Semantics were measured on gfx1031 hardware with hand-encoded MIMG
words (LLVM rejects the PCK gather mnemonics on every RDNA1/RDNA2
target). The measured rule for gather4h_pck: the four-texel horizontal
window is floor(u*width-0.5)+{-1,0,+1,+2} clamped to the width, the row
is floor(v*height) clamped, the raw bits of the window texels are
concatenated into a little-endian bitstream (texel k at bit offset
k*texelBits), and output register j - the j-th set DMASK bit in
ascending order - receives stream word j, zero past the end of the
stream. Exactly popcount(dmask) consecutive VGPRs are written from vdst
ascending; texels wider than 32 bits write zeros (hardware limit); rows
past the height read zeros; negative coordinates clamp to zero. The
window anchor matches the repo's existing PS5-validated HorizontalOffsets
rule, so this reuses the established convention.

The decoder accepts multi-bit DMASKs for these two opcodes only and
sizes their data span as popcount(dmask) (measured), unlike gather4h
which always writes four components. Translation carries the packed
flag through imageMemoryInfoFromInstruction; the SPIR-V emitter
reassembles the bitstream per lane with per-texel OpImageFetch and
byte assembly. D16 data throws until measured.

gather8h_pck never returns texel data on this hardware: across dmasks
0x1-0xFF including the upper nibble, RGBA8/RGBA16/RGBA32 formats, 1D/2D
and 3D descriptors, normalized and unnormalized sampling, sentinel-
prefilled destination registers confirm it only ever zero-fills
popcount(dmask) registers. It decodes but throws at translation.

The measured semantics and the gather8h_pck null-op are recorded in
docs/dev/TechnicalDebt.md.
2026-10-08 20:42:03 +02:00
Adrià 55e8959bde Merge pull request #1744 from adriadam10/ci/slow-test-warning
ci: warn about tests that take more than 30 s
2026-10-08 20:41:48 +02:00
Adrià 6cf6d6c5ec Merge pull request #1752 from adriadam10/fix/spirv-validator-friendly-names
perf(shader): skip friendly names when validating SPIR-V
2026-10-08 20:40:55 +02:00
Adrià 406b5e1c97 Merge pull request #1535 from Sanjaysrinivas/feat/shader-static-call
feat(shader): execute bounded S_CALL_B64
2026-10-08 20:39:08 +02:00
Adrià FranchandClaude b7baeabfc5 perf(shader): skip friendly names when validating SPIR-V
Co-Authored-By: Claude <[email protected]>
2026-10-08 20:32:24 +02:00
Sanjaysrinivas 2b2a0c09b4 test(shader): report effective call targets
ComputeTarget(32) can fall back to the default subgroup size. Report both effective sizes and dispatch the third configuration only when it differs, so duplicate runs do not imply wave32 host coverage.

Lavapipe exposes subgroup 8 for both requests: seven CMake checks pass, the distinct matrix passes 1,920 comparisons, ten captured modules validate, and the expected-output negative control fails as intended.
2026-10-08 20:23:47 +02:00
Sanjaysrinivas 4d2917e632 fix(shader): guard scalar call link lifetimes
Reject tuple and descriptor overlap, wrong-pair returns, relative SGPR reads, reversed regions and ordinary or conditional fall-through into a callee. Preserve the existing scalar write analysis and require exact return-pair matching.

Seven targeted regressions fail before these guards and pass afterward. Seven focused CMake tests and 15 SPIR-V validations pass; the execution matrix passes 3,200 comparisons and detects a one-bit expected-output mutation.
2026-10-08 20:23:47 +02:00
Sanjaysrinivas ee0b1109f4 feat(shader): execute bounded S_CALL_B64
Reuse the prerequisite call-region analysis for signed relative calls, including callees after s_endpgm. Lower the saved link as shader base plus PC+4 and reject unsupported targets and call shapes.

Add decoder, IR, CFG and Vulkan execution regressions. Seven focused CMake tests pass; five layouts cover 15 dispatches and 3,200 output comparisons on lavapipe. Record ISA sources and native RDNA2/PS5 limits in TechnicalDebt.
2026-10-08 20:22:51 +02:00
Adrià FranchandClaude bc02b80c18 ci: warn about tests that take more than 30 s
Co-Authored-By: Claude <[email protected]>
2026-10-08 20:19:08 +02:00
Adrià 4ddbf0497d Merge pull request #1217 from ebosido444-ai/feat/s_swappc_b64
feat(shader): translate s_swappc_b64 fetch-shader calls at vertex entry
2026-10-08 20:15:55 +02:00
Adrià FranchandClaude c3e16afddd fix(shader): allow fetch-shader calls at registration and test the fetched values
Co-Authored-By: Claude <[email protected]>
2026-10-08 20:05:24 +02:00
ebosido444-ai c48e01977d feat(shader): implement s_swappc_b64 fetch-shader call
Decodes SOP1 0x21 s_swappc_b64 (link pair = pc + 4) and resolves its call/return pairing through the existing s_setpc_b64 path: static call regions in GraphBuilder and the vertex-entry fetch-shader call inlined from the parsed fetch-shader plan. s_call_b64 (SOPK 0x16) and s_rfe_b64 (SOP1 0x22) throw at decode. Unmodeled cases throw; see docs/dev/TechnicalDebt.md.
2026-10-08 20:05:24 +02:00
Adrià 6b56175a42 Merge pull request #1691 from adriadam10/docs/architecture-shader-registration
docs(architecture): describe shader compilation at registration
2026-10-08 19:47:58 +02:00
Adrià FranchandClaude d3afdb02e2 docs(architecture): describe shader compilation at registration
Co-Authored-By: Claude <[email protected]>
2026-10-08 19:47:03 +02:00
boykopovar 239412351e Merge pull request #639 from boykopovar/feat/no-ingame-shaders-recomp
perf(agc): baseline shader recompilation on registration
In main, baseline recompilation depends on the resource configuration and runs on the first use of each corresponding variant.

This branch prepares IR, the static interface, baseline SPIR-V, and available ABI variants during shader registration. The compiled artifact is separate from per-draw and per-dispatch data.

Before the first execution with a new resource configuration, the runtime reads descriptors, validates compatibility, prepares the binding plan, specializes existing SPIR-V by substituting constants and removing unused branches and computations, materializes invocation data, and creates the Vulkan pipeline. These results are cached.

Variants that depend on linked graphics stages are prepared when the corresponding ABI is resolved. Unregistered compute shaders undergo baseline preparation on their first dispatch, emit an error log, and cache the result.

Subsequent executions reuse prepared artifacts, specializations, and pipelines while updating invocation data and resources as needed.
2026-10-08 20:45:54 +03:00
Adrià 2b297842e4 Merge pull request #1715 from adriadam10/ci/flat-store-serial
test(agc): run agc_driver_flat_store alone
2026-10-08 19:38:53 +02:00
Adrià FranchandClaude beaaa4de18 test(agc): run agc_driver_flat_store alone
Co-Authored-By: Claude <[email protected]>
2026-10-08 19:28:29 +02:00
Adrià 17350cf5fd Merge pull request #895 from Kikoarl/feat/s-call-b64
feat(shader): implement S_CALL_B64
2026-10-08 19:24:59 +02:00