The pipeline library paragraph listed per-face depth bias, split alternate
alpha blends, rect lists, geometry shaders and a stage without a variant id
as the pipelines created whole. libraryKeys in Pipeline.cpp also builds a
pipeline whole for barycentrics emulated through generated tessellation
stages, for tessellation on MoltenVK, for a pixel shader with a fragment
shader interlock or with its LDS array in a storage buffer, and for every
pipeline under APS5_PIPELINE_STATS=1, and it tests a stage's
RecompileResult::Identity rather than a variant id. The paragraph now lists
these cases and names libraryKeys.
AI-assisted: yes
PROGRESS.md says a definition is behaviourally empty when it returns a
local static wrapper that is itself behaviourally empty. The scanner
recognizes wrappers with the same pattern it uses for stub wrappers,
where static is optional, so a non-static helper such as
int Support() { return 0; } also makes int APS5_VABI E() { return
Support(); } behaviourally empty. Drop the static qualifier from the
description.
AI-assisted: yes
The performance trace section said that APS5_TRACE_EVENTS sizes the
buffers of the queue workers and the presenter, and that only those
threads record a window. The draw committer of pipelined draws, which is
on by default, and the draw finisher of APS5_DRAW_PIPELINE also bind to
the trace with the default capacity, so PerformanceTrace::BindThread
gives them a buffer of APS5_TRACE_EVENTS events too, and they record
their scopes in the window. The section now names both threads.
AI-assisted: yes
On a one-lane wave (vertex and local programs without vertex subgroups,
merged hull programs), a wave64 f32 max half-wave scan threw at its
v_permlanex16_b32. When the scan's lane 31 and 63 reads only elect,
through v_cmpx_eq_f32 against each lane's own key, the lanes that
buffer_atomic_umax or smax that maximum at a wave-uniform address with an
unused result, each invocation now takes its own key: every active lane
writes it, and memory ends with the wave's maximum because the keys are
proven non-negative and not NaN. The permutation, whose value then
reaches no other result, keeps its own value.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
HW_ORACLE.md said the first run builds oracle.c into
~/.cache/anyps5-hw-oracle/. hw_oracle.py takes the cache root from
XDG_CACHE_HOME and falls back to ~/.cache only when that variable is unset
or empty, so with XDG_CACHE_HOME=/tmp/xdg the binary is built under
/tmp/xdg/anyps5-hw-oracle/ and nothing appears in ~/.cache. The document
now names XDG_CACHE_HOME, the ~/.cache fallback, and HW_ORACLE_CACHE as
the override of both.
AI-assisted: yes
The opening paragraph of docs/dev/ENVIRONMENT.md lists the calls through
which the code reads environment names, and so the reads that the
Conventions check holds to a row. It omits _wgetenv with a wide literal.
tools/env_reference.py has recognised that form since 65da8ac106, and the
code reads nine names through it on Windows, among them
ANYPS5_SHADER_CACHE_DIR, ANYPS5_SCREENSHOTS and APS5_DUMP_SUBMITS. The
paragraph now names _wgetenv beside GetEnvironmentVariableW.
AI-assisted: yes
The barycentric tessellation path refused any draw with the primitive
restart bit set. A non-indexed strip ignores the bit, and on a device
without VK_EXT_primitive_topology_list_restart a list never restarts on
the host, since its indices are compacted on the CPU first, so both now
take the patches. Indexed strips with primitive restart still throw,
now also in Graphics::Draw, which knows the draw is indexed.
Patch-list pipelines never enable primitive restart, which Vulkan does not
allow for them without primitiveTopologyPatchListRestart.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Adds the missing full stop after the original sentence and states that the 13 titles call both functions directly from the executable, so the entry does not read as if the other titles never call them.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Follows oneandonlydean's review: on Windows a converted app0 module is
put ahead of the host library only for imports that name its library,
so a bundled module serves those imports, not every NID it exports.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Follows rooklz's review. The bullet now covers Windows and Linux only,
says the Windows stub looks up by symbol name before NID, and states
that Windows searches the host libSceLibcInternal.prx and libc.prx
before the bundled libc.prx for libSceLibcInternal imports, skipping
its exports that only return zero.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
An import binds to the first module that exports its NID. The Windows
entry stub searches converted app0 modules before libs, and on Linux the
guest modules loaded at startup come before the host libraries in
DT_NEEDED. A title that ships libc.prx therefore runs its own libc for
the NIDs that module exports.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The Windows and macOS branches and a hardware GPU's output are not
checked, and the list of required Vulkan items is kept in step with
VulkanDevice.cpp by hand.
List the controller vibration strength variable in the libScePad table with its default of 100, the paths it covers, the adaptive trigger effects it does not, and the error an invalid value raises.
Extends the entry by one sentence of counts: 13 of 53 local titles call both functions once each, from one wrapper in the title's library code that passes the operation as a byte and zeroes two arguments for operation 7. Counts and a description of the title code only; nothing is claimed about console behavior.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
The LncUtil collapsed dispatch entry, written by d4f2911b74 and
50c8103af2 (#9137), said its protected service implementations remain
unchanged. Of the functions whose signatures d4f2911b74 restored,
sceSystemServiceGetAppId answers for the running title since
7c83407e11 (#8354) and sceLncUtilGetAppId since 695041093b (#10801).
Only the status, GPU-crash, dialog-activation, shared-memory,
continue and VSH-ready calls still throw.
Follow the console libc.prx (PPSA02530) at 0xcb2d0: ignore the argument and throw the static bad_array_new_length object. Star Wars Racer (PPSA28416) imports it.