diff --git a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td index 7d132f6865b5..24deb0fedcc4 100644 --- a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td +++ b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td @@ -281,6 +281,16 @@ def DXSA_ComponentMaskAttr : let assemblyFormat = "`<` $value `>`"; } +//===----------------------------------------------------------------------===// +// DXSA attribute Constraints +//===----------------------------------------------------------------------===// + +// This constraint does not treat the most significant bit as a sign bit, +// so it is safe to use on unsigned integer attributes. +def DXSA_UIntNonZero : AttrConstraint< + CPred<"!::llvm::cast<::mlir::IntegerAttr>($_self).getValue().isZero()">, + "whose value is non-zero">; + //===----------------------------------------------------------------------===// // DXSA op definitions //===----------------------------------------------------------------------===// @@ -790,4 +800,23 @@ def DXSA_DclHsMaxTessFactor : DXSA_Op<"dcl_hs_max_tessfactor"> { let hasVerifier = 1; } +def DXSA_DclHsJoinPhaseInstanceCount : + DXSA_Op<"dcl_hs_join_phase_instance_count"> { + let summary = "declares the Join Phase instance count"; + let description = [{ + The `dxsa.dcl_hs_join_phase_instance_count` operation declares + the Join 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_join_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 8cb113c31ef0..8464dba91296 100644 --- a/mlir/lib/Target/DXSA/BinaryParser.cpp +++ b/mlir/lib/Target/DXSA/BinaryParser.cpp @@ -659,6 +659,11 @@ class DXBuilder { builder, loc, builder.getF32FloatAttr(maxTessFactor)); } + Instruction buildDclHsJoinPhaseInstanceCount(uint32_t count, Location loc) { + return dxsa::DclHsJoinPhaseInstanceCount::create( + builder, loc, builder.getUI32IntegerAttr(count)); + } + private: MLIRContext *context; ModuleOp module; @@ -1229,6 +1234,12 @@ class Parser { return builder.buildDclHsMaxTessFactor(maxTessFactor, loc); } + FailureOr parseDclHsJoinPhaseInstanceCount(Location loc) { + auto count = parseToken(); + FAILURE_IF_FAILED(count); + return builder.buildDclHsJoinPhaseInstanceCount(*count, loc); + } + OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc, Instruction &out) { FailureOr result; @@ -1287,6 +1298,9 @@ class Parser { case D3D11_SB_OPCODE_DCL_HS_MAX_TESSFACTOR: result = parseDclHsMaxTessFactor(loc); break; + case D3D11_SB_OPCODE_DCL_HS_JOIN_PHASE_INSTANCE_COUNT: + result = parseDclHsJoinPhaseInstanceCount(loc); + break; default: return std::nullopt; } diff --git a/mlir/test/Target/DXSA/dcl_hs_join_phase_instance_count.mlir b/mlir/test/Target/DXSA/dcl_hs_join_phase_instance_count.mlir new file mode 100644 index 000000000000..03e92f30645c --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_hs_join_phase_instance_count.mlir @@ -0,0 +1,5 @@ +// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_hs_join_phase_instance_count.bin | FileCheck %s + +// CHECK: module { +// CHECK-NEXT: dxsa.dcl_hs_join_phase_instance_count 42 +// CHECK-NEXT: } diff --git a/mlir/test/Target/DXSA/dcl_hs_join_phase_instance_count_invalid.mlir b/mlir/test/Target/DXSA/dcl_hs_join_phase_instance_count_invalid.mlir new file mode 100644 index 000000000000..ac29a37a687e --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_hs_join_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_join_phase_instance_count 0 + +// ----- + +// expected-error@+1 {{negative integer literal not valid for unsigned integer type}} +dxsa.dcl_hs_join_phase_instance_count -1 + +// ----- + +// expected-error@+1 {{integer constant out of range for attribute}} +dxsa.dcl_hs_join_phase_instance_count 4294967296 diff --git a/mlir/test/Target/DXSA/inputs/dcl_hs_join_phase_instance_count.bin b/mlir/test/Target/DXSA/inputs/dcl_hs_join_phase_instance_count.bin new file mode 100644 index 000000000000..36d20ab5732c Binary files /dev/null and b/mlir/test/Target/DXSA/inputs/dcl_hs_join_phase_instance_count.bin differ