Skip to content

Commit fe4345d

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 0010ffe commit fe4345d

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
@@ -134,6 +134,35 @@ def DXSA_TessellatorPartitioningModeAttr :
134134
let assemblyFormat = "$value";
135135
}
136136

137+
def DXSA_InputPrimitive_Point : I32EnumAttrCase<"point", 1>;
138+
def DXSA_InputPrimitive_Line : I32EnumAttrCase<"line", 2>;
139+
def DXSA_InputPrimitive_Triangle : I32EnumAttrCase<"triangle", 3>;
140+
def DXSA_InputPrimitive_LineAdj : I32EnumAttrCase<"line_adj", 6>;
141+
def DXSA_InputPrimitive_TriangleAdj : I32EnumAttrCase<"triangle_adj", 7>;
142+
foreach i = !range(1, 33) in {
143+
def DXSA_InputPrimitive_Patch#i :
144+
I32EnumAttrCase<"patch" # i, !add(i, 7)>;
145+
}
146+
147+
def DXSA_InputPrimitive : I32EnumAttr<
148+
"InputPrimitive", "geometry shader input primitive type",
149+
!listconcat(
150+
[DXSA_InputPrimitive_Point,
151+
DXSA_InputPrimitive_Line,
152+
DXSA_InputPrimitive_Triangle,
153+
DXSA_InputPrimitive_LineAdj,
154+
DXSA_InputPrimitive_TriangleAdj],
155+
!foreach(i, !range(1, 33),
156+
!cast<I32EnumAttrCase>("DXSA_InputPrimitive_Patch" # i)))> {
157+
let cppNamespace = "::mlir::dxsa";
158+
let genSpecializedAttr = 0;
159+
}
160+
161+
def DXSA_InputPrimitiveAttr :
162+
EnumAttr<DXSADialect, DXSA_InputPrimitive, "input_primitive"> {
163+
let assemblyFormat = "$value";
164+
}
165+
137166
//===----------------------------------------------------------------------===//
138167
// DXSA op definitions
139168
//===----------------------------------------------------------------------===//
@@ -346,4 +375,20 @@ def DXSA_DclTessellatorPartitioning
346375
let assemblyFormat = "$partitioningMode attr-dict";
347376
}
348377

378+
def DXSA_DclInputPrimitive : DXSA_Op<"dcl_input_primitive"> {
379+
let summary = "declares the shader input primitive type";
380+
let description = [{
381+
The `dxsa.dcl_input_primitive` operation declares the input primitive
382+
type that the shader is invoked with.
383+
384+
Example:
385+
386+
```mlir
387+
dxsa.dcl_input_primitive triangle
388+
```
389+
}];
390+
let arguments = (ins DXSA_InputPrimitiveAttr:$type);
391+
let assemblyFormat = "$type attr-dict";
392+
}
393+
349394
#endif // DXSA_OPS

mlir/lib/Target/DXSA/BinaryParser.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,13 @@ class DXBuilder {
561561
partitioningModeAttr);
562562
}
563563

564+
Instruction buildDclInputPrimitive(dxsa::InputPrimitive inputPrimitive,
565+
Location loc) {
566+
auto inputPrimitiveAttr =
567+
dxsa::InputPrimitiveAttr::get(builder.getContext(), inputPrimitive);
568+
return dxsa::DclInputPrimitive::create(builder, loc, inputPrimitiveAttr);
569+
}
570+
564571
private:
565572
MLIRContext *context;
566573
ModuleOp module;
@@ -968,6 +975,15 @@ class Parser {
968975
return builder.buildDclTessellatorPartitioning(*partitioningMode, loc);
969976
}
970977

978+
FailureOr<Instruction> parseDclInputPrimitive(uint32_t opcodeToken,
979+
Location loc) {
980+
auto rawInputPrimitive = DECODE_D3D10_SB_GS_INPUT_PRIMITIVE(opcodeToken);
981+
auto inputPrimitive = dxsa::symbolizeInputPrimitive(rawInputPrimitive);
982+
if (!inputPrimitive)
983+
return emitError(loc, "unknown input primitive: ") << rawInputPrimitive;
984+
return builder.buildDclInputPrimitive(*inputPrimitive, loc);
985+
}
986+
971987
OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc,
972988
Instruction &out) {
973989
FailureOr<Instruction> result;
@@ -996,6 +1012,9 @@ class Parser {
9961012
case D3D10_SB_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY:
9971013
result = parseDclOutputTopology(opcodeToken, loc);
9981014
break;
1015+
case D3D10_SB_OPCODE_DCL_GS_INPUT_PRIMITIVE:
1016+
result = parseDclInputPrimitive(opcodeToken, loc);
1017+
break;
9991018
default:
10001019
return std::nullopt;
10011020
}
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)