Skip to content

Commit 00a163e

Browse files
committed
[mlir][dxsa] Add dcl_tessellator_partitioning instruction
Example: dxsa.dcl_tessellator_partitioning partitioning_integer Signed-off-by: Vladimir Shiryaev <tagolog@users.noreply.github.com>
1 parent 47303ee commit 00a163e

4 files changed

Lines changed: 70 additions & 0 deletions

File tree

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,28 @@ def DXSA_GlobalFlagsAttr :
5151
let assemblyFormat = "`<` $value `>`";
5252
}
5353

54+
def DXSA_TessellatorPartitioningMode_Integer : I32EnumAttrCase<"partitioning_integer", 1>;
55+
def DXSA_TessellatorPartitioningMode_Pow2 : I32EnumAttrCase<"partitioning_pow2", 2>;
56+
def DXSA_TessellatorPartitioningMode_FractionalOdd : I32EnumAttrCase<"partitioning_fractional_odd", 3>;
57+
def DXSA_TessellatorPartitioningMode_FractionalEven : I32EnumAttrCase<"partitioning_fractional_even", 4>;
58+
59+
def DXSA_TessellatorPartitioningMode : I32EnumAttr<
60+
"TessellatorPartitioningMode", "tessellator partitioning mode", [
61+
DXSA_TessellatorPartitioningMode_Integer,
62+
DXSA_TessellatorPartitioningMode_Pow2,
63+
DXSA_TessellatorPartitioningMode_FractionalOdd,
64+
DXSA_TessellatorPartitioningMode_FractionalEven
65+
]> {
66+
let cppNamespace = "::mlir::dxsa";
67+
let genSpecializedAttr = 0;
68+
}
69+
70+
def DXSA_TessellatorPartitioningModeAttr :
71+
EnumAttr<DXSADialect, DXSA_TessellatorPartitioningMode,
72+
"tessellator_partitioning_mode"> {
73+
let assemblyFormat = "$value";
74+
}
75+
5476
//===----------------------------------------------------------------------===//
5577
// DXSA op definitions
5678
//===----------------------------------------------------------------------===//
@@ -196,4 +218,21 @@ def DXSA_DclOutputControlPointCount :
196218
let assemblyFormat = [{ $count attr-dict }];
197219
}
198220

221+
def DXSA_DclTessellatorPartitioning
222+
: DXSA_Op<"dcl_tessellator_partitioning"> {
223+
let summary = "declares the tessellator partitioning mode";
224+
let description = [{
225+
The `dxsa.dcl_tessellator_partitioning` operation declares the
226+
tessellator partitioning mode in a Hull Shader declaration section.
227+
228+
Example:
229+
230+
```mlir
231+
dxsa.dcl_tessellator_partitioning partitioning_integer
232+
```
233+
}];
234+
let arguments = (ins DXSA_TessellatorPartitioningModeAttr:$partitioningMode);
235+
let assemblyFormat = "$partitioningMode attr-dict";
236+
}
237+
199238
#endif // DXSA_OPS

mlir/lib/Target/DXSA/BinaryParser.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,14 @@ class DXBuilder {
529529
builder, loc, builder.getI32IntegerAttr(count));
530530
}
531531

532+
Instruction buildDclTessellatorPartitioning(
533+
dxsa::TessellatorPartitioningMode partitioning, Location loc) {
534+
auto partitioningModeAttr = dxsa::TessellatorPartitioningModeAttr::get(
535+
builder.getContext(), partitioning);
536+
return dxsa::DclTessellatorPartitioning::create(builder, loc,
537+
partitioningModeAttr);
538+
}
539+
532540
private:
533541
MLIRContext *context;
534542
ModuleOp module;
@@ -891,6 +899,18 @@ class Parser {
891899
return builder.buildDclOutputControlPointCount(count, loc);
892900
}
893901

902+
FailureOr<Instruction> parseDclTessellatorPartitioning(uint32_t opcodeToken,
903+
Location loc) {
904+
auto partitioningMode = DECODE_D3D11_SB_TESS_PARTITIONING(opcodeToken);
905+
if (partitioningMode == D3D11_SB_TESSELLATOR_PARTITIONING_UNDEFINED ||
906+
partitioningMode > D3D11_SB_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN) {
907+
return emitError(loc, "unknown tessellator partitioning mode: ")
908+
<< partitioningMode;
909+
}
910+
return builder.buildDclTessellatorPartitioning(
911+
static_cast<dxsa::TessellatorPartitioningMode>(partitioningMode), loc);
912+
}
913+
894914
OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc,
895915
Instruction &out) {
896916
FailureOr<Instruction> result;
@@ -907,6 +927,9 @@ class Parser {
907927
case D3D11_SB_OPCODE_DCL_OUTPUT_CONTROL_POINT_COUNT:
908928
result = parseDclOutputControlPointCount(opcodeToken, loc);
909929
break;
930+
case D3D11_SB_OPCODE_DCL_TESS_PARTITIONING:
931+
result = parseDclTessellatorPartitioning(opcodeToken, loc);
932+
break;
910933
default:
911934
return std::nullopt;
912935
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_tessellator_partitioning.bin | FileCheck %s
2+
3+
// CHECK: module {
4+
// CHECK-NEXT: dxsa.dcl_tessellator_partitioning partitioning_integer
5+
// CHECK-NEXT: dxsa.dcl_tessellator_partitioning partitioning_pow2
6+
// CHECK-NEXT: dxsa.dcl_tessellator_partitioning partitioning_fractional_odd
7+
// CHECK-NEXT: dxsa.dcl_tessellator_partitioning partitioning_fractional_even
8+
// CHECK-NEXT: }
16 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)