From 5a4e425a8b43bbca5fd7878d26275d176a2f9be4 Mon Sep 17 00:00:00 2001 From: Vladimir Shiryaev Date: Fri, 22 May 2026 00:00:09 -0700 Subject: [PATCH] [mlir][dxsa] Add dcl_hs_max_tessfactor instruction Example: dxsa.dcl_hs_max_tessfactor 6.400000e+01 Signed-off-by: Vladimir Shiryaev --- mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td | 19 ++++++++++++ mlir/lib/Dialect/DXSA/IR/DXSA.cpp | 9 ++++++ mlir/lib/Target/DXSA/BinaryParser.cpp | 16 ++++++++++ .../Target/DXSA/dcl_hs_max_tessfactor.mlir | 5 +++ .../DXSA/dcl_hs_max_tessfactor_invalid.mlir | 29 ++++++++++++++++++ .../DXSA/inputs/dcl_hs_max_tessfactor.bin | Bin 0 -> 8 bytes 6 files changed, 78 insertions(+) create mode 100644 mlir/test/Target/DXSA/dcl_hs_max_tessfactor.mlir create mode 100644 mlir/test/Target/DXSA/dcl_hs_max_tessfactor_invalid.mlir create mode 100644 mlir/test/Target/DXSA/inputs/dcl_hs_max_tessfactor.bin diff --git a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td index 50b42ee08b36..7d132f6865b5 100644 --- a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td +++ b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td @@ -771,4 +771,23 @@ def DXSA_DclOutputSiv : DXSA_Op<"dcl_output_siv"> { let assemblyFormat = "$operand `,` $name attr-dict"; } +def DXSA_DclHsMaxTessFactor : DXSA_Op<"dcl_hs_max_tessfactor"> { + let summary = "declares the MaxTessFactor for the patch"; + let description = [{ + The `dxsa.dcl_hs_max_tessfactor` operation declares the MaxTessFactor + for the patch. + + The `$max_tessfactor` is a float32 value in the range [1.0, 64.0]. + + Example: + + ```mlir + dxsa.dcl_hs_max_tessfactor 4.200000e+01 + ``` + }]; + let arguments = (ins F32Attr:$max_tessfactor); + let assemblyFormat = "$max_tessfactor attr-dict"; + let hasVerifier = 1; +} + #endif // DXSA_OPS diff --git a/mlir/lib/Dialect/DXSA/IR/DXSA.cpp b/mlir/lib/Dialect/DXSA/IR/DXSA.cpp index c34132d9cd82..791fd432df2e 100644 --- a/mlir/lib/Dialect/DXSA/IR/DXSA.cpp +++ b/mlir/lib/Dialect/DXSA/IR/DXSA.cpp @@ -54,6 +54,15 @@ LogicalResult DclIndexRange::verify() { return success(); } +LogicalResult DclHsMaxTessFactor::verify() { + auto value = getMaxTessfactorAttr().getValue(); + if (!value.isFinite() || value < llvm::APFloat(1.0f) || + value > llvm::APFloat(64.0f)) + return emitOpError("MaxTessFactor must be in [1.0, 64.0], got ") + << value.convertToFloat(); + return success(); +} + //===----------------------------------------------------------------------===// // TableGen'd attribute method definitions //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Target/DXSA/BinaryParser.cpp b/mlir/lib/Target/DXSA/BinaryParser.cpp index 19e7d4a309a4..8cb113c31ef0 100644 --- a/mlir/lib/Target/DXSA/BinaryParser.cpp +++ b/mlir/lib/Target/DXSA/BinaryParser.cpp @@ -12,6 +12,7 @@ #include "mlir/IR/Location.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/bit.h" #include "llvm/Support/Debug.h" #include "llvm/Support/DebugLog.h" #include "llvm/Support/Endian.h" @@ -653,6 +654,11 @@ class DXBuilder { return dxsa::DclOutputSiv::create(builder, loc, operand, nameAttr); } + Instruction buildDclHsMaxTessFactor(float maxTessFactor, Location loc) { + return dxsa::DclHsMaxTessFactor::create( + builder, loc, builder.getF32FloatAttr(maxTessFactor)); + } + private: MLIRContext *context; ModuleOp module; @@ -1216,6 +1222,13 @@ class Parser { return builder.buildDclOutputSiv(*operand, *name, loc); } + FailureOr parseDclHsMaxTessFactor(Location loc) { + auto token = parseToken(); + FAILURE_IF_FAILED(token); + auto maxTessFactor = llvm::bit_cast(*token); + return builder.buildDclHsMaxTessFactor(maxTessFactor, loc); + } + OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc, Instruction &out) { FailureOr result; @@ -1271,6 +1284,9 @@ class Parser { case D3D10_SB_OPCODE_DCL_OUTPUT_SIV: result = parseDclOutputSiv(loc); break; + case D3D11_SB_OPCODE_DCL_HS_MAX_TESSFACTOR: + result = parseDclHsMaxTessFactor(loc); + break; default: return std::nullopt; } diff --git a/mlir/test/Target/DXSA/dcl_hs_max_tessfactor.mlir b/mlir/test/Target/DXSA/dcl_hs_max_tessfactor.mlir new file mode 100644 index 000000000000..545574e059af --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_hs_max_tessfactor.mlir @@ -0,0 +1,5 @@ +// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_hs_max_tessfactor.bin | FileCheck %s + +// CHECK: module { +// CHECK-NEXT: dxsa.dcl_hs_max_tessfactor 4.200000e+01 +// CHECK-NEXT: } diff --git a/mlir/test/Target/DXSA/dcl_hs_max_tessfactor_invalid.mlir b/mlir/test/Target/DXSA/dcl_hs_max_tessfactor_invalid.mlir new file mode 100644 index 000000000000..29843e83e190 --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_hs_max_tessfactor_invalid.mlir @@ -0,0 +1,29 @@ +// RUN: mlir-opt %s -split-input-file -verify-diagnostics + +// expected-error@+1 {{'dxsa.dcl_hs_max_tessfactor' op MaxTessFactor must be in [1.0, 64.0], got 5.000000e-01}} +dxsa.dcl_hs_max_tessfactor 0.5 + +// ----- + +// expected-error@+1 {{'dxsa.dcl_hs_max_tessfactor' op MaxTessFactor must be in [1.0, 64.0], got -1.000000e+00}} +dxsa.dcl_hs_max_tessfactor -1.000000e+00 + +// ----- + +// expected-error@+1 {{'dxsa.dcl_hs_max_tessfactor' op MaxTessFactor must be in [1.0, 64.0], got 6.500000e+01}} +dxsa.dcl_hs_max_tessfactor 6.500000e+01 + +// ----- + +// expected-error@+1 {{'dxsa.dcl_hs_max_tessfactor' op MaxTessFactor must be in [1.0, 64.0], got nan}} +dxsa.dcl_hs_max_tessfactor 0x7FC00000 + +// ----- + +// expected-error@+1 {{'dxsa.dcl_hs_max_tessfactor' op MaxTessFactor must be in [1.0, 64.0], got INF}} +dxsa.dcl_hs_max_tessfactor 0x7F800000 + +// ----- + +// expected-error@+1 {{'dxsa.dcl_hs_max_tessfactor' op MaxTessFactor must be in [1.0, 64.0], got -INF}} +dxsa.dcl_hs_max_tessfactor 0xFF800000 diff --git a/mlir/test/Target/DXSA/inputs/dcl_hs_max_tessfactor.bin b/mlir/test/Target/DXSA/inputs/dcl_hs_max_tessfactor.bin new file mode 100644 index 0000000000000000000000000000000000000000..69f841a59dd10d812d84a98b6eed26d73bd3ddec GIT binary patch literal 8 PcmbQiz`(@7py31n1!MsQ literal 0 HcmV?d00001