Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,35 @@ def DXSA_TessellatorPartitioningModeAttr :
let assemblyFormat = "$value";
}

def DXSA_InputPrimitive_Point : I32EnumAttrCase<"point", 1>;
def DXSA_InputPrimitive_Line : I32EnumAttrCase<"line", 2>;
def DXSA_InputPrimitive_Triangle : I32EnumAttrCase<"triangle", 3>;
def DXSA_InputPrimitive_LineAdj : I32EnumAttrCase<"line_adj", 6>;
def DXSA_InputPrimitive_TriangleAdj : I32EnumAttrCase<"triangle_adj", 7>;
foreach i = !range(1, 33) in {
def DXSA_InputPrimitive_Patch#i :
I32EnumAttrCase<"patch" # i, !add(i, 7)>;
}

def DXSA_InputPrimitive : I32EnumAttr<
"InputPrimitive", "geometry shader input primitive type",
!listconcat(
[DXSA_InputPrimitive_Point,
DXSA_InputPrimitive_Line,
DXSA_InputPrimitive_Triangle,
DXSA_InputPrimitive_LineAdj,
DXSA_InputPrimitive_TriangleAdj],
!foreach(i, !range(1, 33),
!cast<I32EnumAttrCase>("DXSA_InputPrimitive_Patch" # i)))> {
let cppNamespace = "::mlir::dxsa";
let genSpecializedAttr = 0;
}

def DXSA_InputPrimitiveAttr :
EnumAttr<DXSADialect, DXSA_InputPrimitive, "input_primitive"> {
let assemblyFormat = "$value";
}

//===----------------------------------------------------------------------===//
// DXSA op definitions
//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -346,4 +375,20 @@ def DXSA_DclTessellatorPartitioning
let assemblyFormat = "$partitioningMode attr-dict";
}

def DXSA_DclInputPrimitive : DXSA_Op<"dcl_input_primitive"> {
let summary = "declares the shader input primitive type";
let description = [{
The `dxsa.dcl_input_primitive` operation declares the input primitive
type that the shader is invoked with.

Example:

```mlir
dxsa.dcl_input_primitive triangle
```
}];
let arguments = (ins DXSA_InputPrimitiveAttr:$type);
let assemblyFormat = "$type attr-dict";
}

#endif // DXSA_OPS
19 changes: 19 additions & 0 deletions mlir/lib/Target/DXSA/BinaryParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,13 @@ class DXBuilder {
partitioningModeAttr);
}

Instruction buildDclInputPrimitive(dxsa::InputPrimitive inputPrimitive,
Location loc) {
auto inputPrimitiveAttr =
dxsa::InputPrimitiveAttr::get(builder.getContext(), inputPrimitive);
return dxsa::DclInputPrimitive::create(builder, loc, inputPrimitiveAttr);
}

private:
MLIRContext *context;
ModuleOp module;
Expand Down Expand Up @@ -968,6 +975,15 @@ class Parser {
return builder.buildDclTessellatorPartitioning(*partitioningMode, loc);
}

FailureOr<Instruction> parseDclInputPrimitive(uint32_t opcodeToken,
Location loc) {
auto rawInputPrimitive = DECODE_D3D10_SB_GS_INPUT_PRIMITIVE(opcodeToken);
auto inputPrimitive = dxsa::symbolizeInputPrimitive(rawInputPrimitive);
if (!inputPrimitive)
return emitError(loc, "unknown input primitive: ") << rawInputPrimitive;
return builder.buildDclInputPrimitive(*inputPrimitive, loc);
}

OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc,
Instruction &out) {
FailureOr<Instruction> result;
Expand Down Expand Up @@ -996,6 +1012,9 @@ class Parser {
case D3D10_SB_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY:
result = parseDclOutputTopology(opcodeToken, loc);
break;
case D3D10_SB_OPCODE_DCL_GS_INPUT_PRIMITIVE:
result = parseDclInputPrimitive(opcodeToken, loc);
break;
default:
return std::nullopt;
}
Expand Down
41 changes: 41 additions & 0 deletions mlir/test/Target/DXSA/dcl_input_primitive.mlir
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_input_primitive.bin | FileCheck %s

// CHECK: module {
// CHECK-NEXT: dxsa.dcl_input_primitive point
// CHECK-NEXT: dxsa.dcl_input_primitive line
// CHECK-NEXT: dxsa.dcl_input_primitive triangle
// CHECK-NEXT: dxsa.dcl_input_primitive line_adj
// CHECK-NEXT: dxsa.dcl_input_primitive triangle_adj
// CHECK-NEXT: dxsa.dcl_input_primitive patch1
// CHECK-NEXT: dxsa.dcl_input_primitive patch2
// CHECK-NEXT: dxsa.dcl_input_primitive patch3
// CHECK-NEXT: dxsa.dcl_input_primitive patch4
// CHECK-NEXT: dxsa.dcl_input_primitive patch5
// CHECK-NEXT: dxsa.dcl_input_primitive patch6
// CHECK-NEXT: dxsa.dcl_input_primitive patch7
// CHECK-NEXT: dxsa.dcl_input_primitive patch8
// CHECK-NEXT: dxsa.dcl_input_primitive patch9
// CHECK-NEXT: dxsa.dcl_input_primitive patch10
// CHECK-NEXT: dxsa.dcl_input_primitive patch11
// CHECK-NEXT: dxsa.dcl_input_primitive patch12
// CHECK-NEXT: dxsa.dcl_input_primitive patch13
// CHECK-NEXT: dxsa.dcl_input_primitive patch14
// CHECK-NEXT: dxsa.dcl_input_primitive patch15
// CHECK-NEXT: dxsa.dcl_input_primitive patch16
// CHECK-NEXT: dxsa.dcl_input_primitive patch17
// CHECK-NEXT: dxsa.dcl_input_primitive patch18
// CHECK-NEXT: dxsa.dcl_input_primitive patch19
// CHECK-NEXT: dxsa.dcl_input_primitive patch20
// CHECK-NEXT: dxsa.dcl_input_primitive patch21
// CHECK-NEXT: dxsa.dcl_input_primitive patch22
// CHECK-NEXT: dxsa.dcl_input_primitive patch23
// CHECK-NEXT: dxsa.dcl_input_primitive patch24
// CHECK-NEXT: dxsa.dcl_input_primitive patch25
// CHECK-NEXT: dxsa.dcl_input_primitive patch26
// CHECK-NEXT: dxsa.dcl_input_primitive patch27
// CHECK-NEXT: dxsa.dcl_input_primitive patch28
// CHECK-NEXT: dxsa.dcl_input_primitive patch29
// CHECK-NEXT: dxsa.dcl_input_primitive patch30
// CHECK-NEXT: dxsa.dcl_input_primitive patch31
// CHECK-NEXT: dxsa.dcl_input_primitive patch32
// CHECK-NEXT: }
Binary file added mlir/test/Target/DXSA/inputs/dcl_input_primitive.bin
Binary file not shown.