diff --git a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td index 24deb0fedcc4..ff61203557c0 100644 --- a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td +++ b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td @@ -819,4 +819,23 @@ def DXSA_DclHsJoinPhaseInstanceCount : let assemblyFormat = "$count attr-dict"; } +def DXSA_DclHsForkPhaseInstanceCount : + DXSA_Op<"dcl_hs_fork_phase_instance_count"> { + let summary = "declares the Fork Phase instance count"; + let description = [{ + The `dxsa.dcl_hs_fork_phase_instance_count` operation declares + the Fork Phase instance count. + + The `$count` must be a positive 32-bit unsigned integer in the range [1, 2^32 - 1]. + + Example: + + ```mlir + dxsa.dcl_hs_fork_phase_instance_count 42 + ``` + }]; + let arguments = (ins ConfinedAttr:$count); + let assemblyFormat = "$count attr-dict"; +} + #endif // DXSA_OPS diff --git a/mlir/lib/Target/DXSA/BinaryParser.cpp b/mlir/lib/Target/DXSA/BinaryParser.cpp index 8464dba91296..56adc8bb189b 100644 --- a/mlir/lib/Target/DXSA/BinaryParser.cpp +++ b/mlir/lib/Target/DXSA/BinaryParser.cpp @@ -664,6 +664,11 @@ class DXBuilder { builder, loc, builder.getUI32IntegerAttr(count)); } + Instruction buildDclHsForkPhaseInstanceCount(uint32_t count, Location loc) { + return dxsa::DclHsForkPhaseInstanceCount::create( + builder, loc, builder.getUI32IntegerAttr(count)); + } + private: MLIRContext *context; ModuleOp module; @@ -1240,6 +1245,12 @@ class Parser { return builder.buildDclHsJoinPhaseInstanceCount(*count, loc); } + FailureOr parseDclHsForkPhaseInstanceCount(Location loc) { + auto count = parseToken(); + FAILURE_IF_FAILED(count); + return builder.buildDclHsForkPhaseInstanceCount(*count, loc); + } + OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc, Instruction &out) { FailureOr result; @@ -1301,6 +1312,9 @@ class Parser { case D3D11_SB_OPCODE_DCL_HS_JOIN_PHASE_INSTANCE_COUNT: result = parseDclHsJoinPhaseInstanceCount(loc); break; + case D3D11_SB_OPCODE_DCL_HS_FORK_PHASE_INSTANCE_COUNT: + result = parseDclHsForkPhaseInstanceCount(loc); + break; default: return std::nullopt; } diff --git a/mlir/test/Target/DXSA/dcl_hs_fork_phase_instance_count.mlir b/mlir/test/Target/DXSA/dcl_hs_fork_phase_instance_count.mlir new file mode 100644 index 000000000000..cc16e49cd0d6 --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_hs_fork_phase_instance_count.mlir @@ -0,0 +1,5 @@ +// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_hs_fork_phase_instance_count.bin | FileCheck %s + +// CHECK: module { +// CHECK-NEXT: dxsa.dcl_hs_fork_phase_instance_count 42 +// CHECK-NEXT: } diff --git a/mlir/test/Target/DXSA/dcl_hs_fork_phase_instance_count_invalid.mlir b/mlir/test/Target/DXSA/dcl_hs_fork_phase_instance_count_invalid.mlir new file mode 100644 index 000000000000..c719287ff53b --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_hs_fork_phase_instance_count_invalid.mlir @@ -0,0 +1,14 @@ +// RUN: mlir-opt %s -split-input-file -verify-diagnostics + +// expected-error@+1 {{attribute 'count' failed to satisfy constraint: 32-bit unsigned integer attribute whose value is non-zero}} +dxsa.dcl_hs_fork_phase_instance_count 0 + +// ----- + +// expected-error@+1 {{negative integer literal not valid for unsigned integer type}} +dxsa.dcl_hs_fork_phase_instance_count -1 + +// ----- + +// expected-error@+1 {{integer constant out of range for attribute}} +dxsa.dcl_hs_fork_phase_instance_count 4294967296 diff --git a/mlir/test/Target/DXSA/inputs/dcl_hs_fork_phase_instance_count.bin b/mlir/test/Target/DXSA/inputs/dcl_hs_fork_phase_instance_count.bin new file mode 100644 index 000000000000..267985d26a02 Binary files /dev/null and b/mlir/test/Target/DXSA/inputs/dcl_hs_fork_phase_instance_count.bin differ