From 8ce1e3f08027e01734150c281287fc3c3da79feb Mon Sep 17 00:00:00 2001 From: Vladimir Shiryaev Date: Mon, 25 May 2026 17:24:46 -0700 Subject: [PATCH] [mlir][dxsa] Add dcl_max_output_vertex_count instruction Example: dxsa.dcl_max_output_vertex_count 42 Signed-off-by: Vladimir Shiryaev --- mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td | 21 +++++++++++++++ mlir/lib/Target/DXSA/BinaryParser.cpp | 24 ++++++++++++++++-- .../DXSA/dcl_max_output_vertex_count.mlir | 6 +++++ .../dcl_max_output_vertex_count_invalid.mlir | 14 ++++++++++ .../inputs/dcl_max_output_vertex_count.bin | Bin 0 -> 16 bytes 5 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 mlir/test/Target/DXSA/dcl_max_output_vertex_count.mlir create mode 100644 mlir/test/Target/DXSA/dcl_max_output_vertex_count_invalid.mlir create mode 100644 mlir/test/Target/DXSA/inputs/dcl_max_output_vertex_count.bin diff --git a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td index d1d590172adb..b9d455045ff4 100644 --- a/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td +++ b/mlir/include/mlir/Dialect/DXSA/IR/DXSAOps.td @@ -857,4 +857,25 @@ def DXSA_DclGsInstanceCount : DXSA_Op<"dcl_gs_instance_count"> { let assemblyFormat = [{ $count attr-dict }]; } +def DXSA_DclMaxOutputVertexCount : + DXSA_Op<"dcl_max_output_vertex_count"> { + let summary = "declares the geometry shader maximum output vertex count"; + let description = [{ + The `dxsa.dcl_max_output_vertex_count` operation declares the maximum + number of vertices that a single invocation of the geometry shader will + emit. + + The count must be in [1, 1024]. + + Example: + + ```mlir + dxsa.dcl_max_output_vertex_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 0ccd38a9c52c..1fa5b22414d0 100644 --- a/mlir/lib/Target/DXSA/BinaryParser.cpp +++ b/mlir/lib/Target/DXSA/BinaryParser.cpp @@ -159,8 +159,8 @@ static void initInstructionInfo(MutableArrayRef instructions) { D3D10_SB_DCL_OP); SET(D3D10_SB_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY, "dcl_outputtopology", 0, 0x00, D3D10_SB_DCL_OP); - SET(D3D10_SB_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT, "dcl_maxout", 0, 0x00, - D3D10_SB_DCL_OP); + SET(D3D10_SB_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT, + "dcl_max_output_vertex_count", 0, 0x00, D3D10_SB_DCL_OP); SET(D3D10_SB_OPCODE_DCL_INPUT_PS, "dcl_input_ps", 1, 0x00, D3D10_SB_DCL_OP); SET(D3D10_SB_OPCODE_DCL_CONSTANT_BUFFER, "dcl_constantbuffer", 1, 0x00, D3D10_SB_DCL_OP); @@ -591,6 +591,10 @@ class DXBuilder { builder.getI32IntegerAttr(count)); } + Instruction buildDclMaxOutputVertexCount(uint32_t count, Location loc) { + return dxsa::DclMaxOutputVertexCount::create(builder, loc, count); + } + Instruction buildDclInputPs(dxsa::InterpolationMode interpolationMode, Operand operand, Location loc) { auto interpolationModeAttr = dxsa::InterpolationModeAttr::get( @@ -1101,6 +1105,19 @@ class Parser { return builder.buildDclGsInstanceCount(count, loc); } + FailureOr parseDclMaxOutputVertexCount(Location loc) { + auto countToken = parseToken(); + FAILURE_IF_FAILED(countToken); + auto count = *countToken; + if (count == 0) + return emitError(getLocation(), "max output vertex count cannot be zero"); + if (count > 1024) + return emitError(getLocation(), + "max output vertex count must be <= 1024, got ") + << count; + return builder.buildDclMaxOutputVertexCount(count, loc); + } + FailureOr parseInterpolationMode(uint32_t opcodeToken, Location loc) { auto rawInterpolationMode = @@ -1301,6 +1318,9 @@ class Parser { case D3D11_SB_OPCODE_DCL_GS_INSTANCE_COUNT: result = parseDclGsInstanceCount(loc); break; + case D3D10_SB_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT: + result = parseDclMaxOutputVertexCount(loc); + break; case D3D10_SB_OPCODE_DCL_INPUT_PS: result = parseDclInputPs(opcodeToken, loc); break; diff --git a/mlir/test/Target/DXSA/dcl_max_output_vertex_count.mlir b/mlir/test/Target/DXSA/dcl_max_output_vertex_count.mlir new file mode 100644 index 000000000000..d2ff559e0715 --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_max_output_vertex_count.mlir @@ -0,0 +1,6 @@ +// RUN: mlir-translate --import-dxsa-bin %S/inputs/dcl_max_output_vertex_count.bin | FileCheck %s + +// CHECK: module { +// CHECK-NEXT: dxsa.dcl_max_output_vertex_count 1 +// CHECK-NEXT: dxsa.dcl_max_output_vertex_count 1024 +// CHECK-NEXT: } diff --git a/mlir/test/Target/DXSA/dcl_max_output_vertex_count_invalid.mlir b/mlir/test/Target/DXSA/dcl_max_output_vertex_count_invalid.mlir new file mode 100644 index 000000000000..5f1b6967e4dc --- /dev/null +++ b/mlir/test/Target/DXSA/dcl_max_output_vertex_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 signless integer attribute whose value is positive whose maximum value is 1024}} +dxsa.dcl_max_output_vertex_count -1 + +// ----- + +// expected-error@+1 {{attribute 'count' failed to satisfy constraint: 32-bit signless integer attribute whose value is positive whose maximum value is 1024}} +dxsa.dcl_max_output_vertex_count 0 + +// ----- + +// expected-error@+1 {{attribute 'count' failed to satisfy constraint: 32-bit signless integer attribute whose value is positive whose maximum value is 1024}} +dxsa.dcl_max_output_vertex_count 1025 diff --git a/mlir/test/Target/DXSA/inputs/dcl_max_output_vertex_count.bin b/mlir/test/Target/DXSA/inputs/dcl_max_output_vertex_count.bin new file mode 100644 index 0000000000000000000000000000000000000000..dee79b9cd0458a642a2098bce264a7822262b52d GIT binary patch literal 16 Vcma!JU|?coU|@&?(hMvN3;+on0LB0S literal 0 HcmV?d00001