[clang] [HLSL] Add the DXC matrix orientation flags (PR #171550)
Farzon Lotfi via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 10 13:17:44 PST 2025
https://github.com/farzonl updated https://github.com/llvm/llvm-project/pull/171550
>From 754f83ca3861bc5b5c292e0b9f6886d98b2e7c3e Mon Sep 17 00:00:00 2001
From: Farzon Lotfi <farzonlotfi at microsoft.com>
Date: Tue, 9 Dec 2025 20:26:03 -0500
Subject: [PATCH 1/2] [HLSL] Add the DXC matrix orientation flags
fixes #58676
- Make /Zpr and /Zpc turn on the -fmatrix-memory-layout= row-major and column-major flags
- Add the new DXC driver flags to Options.td
- Error in the HLSL toolchain when both flags are specified
- Add the new error diagnostic to DiagnosticDriverKinds.td
- propogate the flag via the Clang toolchain
---
clang/include/clang/Basic/DiagnosticDriverKinds.td | 2 ++
clang/include/clang/Options/Options.td | 2 ++
clang/lib/Driver/ToolChains/Clang.cpp | 4 ++++
clang/lib/Driver/ToolChains/HLSL.cpp | 4 ++++
clang/test/Driver/hlsl_matrix_pack_order.hlsl | 8 ++++++++
5 files changed, 20 insertions(+)
create mode 100644 clang/test/Driver/hlsl_matrix_pack_order.hlsl
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 3e6f7a2a430ff..fca84904326c9 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -826,6 +826,8 @@ def err_drv_target_variant_invalid : Error<
def err_drv_invalid_directx_shader_module : Error<
"invalid profile : %0">;
+def err_drv_dxc_invalid_matrix_layout : Error<
+ "cannot specify /Zpr and /Zpc together">;
def err_drv_dxc_missing_target_profile : Error<
"target profile option (-T) is missing">;
def err_drv_hlsl_unsupported_target : Error<
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index e55146f0c7823..35fb9d5bd227a 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -9587,6 +9587,8 @@ class DXCJoinedOrSeparate<string name> : Option<["/", "-"], name,
KIND_JOINED_OR_SEPARATE>, Group<dxc_Group>,
Visibility<[DXCOption]>;
+def dxc_col_major : DXCFlag<"Zpc">, HelpText<"Pack matrices in column-major order">;
+def dxc_row_major : DXCFlag<"Zpr">, HelpText<"Pack matrices in row-major order">;
def dxc_no_stdinc : DXCFlag<"hlsl-no-stdinc">,
HelpText<"HLSL only. Disables all standard includes containing non-native compiler types and functions.">;
def dxc_Fo : DXCJoinedOrSeparate<"Fo">,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 542b70b3e9d4c..b0d1c994de160 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -3723,6 +3723,10 @@ static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs,
if (!Args.hasArg(options::OPT_dxc_no_stdinc) &&
!Args.hasArg(options::OPT_nostdinc))
CmdArgs.push_back("-finclude-default-header");
+ if (Args.hasArg(options::OPT_dxc_col_major))
+ CmdArgs.push_back("-fmatrix-memory-layout=column-major");
+ if (Args.hasArg(options::OPT_dxc_row_major))
+ CmdArgs.push_back("-fmatrix-memory-layout=row-major");
}
static void RenderOpenACCOptions(const Driver &D, const ArgList &Args,
diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 5d7221b8718a9..8f58b2f449a9a 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -412,6 +412,10 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
const OptTable &Opts = getDriver().getOpts();
+ if (Args.hasArg(options::OPT_dxc_col_major) &&
+ Args.hasArg(options::OPT_dxc_row_major))
+ getDriver().Diag(diag::err_drv_dxc_invalid_matrix_layout);
+
for (Arg *A : Args) {
if (A->getOption().getID() == options::OPT_dxil_validator_version) {
StringRef ValVerStr = A->getValue();
diff --git a/clang/test/Driver/hlsl_matrix_pack_order.hlsl b/clang/test/Driver/hlsl_matrix_pack_order.hlsl
new file mode 100644
index 0000000000000..f7b6902fd02d8
--- /dev/null
+++ b/clang/test/Driver/hlsl_matrix_pack_order.hlsl
@@ -0,0 +1,8 @@
+// RUN: %clang_dxc -T lib_6_7 -Zpr -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-ROW-MAJOR
+// CHECK-ROW-MAJOR: -fmatrix-memory-layout=row-major
+
+// RUN: %clang_dxc -T lib_6_7 -Zpc -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-COL-MAJOR
+// CHECK-COL-MAJOR: -fmatrix-memory-layout=column-major
+
+// RUN: not %clang_dxc -Tlib_6_7 -Zpr -Zpc -fcgl -Fo - %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MISMATCH-MAJOR
+// CHECK-MISMATCH-MAJOR: cannot specify /Zpr and /Zpc together
>From e6eed8b8b00172418c94b8f2242e0835900e46bc Mon Sep 17 00:00:00 2001
From: Farzon Lotfi <farzonlotfi at microsoft.com>
Date: Wed, 10 Dec 2025 16:17:18 -0500
Subject: [PATCH 2/2] Make OPT_fmatrix_memory_layout_EQ a ForwardedArguments in
RenderHLSLOptions. Then set it via HLSLToolChain::TranslateArgs.
---
clang/lib/Driver/ToolChains/Clang.cpp | 5 +----
clang/lib/Driver/ToolChains/HLSL.cpp | 14 ++++++++++++++
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index b0d1c994de160..0950474525189 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -3709,6 +3709,7 @@ static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs,
options::OPT_disable_llvm_passes,
options::OPT_fnative_half_type,
options::OPT_fnative_int16_type,
+ options::OPT_fmatrix_memory_layout_EQ,
options::OPT_hlsl_entrypoint,
options::OPT_fdx_rootsignature_define,
options::OPT_fdx_rootsignature_version,
@@ -3723,10 +3724,6 @@ static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs,
if (!Args.hasArg(options::OPT_dxc_no_stdinc) &&
!Args.hasArg(options::OPT_nostdinc))
CmdArgs.push_back("-finclude-default-header");
- if (Args.hasArg(options::OPT_dxc_col_major))
- CmdArgs.push_back("-fmatrix-memory-layout=column-major");
- if (Args.hasArg(options::OPT_dxc_row_major))
- CmdArgs.push_back("-fmatrix-memory-layout=row-major");
}
static void RenderOpenACCOptions(const Driver &D, const ArgList &Args,
diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 8f58b2f449a9a..2f50b2fc481a5 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -510,6 +510,20 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
A->claim();
continue;
}
+ if (A->getOption().getID() == options::OPT_dxc_col_major) {
+ DAL->AddSeparateArg(nullptr,
+ Opts.getOption(options::OPT_fmatrix_memory_layout_EQ),
+ "column-major");
+ A->claim();
+ continue;
+ }
+ if (A->getOption().getID() == options::OPT_dxc_row_major) {
+ DAL->AddSeparateArg(nullptr,
+ Opts.getOption(options::OPT_fmatrix_memory_layout_EQ),
+ "row-major");
+ A->claim();
+ continue;
+ }
DAL->append(A);
}
More information about the cfe-commits
mailing list