From 6eabe6157c7cbe914271e31f58d7dad544f77d93 Mon Sep 17 00:00:00 2001 From: Vladimir Shiryaev Date: Thu, 21 May 2026 23:14:20 -0700 Subject: [PATCH] [mlir][dxsa] Add dcl_hs_fork_phase_instance_count instruction Example: dxsa.dcl_hs_fork_phase_instance_count 42 Signed-off-by: Vladimir Shiryaev --- mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td | 19 ++++++++++++++++++ mlir/lib/Target/DXSA/BinaryParser.cpp | 14 +++++++++++++ .../dcl_hs_fork_phase_instance_count.mlir | 5 +++++ ..._hs_fork_phase_instance_count_invalid.mlir | 14 +++++++++++++ .../dcl_hs_fork_phase_instance_count.bin | Bin 0 -> 8 bytes 5 files changed, 52 insertions(+) create mode 100644 mlir/test/Target/DXSA/dcl_hs_fork_phase_instance_count.mlir create mode 100644 mlir/test/Target/DXSA/dcl_hs_fork_phase_instance_count_invalid.mlir create mode 100644 mlir/test/Target/DXSA/inputs/dcl_hs_fork_phase_instance_count.bin 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 0000000000000000000000000000000000000000..267985d26a02841565d0a22352e27ccf5eec5b95 GIT binary patch literal 8 PcmbQqz`&%%z`y_i1%d#^ literal 0 HcmV?d00001