[llvm-branch-commits] [clang] [HLSL] Add binding attributes to resources from structs (PR #184731)
Helena Kotas via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Mar 9 13:51:12 PDT 2026
================
@@ -4448,13 +4475,99 @@ void SemaHLSL::deduceAddressSpace(VarDecl *Decl) {
namespace {
+// Helper class for assigning bindings to resources declared within a struct.
+// It keeps track of all binding attributes declared on a struct instance, and
+// the offsets for each register type that have been assigned so far.
+// Handles both explicit and implicit bindings.
+class StructBindingContext {
+ // Bindings and offsets per register type. We only need to support four
+ // register types - SRV (u), UAV (t), CBuffer (c), and Sampler (s).
+ HLSLResourceBindingAttr *RegBindingsAttrs[4];
+ unsigned RegBindingOffset[4];
+
+ // Vulkan binding attribute does not vary by register type.
+ HLSLVkBindingAttr *VkBindingAttr;
+ unsigned VkBindingOffset;
+
+public:
+ // Constructor: gather all binding attributes on a struct instance and
+ // initialize offsets.
+ StructBindingContext(VarDecl *VD) {
+ for (unsigned i = 0; i < 4; ++i) {
+ RegBindingsAttrs[i] = nullptr;
+ RegBindingOffset[i] = 0;
+ }
+ VkBindingAttr = nullptr;
+ VkBindingOffset = 0;
+
+ ASTContext &AST = VD->getASTContext();
+ bool IsSpirv = AST.getTargetInfo().getTriple().isSPIRV();
+
+ for (Attr *A : VD->attrs()) {
+ if (auto *RBA = dyn_cast<HLSLResourceBindingAttr>(A)) {
+ RegisterType RegType = RBA->getRegisterType();
+ unsigned RegTypeIdx = static_cast<unsigned>(RegType);
+ // Ignore unsupported register annotations, such as 'c' or 'i'.
+ if (RegTypeIdx < 4)
+ RegBindingsAttrs[RegTypeIdx] = RBA;
+ continue;
+ }
+ // Gather the Vulkan binding attributes only if the target is SPIR-V.
----------------
hekota wrote:
No, we still need to collect those because if the target is SPIR-V, and there is no `HLSLVkBindingAttr` attribute, the compiler falls back to the `HLSLResourceBindingAttrs` values for the binding.
https://github.com/llvm/llvm-project/pull/184731
More information about the llvm-branch-commits
mailing list