diff options
author | Finn Plummer <finn.c.plum@gmail.com> | 2025-06-24 16:21:24 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-24 16:21:24 -0700 |
commit | e93a0d0d1ed790173e23247fa2833cdac30b8268 (patch) | |
tree | cdc16ea9ec3fa563493e07e973be2f4c7a144d81 /clang/lib/CodeGen/CGHLSLRuntime.cpp | |
parent | 52fbefb281ea59f061d5ce3725d57ae60640c71f (diff) | |
download | llvm-e93a0d0d1ed790173e23247fa2833cdac30b8268.zip llvm-e93a0d0d1ed790173e23247fa2833cdac30b8268.tar.gz llvm-e93a0d0d1ed790173e23247fa2833cdac30b8268.tar.bz2 |
[HLSL][RootSignature] Add `fdx-rootsignature-version` option to specify root signature version (#144813)
This pr provides the ability to specify the root signature version as a
compiler option and to retain this in the root signature decl.
It also updates the methods to serialize the version when dumping the
declaration and to output the version when generating the metadata.
- Update `DXContainer.hI` to define the root signature versions
- Update `Options.td` and `LangOpts.h` to define the
`fdx-rootsignature-version` compiler option
- Update `Options.td` to provide an alias `force-rootsig-ver` in
clang-dxc
- Update `Decl.[h|cpp]` and `SeamHLSL.cpp` so that `RootSignatureDecl`
will retain its version type
- Updates `CGHLSLRuntime.cpp` to generate the extra metadata field
- Add tests to illustrate
Resolves https://github.com/llvm/llvm-project/issues/126557.
Note: this does not implement validation based on versioning.
https://github.com/llvm/llvm-project/issues/129940 is required to
retrieve the version and use it for validations.
Diffstat (limited to 'clang/lib/CodeGen/CGHLSLRuntime.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGHLSLRuntime.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 3103f17..f2e992f 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -66,17 +66,16 @@ void addDxilValVersion(StringRef ValVersionStr, llvm::Module &M) { DXILValMD->addOperand(Val); } -void addRootSignature(ArrayRef<llvm::hlsl::rootsig::RootElement> Elements, +void addRootSignature(llvm::dxbc::RootSignatureVersion RootSigVer, + ArrayRef<llvm::hlsl::rootsig::RootElement> Elements, llvm::Function *Fn, llvm::Module &M) { auto &Ctx = M.getContext(); - llvm::hlsl::rootsig::MetadataBuilder Builder(Ctx, Elements); - MDNode *RootSignature = Builder.BuildRootSignature(); + llvm::hlsl::rootsig::MetadataBuilder RSBuilder(Ctx, Elements); + MDNode *RootSignature = RSBuilder.BuildRootSignature(); - // TODO: We need to wire the root signature version up through the frontend - // rather than hardcoding it. - ConstantAsMetadata *Version = - ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt32Ty(Ctx), 2)); + ConstantAsMetadata *Version = ConstantAsMetadata::get(ConstantInt::get( + llvm::Type::getInt32Ty(Ctx), llvm::to_underlying(RootSigVer))); MDNode *MDVals = MDNode::get(Ctx, {ValueAsMetadata::get(Fn), RootSignature, Version}); @@ -471,9 +470,11 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD, // Add and identify root signature to function, if applicable for (const Attr *Attr : FD->getAttrs()) { - if (const auto *RSAttr = dyn_cast<RootSignatureAttr>(Attr)) - addRootSignature(RSAttr->getSignatureDecl()->getRootElements(), EntryFn, + if (const auto *RSAttr = dyn_cast<RootSignatureAttr>(Attr)) { + auto *RSDecl = RSAttr->getSignatureDecl(); + addRootSignature(RSDecl->getVersion(), RSDecl->getRootElements(), EntryFn, M); + } } } |