fix(rt): split Sponza's combined image sampler into a heap texture and sampler
examples/Sponza no longer built natively (#164). Its closest-hit declared a descriptor_heap sampler2D, which glslang has rejected since c8253623 ("Reject descriptor_heap combined image samplers"), and main.cpp wrote it through VkResourceDescriptorDataEXT::pCombinedImageSampler, which that union no longer has: the descriptor heap has no combined image samplers. Both went unnoticed because nothing builds the examples. Sponza - closesthit.glsl declares texture2D and sampler heap arrays and joins them where it samples, as ui-shared.glsl and HeapDynamicIndexHit do. The sampler slot is a second spec constant beside the image slot, so the shader assumes nothing about where the host put it, and a constant index keeps the example running on NVIDIA 610.43.02 (see its README). The comment no longer says the image slot is offset by bufferStartElement; only buffer slots are. - main.cpp gives the heap a sampler slot, writes the albedo as a SAMPLED_IMAGE from a view create-info, and writes the sampler into the sampler heap from a VkSamplerCreateInfo with vkWriteSamplerDescriptorsEXT, as UIRenderer::RegisterSampler does. SamplerVulkan's VkSampler had no use left. The sampler keeps its linear filtering and repeat addressing and drops anisotropy, which a hit shader cannot use: it samples at LOD 0, without derivatives. Docs - README.md and examples/Sponza/README.md quote the new declarations, and the Sponza README says why the texture and the sampler are two descriptors. Its texture2DArray materials pattern declared a descriptor_heap sampler2DArray, which glslang rejects as well; it now joins a texture2DArray and a sampler. - examples/SponzaBench/README.md drops its caveat that Sponza does not compile. Tests - ExampleShaders compiles every GLSL shader under examples/ with glslang as crafter-build does for the example (Vulkan rules, SPIR-V 1.4, shaders/ on the include path, and the descriptor-set build where the example registers one), so a glslang that starts rejecting one fails a test rather than an example build nobody runs. It fails on Sponza's old closest-hit and needs glslang only. Closes #164. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
c97a3048fb
commit
6e94cc6209
7 changed files with 230 additions and 40 deletions
|
|
@ -59,7 +59,8 @@ shaded through an intersection shader with an any-hit cut-out.
|
|||
> in a closest-hit, including different descriptors in neighbouring lanes of
|
||||
> a wave. The rest of this note applies to the older drivers. A **constant / spec-constant**
|
||||
> index is fine (that's why [Sponza](examples/Sponza/README.md)'s
|
||||
> closest-hit reads `albedo[albedoSlot]` through a spec constant), and
|
||||
> closest-hit reads `textures[albedoSlot]` and `samplers[samplerSlot]`
|
||||
> through spec constants), and
|
||||
> the identical dynamic pattern works in fragment shaders (the UI
|
||||
> renderer indexes `uiTextures[]` by per-item runtime slots) — so this
|
||||
> is **RT-stage-specific**, not a general heap problem. Unlike the
|
||||
|
|
|
|||
Loading…
Reference in a new issue