D690 - A module samples only the one bound texture
Status: assumed Date: 2026-09-15
Every image sample in a translated module reads the one sampled image the pipeline bound. A sample naming a different descriptor register range from the first, or following a write into a recorded range, is refused at translation.
Why: mapping every sample onto whatever is bound renders a frame that looks right and is not. Resolving a descriptor properly needs a decoder, a surface cache, a format table and an upload path, a subsystem rather than a prerequisite for one instruction. Register identity with write invalidation is the strongest claim available without decoding, and its false refusals err on the safe side.
Rejected:
- Mapping every sample to the bound texture: plausible wrong frames.
- Decoding the descriptor first: a subsystem built blind.
- Counting distinct textures: needs the decoder that does not exist.
A pixel shader may sample thirty-two textures, at bindings 2, 4, then
7 to 36, each slot found where its descriptor came from: PPSA02664's
pixel shader samples three, PPSA03416's more than four, Grand Theft Auto
V's shadow shaders more than sixteen. Sixteen is the least one stage may
reach on every Vulkan device (the required minimum of
maxPerStageDescriptorSampledImages and
maxPerStageDescriptorSamplers); the desktop devices
orbistoun runs on allow far more. One image read through two samplers
takes two slots, each with its own sampler. A thirty-third is refused,
as is a second or later texture when any descriptor came from neither
the table nor the user data. A primitive shader's images take the last
eight slots, 24 to 31, so they never share one with the pixel shader
drawn beside it: Grand Theft Auto V's vertex programs fetch and sample
at a named level there. Only a pixel shader samples at the level
derivatives choose.