Accept the 10-bit BT.2100 PQ display formats 0x8100070422000000 (red
in the low bits) and 0x8100070400000000 (blue in the low bits) and
convert them to 8-bit sRGB when presented: PQ EOTF, BT.2020 to BT.709
primaries, a luminance tone map whose white level is the tone-map
luminance sceSystemServiceGetHdrToneMapLuminance reports (reference
white min(203 nits, white level)), and the sRGB encoding.
The conversion runs on the CPU for linear buffers and DCC clear values,
in the color transfer shader for tiled guest buffers, and in the
presentation pass for resident images. The three share the PQ EOTF
table computed once in double precision.
AI-assisted: yes
An unterminated or empty directory name, "." or "..", or a name
containing "/", "\" or ":" now returns SAVE_DATA_ERROR_PARAMETER and
leaves the mount result unchanged. The SDK 12.000 reference lists that
code for an invalid parameter of sceSaveDataMount3, KytyPS5's
SaveDataMount3 returns it for an invalid name, and sceSaveDataDelete
and sceSaveDataConvert already return it here for the same check.
It threw before, which stopped Minecraft Preview (PPSA19639) on
entering a world.
The Mount3 trace now prints at most the 32 bytes of the directory name
and the 16 bytes of the mount point, since both can be unterminated
when the mount fails.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A polling CPU can observe bit 63 before the sample counts when one dispatch stores both. Clear that bit and publish each half first, then set it from a later dispatch once those stores are visible to the host.
Co-authored-by: Cursor <[email protected]>
Driver::draw copied every stage's compiled result (RecompileResult, with
its binding, push-constant and attribute vectors) out of the shared result
the capture materialized, once per stage per draw. The stages now point at
the shared result. Only the CPU path of an indirect draw rewrites a stage
(each record's patched user data is materialized again), so that path
copies the stages it may rewrite first, on a cache hit or a miss.
agc_driver_indirect_patched_stage draws through that path: a record that
patches the user data word a vertex stage writes as its depth must draw
with the record's value, not the register's.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A cached variant kept its SPIR-V in memory for the whole run. On Linux and
macOS the words are now a view into the mapped cache file, and a freshly
compiled variant is written and mapped back, so the kernel can drop them.
SampleSliceZero cleared the cached textures while its draw's results
were still pending, so the storage image was torn down with them, which
ClearCachedTextures only expects at device teardown. On some runs the
next Run then read the first pass's slice 0 after filling it with the
initial value (3 of 20 on an RTX 4070, reported on the PR). It now
flushes and waits first, as Run does before its own clear.
Three ways to break the untracked hint passed every test:
- hinted() without its coverage check walks, and resets, the marks of
blocks that fresh backing put back under the watch;
- walkHints stamping the walk's first block instead of the marked page's
block hides a store from an image over another block;
- compareUntracked without NewestStamp in a hinted key misses a GPU write
into an import, which sets no mark and is only recorded by MarkWritten.
CheckUntrackedHint now walks the whole range after a store into its
second block and reads each block's hint on its own. It also recommits
fresh backing over the hinted range: the range must have no hint, and a
CPU store must still reach its collect. RunHintedImport hides a store's
mark and records it with MarkWritten, and the image must still be
uploaded at the next epoch. Each of the three changes above now fails
agc_write_tracking or agc_driver_dcc_keys_first_write.
Co-Authored-By: Claude Opus 5.5 <[email protected]>