D109 - The GPU is probed by executing shaders and reading the result bits, not by calling an API

The GPU is probed by executing shaders and reading the result bits, not by calling an API. The oracle is the device, and the device name is its provenance.

Status: derived - a compute dispatch runs end to end and the pipeline self-check passes.

obSCEne now has a 160-gpu section that dispatches a compute shader over known inputs and reads the results back (obs_gpu_run). This answers the one question the behavioural sections cannot: not what a function returns, but what an instruction computes - which is what an emulator's shader translation must be checked against and cannot answer about itself.

Two layers, and this is the one that matters

"GPU calls" splits in two. The Sony GPU API (sceGnm*/sceAgc*) is ordinary functions, probed the CPU-NID way, and is console-only. GPU execution - run a kernel, read the bits - is not a function call at all, and it is where shader gaps are closed. This section is the execution layer. On a Steam Deck's gfx1033 (and a console) the read-back bits are RDNA2 ground truth; the API layer is a later, smaller, console-only addition.

The backend split, same as net and sink

gpu_vulkan.c (host and Deck native) talks standard public Vulkan compute - no vendor anything. gpu_gnm.c (console module) refuses until the Gnm/Agc submission format is confirmed, exactly as net_target.c began. Chosen by the build's source list, never a #if. The section compiles in every build and skips when the backend is absent, so the capability never silently disappears and the check count does not move with the flag.

Provenance is the whole point

A result from llvmpipe (Mesa's software Vulkan, in the build VM) and one from real RDNA2 are the same code on a different device - and must never be confused. Every run emits a gpudev record naming the backend and device, and the check provenance stays derived rather than hardware because whether a result is silicon is a run-time fact about the device, not a compile-time property of the check. The pipeline self-check ran on llvmpipe and reported gpudev|vulkan|llvmpipe (LLVM 20.1.2); the Deck will report its gfx1033, and only then is it hardware.

Proven, and what it showed

The double kernel (exact x*2) passed - the instrument is sound. The rcp kernel emitted 1/3 -> 0x3eaaaaab on llvmpipe (correctly-rounded). Real RDNA2's v_rcp refinement may land a ULP away, and that difference - recorded, device-labelled, diffed by the consumer - is the reason the oracle exists. Shaders are embedded as SPIR-V by scripts/gen_shaders.py into a committed header, so the build needs no shader compiler; only regeneration does.

Two Werror snags worth remembering: Vulkan under -Wconversion needs deliberate casts on every size, and a generated banner containing src/shaders/* tripped -Wcomment on the /* inside a block comment.