Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -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
9 changes: 9 additions & 0 deletions mlir/lib/Dialect/DXSA/IR/DXSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
//===----------------------------------------------------------------------===//
Expand Down
16 changes: 16 additions & 0 deletions mlir/lib/Target/DXSA/BinaryParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -1216,6 +1222,13 @@ class Parser {
return builder.buildDclOutputSiv(*operand, *name, loc);
}

FailureOr<Instruction> parseDclHsMaxTessFactor(Location loc) {
auto token = parseToken();
FAILURE_IF_FAILED(token);
auto maxTessFactor = llvm::bit_cast<float>(*token);
return builder.buildDclHsMaxTessFactor(maxTessFactor, loc);
}

OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc,
Instruction &out) {
FailureOr<Instruction> result;
Expand Down Expand Up @@ -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;
}
Expand Down
5 changes: 5 additions & 0 deletions mlir/test/Target/DXSA/dcl_hs_max_tessfactor.mlir
Original file line number Diff line number Diff line change
@@ -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: }
29 changes: 29 additions & 0 deletions mlir/test/Target/DXSA/dcl_hs_max_tessfactor_invalid.mlir
Original file line number Diff line number Diff line change
@@ -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
Binary file not shown.