diff --git a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td index d6f4147be226..38daffa7cae3 100644 --- a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td +++ b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td @@ -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("DXSA_InputPrimitive_Patch" # i)))> { + let cppNamespace = "::mlir::dxsa"; + let genSpecializedAttr = 0; +} + +def DXSA_InputPrimitiveAttr : + EnumAttr { + let assemblyFormat = "$value"; +} + //===----------------------------------------------------------------------===// // DXSA op definitions //===----------------------------------------------------------------------===// @@ -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 diff --git a/mlir/lib/Target/DXSA/BinaryParser.cpp b/mlir/lib/Target/DXSA/BinaryParser.cpp index 81019067e5a0..2258046f6ed9 100644 --- a/mlir/lib/Target/DXSA/BinaryParser.cpp +++ b/mlir/lib/Target/DXSA/BinaryParser.cpp @@ -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; @@ -968,6 +975,15 @@ class Parser { return builder.buildDclTessellatorPartitioning(*partitioningMode, loc); } + FailureOr 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 result; @@ -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; } diff --git a/mlir/test/Target/DXSA/dcl_input_primitive.mlir b/mlir/test/Target/DXSA/dcl_input_primitive.mlir new file mode 100644 index 000000000000..886157b1fc76 --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_input_primitive.mlir @@ -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: } diff --git a/mlir/test/Target/DXSA/inputs/dcl_input_primitive.bin b/mlir/test/Target/DXSA/inputs/dcl_input_primitive.bin new file mode 100644 index 000000000000..ecdd641567f2 Binary files /dev/null and b/mlir/test/Target/DXSA/inputs/dcl_input_primitive.bin differ