Commit Graph
2143 Commits
Author SHA1 Message Date
Adrià cceb6c3c41 Merge pull request #9961 from daviaaze/fix/agc-dcc-sliced-array-window
fix(agc): serve sampled DCC array views from their viewed slices
2026-10-25 21:53:47 +01:00
Dean 7ce95893f9 Merge pull request #10551 from JJenkx/perf/agc-storage-reclaim-ceiling
fix(agc): reclaim idle device buffers up to the storage cache's current cap
2026-10-26 09:10:30 +13:00
Adrià d17785dba8 Merge pull request #9551 from JJenkx/perf/agc-sparse-mirror-range-run
perf(agc): mirror a sparse heap whose committed span crosses adjacent ranges
2026-10-25 19:26:00 +01:00
Adrià 5d48c6233e Merge pull request #9401 from tibzejoker/perf/grow-pipeline-store
perf(agc): size the pipeline store to the title's working set
2026-10-25 19:07:59 +01:00
Dean 68cc9d4e75 Merge pull request #10369 from krishalivaibhav/fix/import-watched-write-opt-in
fix(agc): let imports that cannot write guest memory keep the watch armed
2026-10-26 06:14:06 +13:00
Davi Azevedo b166232c72 fix(agc): refresh DCC sampled array windows 2026-10-25 14:13:27 -03:00
Dean 79f061ba5b Merge pull request #9685 from thuanquang/fix/linear-target-completion-stores
fix(agc): store resident linear color targets at completion points, limited to their drawn rectangles
2026-10-26 05:44:21 +13:00
Dean 8864d0e323 Merge pull request #10500 from dotaku22/contribution/agc-uncommitted-depth-reuse
perf(agc): reuse uncommitted depth plane layers
2026-10-26 04:55:09 +13:00
Dean 006c3648bd Merge pull request #8911 from Celegans12/perf/agc-held-read-skip-empty-flush
perf(agc): skip the queued-draw read check when a storage flush stores nothing
2026-10-26 04:19:29 +13:00
Adrià 0658bc8749 Merge pull request #9186 from fma-rc/fix/agc-retire-undrawn-filled-msaa
fix(agc): retire an undrawn filled multisampled color target that a guest access overlaps
2026-10-25 14:25:07 +01:00
Adrià a8b199d103 Merge pull request #7618 from mrfelek/perf/stage-swept-write-only
perf(agc): stage written-only buffer elements a dispatch sweeps on discrete GPUs
2026-10-25 13:19:08 +01:00
Adrià a703a18496 Merge pull request #10046 from jotitadev/fix/agc-moltenvk-tessellation-pipeline-cache
fix(agc): create tessellation pipelines without the pipeline cache on MoltenVK
2026-10-25 12:38:16 +01:00
Adrià e317f41d59 Merge pull request #10440 from SuarezPM/ai/atomic64-keyed-tables
feat(shader): support 64-bit image atomics through keyed image tables
2026-10-25 11:58:35 +01:00
Adrià defc9674df Merge pull request #10375 from Ondra97/codex/fix-native-depth-attachment-alias
fix(agc): retire native depth before binding an overlapping layout
2026-10-25 11:58:29 +01:00
Adrià acbfd7c7fe Merge pull request #9941 from EagleBearerYS/fix/agc-sync-settle-initial-dcc-main2
fix(agc): settle a pending import synchronously before an initial multisampled DCC import
2026-10-25 10:50:05 +01:00
Adrià 1240b5da19 Merge pull request #9597 from milescoviello/fix/mipmapped-dcc-target-keys
fix(agc): keep a mipmapped DCC color target's keys on its resident image
2026-10-25 09:29:51 +01:00
Adrià fc41709ff3 Merge pull request #9564 from EagleBearerYS/port/fable-fix-template-bindings
fix(agc): find a template's data bindings by binding number
2026-10-25 09:29:46 +01:00
Jota 2fd07f181d fix(agc): keep tessellation pipelines off pipeline libraries without the pipeline cache 2026-10-25 08:55:44 +01:00
Jota 5daac82d32 fix(agc): create tessellation pipelines without the pipeline cache on MoltenVK
MoltenVK runs the tessellation evaluation stage as a post-tessellation
vertex function that reads the control stage's per-vertex outputs from a
raw buffer, and pads the evaluation input struct to every output of the
control shader it is linked with. The shader library cache of a
VkPipelineCache matches a cached conversion when the new pipeline has the
inputs that conversion used, so an evaluation shader converted next to a
hull with one 16-byte output is reused next to the merged hull, whose LDS
record adds a second per-vertex output. The domain stage then reads the
merged hull's control points at a 16-byte stride over a 48-byte buffer and
the patch lands elsewhere. Created without the pipeline cache, each
tessellation pipeline converts its stages for its own interface.
2026-10-25 08:55:34 +01:00
Adrià 811ffe10af Merge pull request #9514 from EagleBearerYS/fix/agc-address-copy-evict-main
fix(agc): an address-based build evicts idle imports instead of copying past the cap
2026-10-25 08:40:37 +01:00
Dean e5f23554c9 Merge pull request #10632 from noir39/fix/journal-replay-priority
fix(agc): build the pipeline journal replay at a lower thread priority
2026-10-25 20:23:57 +13:00
milescovielloandClaude Opus 5.5 52f36c8aa2 fix(agc): keep a mipmapped DCC color target's keys on its resident image
DecodeColorBuffer dropped the DCC address of a color target with more than
one mip, so the target's resident image had no keys: it was uploaded from
guest memory under the game's fast-clear keys, and no draw into it marked
them uncompressed. The game's textures over the same chain name the keys,
so they kept sampling the clear (0000 reads as (0,0,0,0)) whatever was
drawn. MXGP 26, Borderlands 4 and Forspoken render such targets.

- ColorTarget.chainDccAddress keeps the keys of a 2D single-layer chain;
  dccAddress stays 0, so the per-draw single-mip key handling is unchanged.
- SurfaceForTarget gives the resident surface those keys, and the image
  then treats them as a multi-mip storage image does: a uniform clear is
  cleared on the GPU at upload, and the first write marks every key
  uncompressed.
- A draw recipe's key check uses the surface's keys.
- sizeof(State) is 840: the recipe codec and CanonicalPipelineState do not
  copy the field.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-25 00:31:53 +00:00
thibautandClaude Opus 5.5 ad047899bb perf(agc): grow the pipeline store from 1024 up to 4096 entries
The graphics pipeline store kept a fixed 1024 entries and the pipeline journal replayed at most
1024 records, and a replayed pipeline that found the store full was dropped. A title whose
working set is larger rebuilt the rest at the draw on every run, and evicted pipelines it kept
using were rebuilt again and again.

The bound now starts at 1024 and doubles up to 4096: a journal replay that does not fit grows it
instead of dropping the pipeline, and so does eviction churn (a ghost list of evicted keys, checked
every bound/32 evictions: more than half of them came back). It never shrinks during a run;
APS5_PIPELINE_STORE_ENTRIES still fixes it. The journal loads its last 4096 records by default
(APS5_PIPELINE_JOURNAL_ENTRIES). Resident pipelines are bounded by count, not bytes.

agc_driver_recorder_tests --benchmark-pipeline-store-memory [count] (opt-in, not registered)
builds count graphics pipelines with one fragment module each through CachedPipeline and prints
process private bytes and VK_EXT_memory_budget heap usage before and after: with the triangle
shaders about 59 KiB host and no device memory per pipeline on an RTX 4090, 100 KiB host and
8 KiB device-local on a UHD 770.

Tests: agc_pipeline_store_growth (fails on main), agc_pipeline_store_fixed_bound,
agc_pipeline_store_replay_growth (replays on one thread: the mock Vulkan is not thread-safe).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017SNUYRd7sRKZrMYpquAsnU
2026-10-25 02:02:41 +02:00
Dean Galvin f139561693 Merge main into fix/linear-target-completion-stores 2026-10-25 12:57:20 +13:00
JJenkxandClaude Opus 5.5 7fd7ae4064 perf(agc): keep a heap mirror that an import covers only in part
An address-based build releases the heap mirror at the base of each range
it imports. A mirror over a joined run of ranges starts at its first range
but spans the others too, so importing that range alone released it, and
the next descriptor bind rebuilt it: in Echoes of the End, 140 releases
and rebuilds of a 544 MiB mirror in 480 s. A heap mirror is now released
only when the imported range covers its reserved span.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 17:48:30 -04:00
JJenkxandClaude Opus 5.5 01e74052c7 perf(agc): mirror a sparse heap whose committed span crosses adjacent ranges
A sparse heap the guest grows by mapping an adjacent range is no longer
covered by one leased range, so bindSparseMirror refused it and every
use copied the heap's committed pieces on the CPU. The mirror now takes
a joined range over the run of continuing ranges (crossedRun), kept
while its member ranges stay the same.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 17:39:34 -04:00
Adrià Franch 0aa8b09eb0 fix(agc): pass the host-only flag at the first-sample sampling path 2026-10-24 22:41:08 +02:00
fma-rc dcd88603ca fix(agc): keep an undrawn multisampled target a dispatch wrote or a fill cleared guarded 2026-10-24 22:41:08 +02:00
fma-rc 17eb2ea5f8 fix(agc): retire an undrawn filled multisampled color target that a guest access overlaps 2026-10-24 22:40:51 +02:00
Adrià 2dc85609fc Merge pull request #5431 from sktharunbalaji13-cmd/feat/shader-draw-submission-correlation-5166-fresh
feat(agc): trace shader failures through draw submission batches
2026-10-24 21:49:57 +02:00
Yunus Shaikh 02f6f8e66f Merge main into fix/agc-sync-settle-initial-dcc-main2 2026-10-24 11:49:50 -07:00
Adrià FranchandClaude Sonnet 5.5 041df5af17 fix(agc): record an evicting import's range as a pair for the mirror release
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-24 20:42:43 +02:00
Adrià Franch 4e35ece5a3 Merge remote-tracking branch 'upstream/main' into HEAD 2026-10-24 20:42:36 +02:00
Adrià c035bd5b70 Merge pull request #9424 from hugodearaujo/fix/agc-unset-index-limit
fix(agc): resolve indexed indirect draws on a queue that never set INDEX_BUFFER_SIZE
2026-10-24 20:23:28 +02:00
Adrià 24581200ad Merge pull request #9450 from fma-rc/fix/agc-eqaa-one-fragment
fix(agc): draw a one-fragment multisampled color target as one sample with sample 0's coverage
2026-10-24 20:22:28 +02:00
Adrià 8d3ec0aead Merge pull request #9436 from ycbuzi/fix/agc-vertex-format-widen
fix(agc): widen a vertex format the device lacks to the buffer element's
2026-10-24 20:22:23 +02:00
Dean 1009187128 Merge pull request #9348 from klosixgaming-arch/feat/agc-color-logic-op
feat(agc): apply the color logic operation of CB_COLOR_CONTROL
2026-10-25 06:36:03 +13:00
Tharun Balaji ea65a95401 feat(agc): trace shader failures through draw submission batches 2026-10-24 18:58:54 +02:00
Adrià dab0113e06 Merge pull request #9373 from thuanquang/fix/draw-profile-report-async
perf(agc): write the draw profile reports through the asynchronous profile output
2026-10-24 18:48:59 +02:00
Adrià af45c3030e Merge pull request #9406 from JJenkx/fix/depth-plane-unmapped
fix(agc): drop stale depth-plane results whose guest memory was unmapped
2026-10-24 18:43:45 +02:00
Adrià 6da7e42704 Merge pull request #9652 from JJenkx/perf/agc-join-from-run-start
perf(agc): join the imports of a buffer bound from the start of adjacent ranges
2026-10-24 18:28:15 +02:00
Adrià 05a83d8ea7 Merge pull request #8756 from milescoviello/perf/draw-snapshot-containing
perf(agc): take a draw snapshot from a kept snapshot that contains it
2026-10-24 18:27:11 +02:00
Adrià 43768fa237 Merge pull request #8999 from milescoviello/feat/db-depth-copy-draw
feat(agc): draw DB depth copies with a driver pixel program
2026-10-24 17:29:23 +02:00
Dean b607bfdc8b Merge pull request #8213 from milescoviello/fix/journal-stream-modules
fix(agc): read the pipeline journal's modules at replay instead of holding the file
2026-10-25 04:18:44 +13:00
Adrià 3ca5b17655 Merge pull request #9443 from janzezno/fix/array-target-depth-plane-flush
fix(agc): flush depth planes only over the layers an array target's lookup refreshes
2026-10-24 16:59:49 +02:00
Adrià d098eca3d6 Merge pull request #9185 from janzezno/fix/pixel-interlock-monolithic
fix(agc): build a pipeline with a fragment shader interlock whole, not from libraries
2026-10-24 16:29:56 +02:00
Dean Galvin 8016939e31 fix(agc): bump the pipeline journal format for the color logic operation
encodeState and decodeState carry colorRop, which changes the recipe codec. Main's journal format is already 9, so the bump to 9 this branch made is a no-op; use 10.
2026-10-25 03:20:33 +13:00
fma-rc 5d418de02d fix(agc): keep a one-fragment target's FMASK address without its pipe-bank XOR
CB_COLOR_FMASK's low 16 bits carry the surface's pipe-bank XOR, as with the other 64 KiB-aligned
metadata bases, so the guarded FMASK range starts at the 64 KiB-aligned surface.
2026-10-24 16:08:49 +02:00
fma-rc ce51369643 test(agc): keep the one-fragment coverage case in the anonymous namespace and leave the key-range comment unchanged 2026-10-24 16:08:49 +02:00
fma-rc 1930fb56bd fix(agc): apply a one-fragment target's CMASK fast clear as a one-sample clear
With one fragment, CMASK code 0 marks a tile whose only fragment holds the clear color, as radeonsi's
CMASK fast clear writes it. Such tiles are materialized like a one-sample target's; codes other than 0
and 0xc-0xf still throw.
2026-10-24 16:08:49 +02:00