1515
1616#include " dxc/DXIL/DxilConstants.h"
1717#include " dxc/DXIL/DxilTypeSystem.h"
18+ #include " dxc/Support/SPIRVOptions.h"
1819#include " clang/AST/Expr.h"
1920#include " clang/AST/HlslTypes.h"
2021#include " clang/SPIRV/AstTypeProbe.h"
@@ -2506,6 +2507,17 @@ bool DeclResultIdMapper::decorateResourceBindings() {
25062507
25072508 BindingSet bindingSet;
25082509
2510+ // If some bindings are reserved for heaps, mark those are used.
2511+ if (spirvOptions.resourceHeapBinding )
2512+ bindingSet.useBinding (spirvOptions.resourceHeapBinding ->binding ,
2513+ spirvOptions.resourceHeapBinding ->set );
2514+ if (spirvOptions.samplerHeapBinding )
2515+ bindingSet.useBinding (spirvOptions.samplerHeapBinding ->binding ,
2516+ spirvOptions.samplerHeapBinding ->set );
2517+ if (spirvOptions.counterHeapBinding )
2518+ bindingSet.useBinding (spirvOptions.counterHeapBinding ->binding ,
2519+ spirvOptions.counterHeapBinding ->set );
2520+
25092521 // Decorates the given varId of the given category with set number
25102522 // setNo, binding number bindingNo. Ignores overlaps.
25112523 const auto tryToDecorate = [this , &bindingSet](const ResourceVar &var,
@@ -2698,6 +2710,15 @@ bool DeclResultIdMapper::decorateResourceBindings() {
26982710 return true ;
26992711}
27002712
2713+ SpirvCodeGenOptions::BindingInfo DeclResultIdMapper::getBindingInfo (
2714+ BindingSet &bindingSet,
2715+ const std::optional<SpirvCodeGenOptions::BindingInfo> &userProvidedInfo) {
2716+ if (userProvidedInfo.has_value ()) {
2717+ return *userProvidedInfo;
2718+ }
2719+ return {bindingSet.useNextBinding (0 ), /* set= */ 0 };
2720+ }
2721+
27012722void DeclResultIdMapper::decorateResourceHeapsBindings (BindingSet &bindingSet) {
27022723 bool hasResource = false ;
27032724 bool hasSamplers = false ;
@@ -2725,12 +2746,21 @@ void DeclResultIdMapper::decorateResourceHeapsBindings(BindingSet &bindingSet) {
27252746 // Allocate bindings only for used resources. The order of this allocation is
27262747 // important:
27272748 // - First resource heaps, then sampler heaps, and finally counter heaps.
2728- const uint32_t resourceBinding =
2729- hasResource ? bindingSet.useNextBinding (0 ) : 0 ;
2730- const uint32_t samplersBinding =
2731- hasSamplers ? bindingSet.useNextBinding (0 ) : 0 ;
2732- const uint32_t countersBinding =
2733- hasCounters ? bindingSet.useNextBinding (0 ) : 0 ;
2749+ SpirvCodeGenOptions::BindingInfo resourceBinding = {/* binding= */ 0 ,
2750+ /* set= */ 0 };
2751+ SpirvCodeGenOptions::BindingInfo samplersBinding = {/* binding= */ 0 ,
2752+ /* set= */ 0 };
2753+ SpirvCodeGenOptions::BindingInfo countersBinding = {/* binding= */ 0 ,
2754+ /* set= */ 0 };
2755+ if (hasResource)
2756+ resourceBinding =
2757+ getBindingInfo (bindingSet, spirvOptions.resourceHeapBinding );
2758+ if (hasSamplers)
2759+ samplersBinding =
2760+ getBindingInfo (bindingSet, spirvOptions.samplerHeapBinding );
2761+ if (hasCounters)
2762+ countersBinding =
2763+ getBindingInfo (bindingSet, spirvOptions.counterHeapBinding );
27342764
27352765 for (const auto &var : resourceVars) {
27362766 if (!var.getDeclaration ())
@@ -2739,13 +2769,14 @@ void DeclResultIdMapper::decorateResourceHeapsBindings(BindingSet &bindingSet) {
27392769 if (!decl)
27402770 continue ;
27412771
2742- if (isResourceDescriptorHeap (decl->getType ()))
2743- spvBuilder.decorateDSetBinding (var.getSpirvInstr (), /* set= */ 0 ,
2744- var.isCounter () ? countersBinding
2745- : resourceBinding);
2746- else if (isSamplerDescriptorHeap (decl->getType ()))
2747- spvBuilder.decorateDSetBinding (var.getSpirvInstr (), /* set= */ 0 ,
2748- samplersBinding);
2772+ const bool isResourceHeap = isResourceDescriptorHeap (decl->getType ());
2773+ const bool isSamplerHeap = isSamplerDescriptorHeap (decl->getType ());
2774+ if (!isSamplerHeap && !isResourceHeap)
2775+ continue ;
2776+ const SpirvCodeGenOptions::BindingInfo &info =
2777+ isSamplerHeap ? samplersBinding
2778+ : (var.isCounter () ? countersBinding : resourceBinding);
2779+ spvBuilder.decorateDSetBinding (var.getSpirvInstr (), info.set , info.binding );
27492780 }
27502781}
27512782
0 commit comments