From 788925bffddb4782902fc4eb2624c78adfff07c9 Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Tue, 9 Dec 2025 20:26:03 -0500 Subject: [PATCH 1/3] [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 24b63438e22fc..0c99ca54c2274 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -9603,6 +9603,8 @@ class DXCJoinedOrSeparate : Option<["/", "-"], name, KIND_JOINED_OR_SEPARATE>, 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 7119614634552..a19cc586eee23 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 f6b7de28045a96ddb8b895e8dfd94e6f245462f0 Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Wed, 10 Dec 2025 16:17:18 -0500 Subject: [PATCH 2/3] 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 a19cc586eee23..687b110b53bb0 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); } From e4ad3c37d5d07ba8371bfb72b182145a148db007 Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Thu, 11 Dec 2025 17:36:13 -0500 Subject: [PATCH 3/3] switch to joinedArg --- clang/lib/Driver/ToolChains/HLSL.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 2f50b2fc481a5..b76a3d7287975 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -511,16 +511,16 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch, continue; } if (A->getOption().getID() == options::OPT_dxc_col_major) { - DAL->AddSeparateArg(nullptr, - Opts.getOption(options::OPT_fmatrix_memory_layout_EQ), - "column-major"); + DAL->AddJoinedArg(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"); + DAL->AddJoinedArg(nullptr, + Opts.getOption(options::OPT_fmatrix_memory_layout_EQ), + "row-major"); A->claim(); continue; }