importBudget keeps this branch's configuredBudget split and takes #6472's HostImportBudget for the default; the host-import debt entry takes #6472's budget sentence next to this branch's report and refusal sentences.
A draw on the mesh path was validated before its pipeline checked for
mesh shader support, so on a device without VK_EXT_mesh_shader (an RDNA1
RX 5700 XT) Sackboy: A Big Adventure (PPSA01289) stopped on "subgroup
capability 61 is unsupported for shader stage 128" instead of the actual
cause. ValidateShaders now takes the device's mesh shader support and
refuses such a draw first with "device does not support mesh shaders".
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
RecordedFillClearsWithoutWait now also runs with a D32_SFLOAT_S8_UINT target: a
recorded SMem 0 fill (0xf0) over the HTILE clears depth and stencil at the bind
without a GPU wait, and is stored back as expanded (0xfffff3ff). The stencil case
alone fails with APS5_NO_PENDING_HTILE_FILLS=1.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A depth target's bind (storeBackClearedHtile) reads its HTILE words to find a fast clear and
stores them back expanded. When a recorded fill over the HTILE was still pending, that read
made the flush hook submit the open batch and wait for the GPU, under the GPU mutex. A title
that clears its depth targets with buffer fill kernels pays that wait at every clear.
Uniform fills now note their 32-bit word with the pending write (NotePendingWordFill; the byte
value the DCC key paths use is unchanged). When every pending write over the HTILE is such a
fill and the rest of the range already holds the same word, the bind takes the landed word
from the notes, and stores the expanded words as a GPU fill recorded behind the pending ones.
Any other pending write keeps the read. APS5_NO_PENDING_HTILE_FILLS=1 always reads.
PPSA12544 on a Radeon 780M (Windows): 1271 pending-write syncs per 10 s waited 5.5 s at the
bind, about 4.3 ms each; with this change there are none, and the scene runs at 60-61 fps
instead of 44-46.
The paragraph said a game shows no text without the font files. A title that asserts on the sceFontOpenFontSet result stops at boot instead, so say both, and say where the Noto Sans substitutes come from.
PPSA08270 (Eternights) stopped after its story intro with "AGC graphics:
CB resolve from a target whose sample count differs from the
rasterizer's". It resolves a 4x 512x512 target into a single-sample one
with PA_SC_MODE_CNTL_0.MSAA_ENABLE off while PA_SC_AA_CONFIG still holds
2x from earlier draws. Without MSAA_ENABLE the scan converter does not
use PA_SC_AA_CONFIG's sample count, so the resolve takes its sample
count from CB0 as it already does when PA_SC_AA_CONFIG is single-sample.
Since #6346 a CPU write elsewhere in an image table's 64 KiB block no
longer fails the table's unchanged proof on Windows, because the proof
is answered per page there too. The Windows-only expectation of a second
resolution is stale and agc_driver_image_table_reuse fails on Windows.
Expect the Linux count on every host.
Without system font files, sceFontOpenFontSet returns
SCE_FONT_ERROR_FONT_OPEN_FAILED and logs `file=(none)` for each call.
Some titles then fail far from the cause: Astro's Playroom (PPSA01325)
lays out text with the failed set and stops on an out-of-heap or invalid
texture assertion (#7714). The first such open now prints the font set
and the directory searched to stderr, with how to supply the fonts.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
DB_STENCILREFMASK holds a test value and a separate operation value, and
REPLACE_OP, ONES and REPLACE_TEST write a value that can differ from the
test value on bits the compare reads. Vulkan uses one reference for both,
so such a face threw. Ghost of Tsushima (PPSA02225) stops on one at its
splash screen (test value 0xff, operation value 0x40, both masks 0xff).
Some compares fix the stencil value wherever an operation runs: EQUAL on
pass and depth fail, NOTEQUAL on fail, and LEQUAL, GEQUAL, LESS or GREATER
against the largest or smallest masked value. There, if every written bit
is compared, the written bits hold the test value, so the replacement is
an INVERT whose write mask holds only the bits that differ from the value
written. The operations of a face share its write mask, so a face whose
other operations can't be drawn the same way still throws.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
With independent sets, a pipeline linked from a pre-rasterization library and a fragment shader library must not leave the same set slot VK_NULL_HANDLE in both libraries' layouts (VUID-VkGraphicsPipelineCreateInfo-pLibraries-06681). Every pipeline with a fragment stage is split when the device has graphics pipeline libraries, and each part's layout held only the sets its own stages bind, so a fragment shader that binds nothing in set 1, or a draw where no stage binds set 0, left that slot null in both parts. A slot neither stage binds now goes to the part that owns it: set 0 to the pre-rasterization layout, set 1 to the fragment layout.
The retile and key-store helpers order the host's pattern writes before their transfer with VK_ACCESS_HOST_WRITE_BIT under VK_PIPELINE_STAGE_ALL_COMMANDS_BIT alone, which does not include the host stage (VUID-vkCmdPipelineBarrier-srcAccessMask-02815). They now name VK_PIPELINE_STAGE_HOST_BIT as UnitShadow.cpp does for the same barrier.
DescriptorCache::AllocateRewritten handed out any recycled set of the requested layout. The
variable descriptor count of an image-table binding is fixed when its set is allocated, and
PrepareDrawBindings writes the table's present elements, up to its current element count, into
the set it gets. A draw whose table had more elements than the table the recycled set was
allocated for could write descriptors past the set's allocation
(VUID-VkWriteDescriptorSet-dstArrayElement-00321).
A set from a chain pool now records the variable count it was allocated with, as a dedicated-pool
set already does, and recycled sets are kept per layout and variable count, so a rewritten draw
reuses a set only for a table of the same size.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Main's sameRange for a failed import now takes the import budget, as the HostImport overload does, so a recorded failure is compared against the run the budget would import again.
Main's sameRange for a failed import now takes the import budget, as the HostImport overload does, so a recorded failure is compared against the run the budget would import again.
Main's sameRange for a failed import now takes this branch's import budget, as the HostImport overload does, so a recorded failure is compared against the run the budget would import again.