Skip to content

Commit 2ace80a

Browse files
committed
[mlir][dxsa] Add dcl_input_primitive instruction
Example: dxsa.dcl_input_primitive triangle Signed-off-by: Vladimir Shiryaev <tagolog@users.noreply.github.com>
1 parent 856b5d3 commit 2ace80a

4 files changed

Lines changed: 105 additions & 0 deletions

File tree

mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,35 @@ def DXSA_GlobalFlagsAttr :
6262
let assemblyFormat = "`<` $value `>`";
6363
}
6464

65+
def DXSA_InputPrimitive_Point : I32EnumAttrCase<"point", 1>;
66+
def DXSA_InputPrimitive_Line : I32EnumAttrCase<"line", 2>;
67+
def DXSA_InputPrimitive_Triangle : I32EnumAttrCase<"triangle", 3>;
68+
def DXSA_InputPrimitive_LineAdj : I32EnumAttrCase<"line_adj", 6>;
69+
def DXSA_InputPrimitive_TriangleAdj : I32EnumAttrCase<"triangle_adj", 7>;
70+
foreach i = !range(1, 33) in {
71+
def DXSA_InputPrimitive_Patch#i :
72+
I32EnumAttrCase<"patch" # i, !add(i, 7)>;
73+
}
74+
75+
def DXSA_InputPrimitive : I32EnumAttr<
76+
"InputPrimitive", "geometry shader input primitive type",
77+
!listconcat(
78+
[DXSA_InputPrimitive_Point,
79+
DXSA_InputPrimitive_Line,
80+
DXSA_InputPrimitive_Triangle,
81+
DXSA_InputPrimitive_LineAdj,
82+
DXSA_InputPrimitive_TriangleAdj],
83+
!foreach(i, !range(1, 33),
84+
!cast<I32EnumAttrCase>("DXSA_InputPrimitive_Patch" # i)))> {
85+
let cppNamespace = "::mlir::dxsa";
86+
let genSpecializedAttr = 0;
87+
}
88+
89+
def DXSA_InputPrimitiveAttr :
90+
EnumAttr<DXSADialect, DXSA_InputPrimitive, "input_primitive"> {
91+
let assemblyFormat = "$value";
92+
}
93+
6594
//===----------------------------------------------------------------------===//
6695
// DXSA op definitions
6796
//===----------------------------------------------------------------------===//
@@ -158,4 +187,20 @@ def DXSA_DclTemps : DXSA_Op<"dcl_temps"> {
158187
let assemblyFormat = [{ $count attr-dict }];
159188
}
160189

190+
def DXSA_DclInputPrimitive : DXSA_Op<"dcl_input_primitive"> {
191+
let summary = "declares the shader input primitive type";
192+
let description = [{
193+
The `dxsa.dcl_input_primitive` operation declares the input primitive
194+
type that the shader is invoked with.
195+
196+
Example:
197+
198+
```mlir
199+
dxsa.dcl_input_primitive triangle
200+
```
201+
}];
202+
let arguments = (ins DXSA_InputPrimitiveAttr:$type);
203+
let assemblyFormat = "$type attr-dict";
204+
}
205+
161206
#endif // DXSA_OPS

mlir/lib/Target/DXSA/BinaryParser.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,13 @@ class DXBuilder {
516516
builder.getI32IntegerAttr(count));
517517
}
518518

519+
Instruction buildDclInputPrimitive(dxsa::InputPrimitive inputPrimitive,
520+
Location loc) {
521+
auto inputPrimitiveAttr =
522+
dxsa::InputPrimitiveAttr::get(builder.getContext(), inputPrimitive);
523+
return dxsa::DclInputPrimitive::create(builder, loc, inputPrimitiveAttr);
524+
}
525+
519526
private:
520527
MLIRContext *context;
521528
ModuleOp module;
@@ -831,6 +838,15 @@ class Parser {
831838
return builder.buildDclTemps(count, loc);
832839
}
833840

841+
FailureOr<Instruction> parseDclInputPrimitive(uint32_t opcodeToken,
842+
Location loc) {
843+
auto rawInputPrimitive = DECODE_D3D10_SB_GS_INPUT_PRIMITIVE(opcodeToken);
844+
auto inputPrimitive = dxsa::symbolizeInputPrimitive(rawInputPrimitive);
845+
if (!inputPrimitive)
846+
return emitError(loc, "unknown input primitive: ") << rawInputPrimitive;
847+
return builder.buildDclInputPrimitive(*inputPrimitive, loc);
848+
}
849+
834850
OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc,
835851
Instruction &out) {
836852
FailureOr<Instruction> result;
@@ -841,6 +857,9 @@ class Parser {
841857
case D3D10_SB_OPCODE_DCL_TEMPS:
842858
result = parseDclTemps(loc);
843859
break;
860+
case D3D10_SB_OPCODE_DCL_GS_INPUT_PRIMITIVE:
861+
result = parseDclInputPrimitive(opcodeToken, loc);
862+
break;
844863
default:
845864
return std::nullopt;
846865
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_input_primitive.bin | FileCheck %s
2+
3+
// CHECK: module {
4+
// CHECK-NEXT: dxsa.dcl_input_primitive point
5+
// CHECK-NEXT: dxsa.dcl_input_primitive line
6+
// CHECK-NEXT: dxsa.dcl_input_primitive triangle
7+
// CHECK-NEXT: dxsa.dcl_input_primitive line_adj
8+
// CHECK-NEXT: dxsa.dcl_input_primitive triangle_adj
9+
// CHECK-NEXT: dxsa.dcl_input_primitive patch1
10+
// CHECK-NEXT: dxsa.dcl_input_primitive patch2
11+
// CHECK-NEXT: dxsa.dcl_input_primitive patch3
12+
// CHECK-NEXT: dxsa.dcl_input_primitive patch4
13+
// CHECK-NEXT: dxsa.dcl_input_primitive patch5
14+
// CHECK-NEXT: dxsa.dcl_input_primitive patch6
15+
// CHECK-NEXT: dxsa.dcl_input_primitive patch7
16+
// CHECK-NEXT: dxsa.dcl_input_primitive patch8
17+
// CHECK-NEXT: dxsa.dcl_input_primitive patch9
18+
// CHECK-NEXT: dxsa.dcl_input_primitive patch10
19+
// CHECK-NEXT: dxsa.dcl_input_primitive patch11
20+
// CHECK-NEXT: dxsa.dcl_input_primitive patch12
21+
// CHECK-NEXT: dxsa.dcl_input_primitive patch13
22+
// CHECK-NEXT: dxsa.dcl_input_primitive patch14
23+
// CHECK-NEXT: dxsa.dcl_input_primitive patch15
24+
// CHECK-NEXT: dxsa.dcl_input_primitive patch16
25+
// CHECK-NEXT: dxsa.dcl_input_primitive patch17
26+
// CHECK-NEXT: dxsa.dcl_input_primitive patch18
27+
// CHECK-NEXT: dxsa.dcl_input_primitive patch19
28+
// CHECK-NEXT: dxsa.dcl_input_primitive patch20
29+
// CHECK-NEXT: dxsa.dcl_input_primitive patch21
30+
// CHECK-NEXT: dxsa.dcl_input_primitive patch22
31+
// CHECK-NEXT: dxsa.dcl_input_primitive patch23
32+
// CHECK-NEXT: dxsa.dcl_input_primitive patch24
33+
// CHECK-NEXT: dxsa.dcl_input_primitive patch25
34+
// CHECK-NEXT: dxsa.dcl_input_primitive patch26
35+
// CHECK-NEXT: dxsa.dcl_input_primitive patch27
36+
// CHECK-NEXT: dxsa.dcl_input_primitive patch28
37+
// CHECK-NEXT: dxsa.dcl_input_primitive patch29
38+
// CHECK-NEXT: dxsa.dcl_input_primitive patch30
39+
// CHECK-NEXT: dxsa.dcl_input_primitive patch31
40+
// CHECK-NEXT: dxsa.dcl_input_primitive patch32
41+
// CHECK-NEXT: }
148 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)