diff --git a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td index a2e4e0284733..677ca28b2320 100644 --- a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td +++ b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td @@ -51,6 +51,25 @@ def DXSA_GlobalFlagsAttr : let assemblyFormat = "`<` $value `>`"; } +def DXSA_TessellatorDomain_Isoline : I32EnumAttrCase<"domain_isoline", 1>; +def DXSA_TessellatorDomain_Tri : I32EnumAttrCase<"domain_tri", 2>; +def DXSA_TessellatorDomain_Quad : I32EnumAttrCase<"domain_quad", 3>; + +def DXSA_TessellatorDomain : I32EnumAttr< + "TessellatorDomain", "tessellator domain", [ + DXSA_TessellatorDomain_Isoline, + DXSA_TessellatorDomain_Tri, + DXSA_TessellatorDomain_Quad + ]> { + let cppNamespace = "::mlir::dxsa"; + let genSpecializedAttr = 0; +} + +def DXSA_TessellatorDomainAttr : + EnumAttr { + let assemblyFormat = "$value"; +} + //===----------------------------------------------------------------------===// // DXSA op definitions //===----------------------------------------------------------------------===// @@ -196,4 +215,21 @@ def DXSA_DclOutputControlPointCount : let assemblyFormat = [{ $count attr-dict }]; } +def DXSA_DclTessellatorDomain : DXSA_Op<"dcl_tessellator_domain"> { + let summary = "declares the tessellator domain"; + let description = [{ + The `dxsa.dcl_tessellator_domain` operation declares the tessellator + domain. + + Example: + + ```mlir + dxsa.dcl_tessellator_domain domain_quad + ``` + }]; + + let arguments = (ins DXSA_TessellatorDomainAttr:$domain); + let assemblyFormat = "$domain attr-dict"; +} + #endif // DXSA_OPS diff --git a/mlir/lib/Target/DXSA/BinaryParser.cpp b/mlir/lib/Target/DXSA/BinaryParser.cpp index cdeeed28145f..4f8b809b51d6 100644 --- a/mlir/lib/Target/DXSA/BinaryParser.cpp +++ b/mlir/lib/Target/DXSA/BinaryParser.cpp @@ -529,6 +529,12 @@ class DXBuilder { builder, loc, builder.getI32IntegerAttr(count)); } + Instruction buildDclTessellatorDomain(uint32_t domain, Location loc) { + auto domainAttr = dxsa::TessellatorDomainAttr::get( + builder.getContext(), static_cast(domain)); + return dxsa::DclTessellatorDomain::create(builder, loc, domainAttr); + } + private: MLIRContext *context; ModuleOp module; @@ -891,6 +897,14 @@ class Parser { return builder.buildDclOutputControlPointCount(count, loc); } + FailureOr parseDclTessellatorDomain(uint32_t opcodeToken, + Location loc) { + auto domain = DECODE_D3D11_SB_TESS_DOMAIN(opcodeToken); + if (domain == D3D11_SB_TESSELLATOR_DOMAIN_UNDEFINED) + return emitError(getLocation(), "tessellator domain cannot be zero"); + return builder.buildDclTessellatorDomain(domain, loc); + } + OptionalParseResult parseDclInstruction(uint32_t opcodeToken, Location loc, Instruction &out) { FailureOr result; @@ -907,6 +921,9 @@ class Parser { case D3D11_SB_OPCODE_DCL_OUTPUT_CONTROL_POINT_COUNT: result = parseDclOutputControlPointCount(opcodeToken, loc); break; + case D3D11_SB_OPCODE_DCL_TESS_DOMAIN: + result = parseDclTessellatorDomain(opcodeToken, loc); + break; default: return std::nullopt; } diff --git a/mlir/test/Target/DXSA/dcl_tessellator_domain.mlir b/mlir/test/Target/DXSA/dcl_tessellator_domain.mlir new file mode 100644 index 000000000000..6007a9f8cc72 --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_tessellator_domain.mlir @@ -0,0 +1,7 @@ +// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_tessellator_domain.bin | FileCheck %s + +// CHECK: module { +// CHECK-NEXT: dxsa.dcl_tessellator_domain domain_isoline +// CHECK-NEXT: dxsa.dcl_tessellator_domain domain_tri +// CHECK-NEXT: dxsa.dcl_tessellator_domain domain_quad +// CHECK-NEXT: } diff --git a/mlir/test/Target/DXSA/inputs/dcl_tessellator_domain.bin b/mlir/test/Target/DXSA/inputs/dcl_tessellator_domain.bin new file mode 100644 index 000000000000..cf69df11dd8f Binary files /dev/null and b/mlir/test/Target/DXSA/inputs/dcl_tessellator_domain.bin differ