Skip to content

Commit 18cd13c

Browse files
author
joaosaffran
committed
add root constant support
1 parent 398b9c5 commit 18cd13c

File tree

5 files changed

+107
-3
lines changed

5 files changed

+107
-3
lines changed

llvm/lib/Target/DirectX/DXILRootSignature.cpp

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ static bool reportError(LLVMContext *Ctx, Twine Message,
4343
static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
4444
MDNode *RootConstNode) {
4545
if (RootConstNode->getNumOperands() != 5)
46-
return reportError(Ctx, "Invalid format for RootFlag Element");
46+
return reportError(Ctx, "Invalid format for Root constants element");
4747

4848
dxbc::RootParameter NewParam;
4949
NewParam.ParameterType = dxbc::RootParameterType::Constants32Bit;
@@ -69,6 +69,8 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
6969
mdconst::extract<ConstantInt>(RootConstNode->getOperand(4));
7070
NewParam.Constants.Num32BitValues = Num32BitValues->getZExtValue();
7171

72+
RSD.Parameters.push_back(NewParam);
73+
7274
return false;
7375
}
7476

@@ -94,10 +96,12 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
9496
RootSignatureElementKind ElementKind =
9597
StringSwitch<RootSignatureElementKind>(ElementText->getString())
9698
.Case("RootFlags", RootSignatureElementKind::RootFlags)
99+
.Case("RootConstants", RootSignatureElementKind::RootConstants)
97100
.Default(RootSignatureElementKind::Error);
98101

99102
switch (ElementKind) {
100-
103+
case RootSignatureElementKind::RootConstants:
104+
return parseRootConstants(Ctx, RSD, Element);
101105
case RootSignatureElementKind::RootFlags:
102106
return parseRootFlags(Ctx, RSD, Element);
103107
case RootSignatureElementKind::Error:
@@ -241,6 +245,34 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
241245
OS << indent(Space) << "NumStaticSamplers: " << 0 << ":\n";
242246
OS << indent(Space) << "StaticSamplersOffset: "
243247
<< sizeof(RS.Header) + RS.Parameters.size_in_bytes() << ":\n";
248+
249+
OS << indent(Space) << "- Parameters: \n";
250+
Space++;
251+
for (const auto &Param : RS.Parameters) {
252+
OS << indent(Space) << "Type: " << &Param.ParameterType << " \n";
253+
OS << indent(Space) << "ShaderVisibility: " << &Param.ShaderVisibility
254+
<< " \n";
255+
Space++;
256+
257+
switch (Param.ParameterType) {
258+
259+
case dxbc::RootParameterType::Constants32Bit: {
260+
OS << indent(Space) << "- Constants: \n";
261+
Space++;
262+
OS << indent(Space)
263+
<< "RegisterSpace: " << &Param.Constants.RegisterSpace << " \n";
264+
OS << indent(Space)
265+
<< "ShaderRegister: " << &Param.Constants.ShaderRegister << " \n";
266+
OS << indent(Space)
267+
<< "Num32BitValues: " << &Param.Constants.Num32BitValues << " \n";
268+
Space--;
269+
} break;
270+
case dxbc::RootParameterType::Empty:
271+
break;
272+
}
273+
Space--;
274+
}
275+
Space--;
244276
Space--;
245277
// end root signature header
246278
}

llvm/lib/Target/DirectX/DXILRootSignature.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "llvm/ADT/DenseMap.h"
1515
#include "llvm/Analysis/DXILMetadataAnalysis.h"
16+
#include "llvm/BinaryFormat/DXContainer.h"
1617
#include "llvm/IR/DiagnosticInfo.h"
1718
#include "llvm/IR/Metadata.h"
1819
#include "llvm/IR/Module.h"
@@ -24,7 +25,11 @@
2425
namespace llvm {
2526
namespace dxil {
2627

27-
enum class RootSignatureElementKind { Error = 0, RootFlags = 1 };
28+
enum class RootSignatureElementKind {
29+
Error = 0,
30+
RootFlags = 1,
31+
RootConstants = 2
32+
};
2833
class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
2934
friend AnalysisInfoMixin<RootSignatureAnalysis>;
3035
static AnalysisKey Key;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
2+
3+
; CHECK: error: Invalid format for Root constants element
4+
; CHECK-NOT: Root Signature Definitions
5+
target triple = "dxil-unknown-shadermodel6.0-compute"
6+
7+
define void @main() #0 {
8+
entry:
9+
ret void
10+
}
11+
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
12+
13+
14+
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
15+
!2 = !{ ptr @main, !3 } ; function, root signature
16+
!3 = !{ !4 } ; list of root signature elements
17+
!4 = !{ !"RootConstants", i32 0, i32 1, i32 2 }
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
2+
3+
; CHECK: error: Invalid shader visibility flag value in root constant.
4+
; CHECK-NOT: Root Signature Definitions
5+
target triple = "dxil-unknown-shadermodel6.0-compute"
6+
7+
define void @main() #0 {
8+
entry:
9+
ret void
10+
}
11+
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
12+
13+
14+
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
15+
!2 = !{ ptr @main, !3 } ; function, root signature
16+
!3 = !{ !4 } ; list of root signature elements
17+
!4 = !{ !"RootConstants", i32 666, i32 1, i32 2, i32 3 }
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
2+
; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
3+
4+
target triple = "dxil-unknown-shadermodel6.0-compute"
5+
6+
; CHECK: @dx.rts0 = private constant [48 x i8] c"{{.*}}", section "RTS0", align 4
7+
8+
define void @main() #0 {
9+
entry:
10+
ret void
11+
}
12+
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
13+
14+
15+
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
16+
!2 = !{ ptr @main, !3 } ; function, root signature
17+
!3 = !{ !4 } ; list of root signature elements
18+
!4 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
19+
20+
21+
; DXC: - Name: RTS0
22+
; DXC-NEXT: Size: 48
23+
; DXC-NEXT: RootSignature:
24+
; DXC-NEXT: Version: 2
25+
; DXC-NEXT: NumStaticSamplers: 0
26+
; DXC-NEXT: StaticSamplersOffset: 44
27+
; DXC-NEXT: Parameters:
28+
; DXC-NEXT: - ParameterType: Constants32Bit
29+
; DXC-NEXT: ShaderVisibility: All
30+
; DXC-NEXT: Constants:
31+
; DXC-NEXT: Num32BitValues: 3
32+
; DXC-NEXT: RegisterSpace: 2
33+
; DXC-NEXT: ShaderRegister: 1

0 commit comments

Comments
 (0)