https://github.com/inbelic updated https://github.com/llvm/llvm-project/pull/226554
>From cafc1393d236c630af3b055e854b64b3faaf2e8f Mon Sep 17 00:00:00 2001 From: Finn Plummer <[email protected]> Date: Thu, 24 Sep 2026 15:04:04 +0000 Subject: [PATCH 1/3] [HLSL] Add semantic signature packing flags and invoke packing --- clang/include/clang/Basic/CodeGenOptions.def | 4 + clang/include/clang/Basic/CodeGenOptions.h | 5 ++ .../clang/Basic/DiagnosticFrontendKinds.td | 2 + clang/include/clang/Options/Options.td | 13 +++ clang/lib/CodeGen/CGHLSLRuntime.cpp | 37 ++++++++ clang/lib/Driver/ToolChains/Clang.cpp | 1 + clang/lib/Driver/ToolChains/HLSL.cpp | 16 ++++ clang/lib/Frontend/CompilerInvocation.cpp | 4 + .../CodeGenHLSL/semantics/semantic.input.hlsl | 8 +- .../semantics/semantic.output.hlsl | 8 +- .../semantics/signature-packing-16bit.hlsl | 25 ++++++ .../semantics/signature-packing-errors.hlsl | 28 +++++++ .../semantics/signature-packing.hlsl | 84 +++++++++++++++++++ clang/test/Driver/dxc_signature_packing.hlsl | 23 +++++ llvm/docs/DirectX/SemanticSignatures.md | 10 +++ 15 files changed, 260 insertions(+), 8 deletions(-) create mode 100644 clang/test/CodeGenHLSL/semantics/signature-packing-16bit.hlsl create mode 100644 clang/test/CodeGenHLSL/semantics/signature-packing-errors.hlsl create mode 100644 clang/test/CodeGenHLSL/semantics/signature-packing.hlsl create mode 100644 clang/test/Driver/dxc_signature_packing.hlsl diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index dd9590d406d5e1..9ef7ec4bac3f68 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -523,6 +523,10 @@ CODEGENOPT(ResMayAlias, 1, 0, Benign) /// Assume that all resources are bound if enabled CODEGENOPT(AllResourcesBound, 1, 0, Benign) +/// Packing mode for HLSL signatures connecting programmable shader stages. +ENUM_CODEGENOPT(HLSLSemanticSignaturePacking, HLSLSemanticSignaturePackingMode, 1, + HLSLSemanticSignaturePackingMode::PrefixStable, Benign) + /// Do not embed dx.source.* metadata in HLSL modules. CODEGENOPT(DisableDXSourceMetadata, 1, 0, Benign) diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h index c3a23415c922ae..1f7b6cbac0b702 100644 --- a/clang/include/clang/Basic/CodeGenOptions.h +++ b/clang/include/clang/Basic/CodeGenOptions.h @@ -142,6 +142,11 @@ class CodeGenOptions : public CodeGenOptionsBase { All, }; + enum class HLSLSemanticSignaturePackingMode { + PrefixStable, + Optimized, + }; + enum InlineAsmDialectKind { IAD_ATT, IAD_Intel, diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td index 031858610ede2f..f0dddc0492f35b 100644 --- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td @@ -493,6 +493,8 @@ def warn_hlsl_langstd_minimal : Warning<"support for HLSL language version %0 is incomplete, " "recommend using %1 instead">, InGroup<HLSLDXCCompat>; +def err_hlsl_signature_packing : Error< + "failed to pack %select{input|output}0 signature: %1">; def warn_hlsl_failed_to_embed_source : Warning<"failed to embed source for '%0' into dx.source.contents">, InGroup<HLSLDXCCompat>; diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 15b2196b68e76e..d15115620ce0d0 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -9986,6 +9986,19 @@ def fcgl : DXCFlag<"fcgl">, Alias<emit_pristine_llvm>; def enable_16bit_types : DXCFlag<"enable-16bit-types">, HelpText<"Enable 16-bit types and disable min precision types." "Available in HLSL 2018 and shader model 6.2.">; +def dxc_pack_prefix_stable : DXCFlag<"pack-prefix-stable">, + HelpText<"Pack signature elements without moving previously packed elements (default)">; +def dxc_pack_optimized : DXCFlag<"pack-optimized">, + HelpText<"Reorder signature elements for optimized packing">; +def fdx_semantic_signature_packing_mode_EQ : + Joined<["-"], "fdx-semantic-signature-packing-mode=">, + Group<dxc_Group>, + Visibility<[ClangOption, CC1Option]>, + HelpText<"Select the packing mode for HLSL semantic signatures (default: prefix-stable)">, + Values<"prefix-stable,optimized">, + NormalizedValuesScope<"CodeGenOptions::HLSLSemanticSignaturePackingMode">, + NormalizedValues<["PrefixStable", "Optimized"]>, + MarshallingInfoEnum<CodeGenOpts<"HLSLSemanticSignaturePacking">, "PrefixStable">; def fdx_rootsignature_version : Joined<["-"], "fdx-rootsignature-version=">, Group<dxc_Group>, diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 52fde18dc3ebdb..6ee89d14665d53 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -38,6 +38,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/Frontend/HLSL/HLSLResource.h" #include "llvm/Frontend/HLSL/RootSignatureMetadata.h" +#include "llvm/Frontend/HLSL/SemanticSignaturePacking.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/GlobalVariable.h" @@ -104,6 +105,23 @@ void addRootSignatureMD(llvm::dxbc::RootSignatureVersion RootSigVer, RootSignatureValMD->addOperand(MDVals); } +Expected<unsigned> packSemanticSignature( + MutableArrayRef<llvm::hlsl::SemanticSignatureElement> Elements, + llvm::Triple::EnvironmentType Stage, llvm::hlsl::IOType IOTy, + CodeGenOptions::HLSLSemanticSignaturePackingMode Mode, + bool UseNative16BitTypes) { + using namespace llvm::hlsl; + // Vertex inputs and pixel outputs have fixed packing rules, independent of + // the packing mode used between programmable stages. + if (Stage == llvm::Triple::Vertex && IOTy == IOType::In) + return packSignatureStacked(Elements, Stage, IOTy); + if (Stage == llvm::Triple::Pixel && IOTy == IOType::Out) + return packSignatureIndexed(Elements, Stage, IOTy); + if (Mode == CodeGenOptions::HLSLSemanticSignaturePackingMode::Optimized) + return packSignatureOptimized(Elements, Stage, IOTy, UseNative16BitTypes); + return packSignaturePrefixStable(Elements, Stage, IOTy, UseNative16BitTypes); +} + MDNode *buildSemanticSignatureMD( ArrayRef<llvm::hlsl::SemanticSignatureElement> Elements, LLVMContext &Ctx) { if (Elements.empty()) @@ -1865,6 +1883,25 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD, } } + if (CGM.getTarget().getTriple().isDXIL()) { + // Use the entry's shader stage, not the target environment, which may be + // 'library' when compiling multiple entry points. + auto Stage = FD->getAttr<HLSLShaderAttr>()->getType(); + auto Mode = CGM.getCodeGenOpts().getHLSLSemanticSignaturePacking(); + for (auto IOTy : {llvm::hlsl::IOType::In, llvm::hlsl::IOType::Out}) { + bool IsOutput = IOTy == llvm::hlsl::IOType::Out; + auto Packed = packSemanticSignature( + IsOutput ? OutputSignature : InputSignature, Stage, IOTy, Mode, + CGM.getLangOpts().NativeHalfType); + if (!Packed) { + CGM.getDiags().Report(FD->getLocation(), + diag::err_hlsl_signature_packing) + << IsOutput << llvm::toString(Packed.takeError()); + return; + } + } + } + addSemanticSignatureMD(InputSignature, OutputSignature, EntryFn, M); } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 6636a5fd6e6551..f6f1f4a0ece7fc 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3974,6 +3974,7 @@ static void RenderHLSLOptions(const Driver &D, const ArgList &Args, options::OPT_hlsl_entrypoint, options::OPT_fdx_rootsignature_define, options::OPT_fdx_rootsignature_version, + options::OPT_fdx_semantic_signature_packing_mode_EQ, options::OPT_fhlsl_spv_use_unknown_image_format, options::OPT_fhlsl_spv_use_legacy_buffer_matrix_order, options::OPT_fhlsl_spv_enable_maximal_reconvergence, diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 9e7005b8798f20..b5356f1ec45d33 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -441,7 +441,23 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, BoundArch BA, Args.hasArg(options::OPT_dxc_row_major)) getDriver().Diag(diag::err_drv_dxc_invalid_matrix_layout); + if (Args.hasArg(options::OPT_dxc_pack_prefix_stable) && + Args.hasArg(options::OPT_dxc_pack_optimized)) + getDriver().Diag(diag::err_drv_argument_not_allowed_with) + << "-pack-prefix-stable" << "-pack-optimized"; + for (Arg *A : Args) { + if (A->getOption().matches(options::OPT_dxc_pack_prefix_stable) || + A->getOption().matches(options::OPT_dxc_pack_optimized)) { + DAL->AddJoinedArg( + nullptr, + Opts.getOption(options::OPT_fdx_semantic_signature_packing_mode_EQ), + A->getOption().matches(options::OPT_dxc_pack_prefix_stable) + ? "prefix-stable" + : "optimized"); + A->claim(); + continue; + } if (A->getOption().getID() == options::OPT_dxc_all_resources_bound) { DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_hlsl_all_resources_bound)); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 649a1a18b4ebe8..372c48b84d5cae 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -635,6 +635,10 @@ static bool FixupInvocation(CompilerInvocation &Invocation, Diags.Report(diag::err_drv_argument_not_allowed_with) << "-fdx-rootsignature-define" << GetInputKindName(IK); + if (Args.hasArg(OPT_fdx_semantic_signature_packing_mode_EQ) && !LangOpts.HLSL) + Diags.Report(diag::err_drv_argument_not_allowed_with) + << "-fdx-semantic-signature-packing-mode" << GetInputKindName(IK); + if (Args.hasArg(OPT_fgpu_allow_device_init) && !LangOpts.HIP) Diags.Report(diag::warn_ignored_hip_only_option) << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args); diff --git a/clang/test/CodeGenHLSL/semantics/semantic.input.hlsl b/clang/test/CodeGenHLSL/semantics/semantic.input.hlsl index 3bd77d783b4352..b17298d8dee243 100644 --- a/clang/test/CodeGenHLSL/semantics/semantic.input.hlsl +++ b/clang/test/CodeGenHLSL/semantics/semantic.input.hlsl @@ -55,10 +55,10 @@ void main(S s) {} // CHECK: !dx.semantic.signatures = !{![[#ENTRY_SIG:]]} // CHECK: ![[#ENTRY_SIG]] = !{ptr @main, ![[#INPUT_SIG:]], null} // CHECK: ![[#INPUT_SIG]] = !{![[#A_SIG:]], ![[#B_SIG:]], ![[#D_SIG:]], ![[#E_SIG:]]} -// CHECK: ![[#A_SIG]] = !{i32 0, !"A", i32 9, i32 0, ![[#ZERO_INDEX:]], i32 0, i32 1, i8 1, i32 -1, i8 -1, i8 0, i8 0, i32 0} +// CHECK: ![[#A_SIG]] = !{i32 0, !"A", i32 9, i32 0, ![[#ZERO_INDEX:]], i32 0, i32 1, i8 1, i32 0, i8 0, i8 0, i8 0, i32 0} // CHECK: ![[#ZERO_INDEX]] = !{i32 0} -// CHECK: ![[#B_SIG]] = !{i32 1, !"B", i32 9, i32 0, ![[#ZERO_INDEX]], i32 0, i32 1, i8 4, i32 -1, i8 -1, i8 0, i8 0, i32 0} -// CHECK: ![[#D_SIG]] = !{i32 2, !"D", i32 9, i32 0, ![[#D_INDICES:]], i32 0, i32 5, i8 1, i32 -1, i8 -1, i8 0, i8 0, i32 0} +// CHECK: ![[#B_SIG]] = !{i32 1, !"B", i32 9, i32 0, ![[#ZERO_INDEX]], i32 0, i32 1, i8 4, i32 1, i8 0, i8 0, i8 0, i32 0} +// CHECK: ![[#D_SIG]] = !{i32 2, !"D", i32 9, i32 0, ![[#D_INDICES:]], i32 0, i32 5, i8 1, i32 2, i8 0, i8 0, i8 0, i32 0} // CHECK: ![[#D_INDICES]] = !{i32 0, i32 1, i32 2, i32 3, i32 4} -// CHECK: ![[#E_SIG]] = !{i32 3, !"E", i32 9, i32 0, ![[#E_INDICES:]], i32 0, i32 6, i8 4, i32 -1, i8 -1, i8 0, i8 0, i32 0} +// CHECK: ![[#E_SIG]] = !{i32 3, !"E", i32 9, i32 0, ![[#E_INDICES:]], i32 0, i32 6, i8 4, i32 7, i8 0, i8 0, i8 0, i32 0} // CHECK: ![[#E_INDICES]] = !{i32 0, i32 1, i32 2, i32 3, i32 4, i32 5} diff --git a/clang/test/CodeGenHLSL/semantics/semantic.output.hlsl b/clang/test/CodeGenHLSL/semantics/semantic.output.hlsl index 54e9aa83cda0b6..f714dba64a629e 100644 --- a/clang/test/CodeGenHLSL/semantics/semantic.output.hlsl +++ b/clang/test/CodeGenHLSL/semantics/semantic.output.hlsl @@ -58,10 +58,10 @@ S main() { // CHECK: !dx.semantic.signatures = !{![[#ENTRY_SIG:]]} // CHECK: ![[#ENTRY_SIG]] = !{ptr @main, null, ![[#OUTPUT_SIG:]]} // CHECK: ![[#OUTPUT_SIG]] = !{![[#A_SIG:]], ![[#B_SIG:]], ![[#D_SIG:]], ![[#E_SIG:]]} -// CHECK: ![[#A_SIG]] = !{i32 0, !"A", i32 9, i32 0, ![[#ZERO_INDEX:]], i32 0, i32 1, i8 1, i32 -1, i8 -1, i8 0, i8 0, i32 0} +// CHECK: ![[#A_SIG]] = !{i32 0, !"A", i32 9, i32 0, ![[#ZERO_INDEX:]], i32 0, i32 1, i8 1, i32 0, i8 0, i8 0, i8 0, i32 0} // CHECK: ![[#ZERO_INDEX]] = !{i32 0} -// CHECK: ![[#B_SIG]] = !{i32 1, !"B", i32 9, i32 0, ![[#ZERO_INDEX]], i32 0, i32 1, i8 4, i32 -1, i8 -1, i8 0, i8 0, i32 0} -// CHECK: ![[#D_SIG]] = !{i32 2, !"D", i32 9, i32 0, ![[#D_INDICES:]], i32 0, i32 5, i8 1, i32 -1, i8 -1, i8 0, i8 0, i32 0} +// CHECK: ![[#B_SIG]] = !{i32 1, !"B", i32 9, i32 0, ![[#ZERO_INDEX]], i32 0, i32 1, i8 4, i32 1, i8 0, i8 0, i8 0, i32 0} +// CHECK: ![[#D_SIG]] = !{i32 2, !"D", i32 9, i32 0, ![[#D_INDICES:]], i32 0, i32 5, i8 1, i32 2, i8 0, i8 0, i8 0, i32 0} // CHECK: ![[#D_INDICES]] = !{i32 0, i32 1, i32 2, i32 3, i32 4} -// CHECK: ![[#E_SIG]] = !{i32 3, !"E", i32 9, i32 0, ![[#E_INDICES:]], i32 0, i32 6, i8 4, i32 -1, i8 -1, i8 0, i8 0, i32 0} +// CHECK: ![[#E_SIG]] = !{i32 3, !"E", i32 9, i32 0, ![[#E_INDICES:]], i32 0, i32 6, i8 4, i32 7, i8 0, i8 0, i8 0, i32 0} // CHECK: ![[#E_INDICES]] = !{i32 0, i32 1, i32 2, i32 3, i32 4, i32 5} diff --git a/clang/test/CodeGenHLSL/semantics/signature-packing-16bit.hlsl b/clang/test/CodeGenHLSL/semantics/signature-packing-16bit.hlsl new file mode 100644 index 00000000000000..d1618d4f2d1ac0 --- /dev/null +++ b/clang/test/CodeGenHLSL/semantics/signature-packing-16bit.hlsl @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-vertex -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -o - %s | FileCheck %s --check-prefix=WIDE +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-vertex -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -o - %s | FileCheck %s --check-prefix=WIDE +// RUN: %clang_dxc -T vs_6_2 -fcgl -enable-16bit-types -pack-prefix-stable %s | FileCheck %s --check-prefix=NATIVE +// RUN: %clang_dxc -T vs_6_2 -fcgl -enable-16bit-types -pack-optimized %s | FileCheck %s --check-prefix=NATIVE + +struct Output { + half a : A; + float b : B; + half c : C; +}; + +Output main() { + Output output = {1, 2, 3}; + return output; +} + +// Without native 16-bit types, half is float and all elements share a row. +// WIDE-DAG: !{i32 0, !"A", i32 9, i32 0, !{{[0-9]+}}, i32 0, i32 1, i8 1, i32 0, i8 0, i8 0, i8 0, i32 0} +// WIDE-DAG: !{i32 1, !"B", i32 9, i32 0, !{{[0-9]+}}, i32 0, i32 1, i8 1, i32 0, i8 1, i8 0, i8 0, i32 0} +// WIDE-DAG: !{i32 2, !"C", i32 9, i32 0, !{{[0-9]+}}, i32 0, i32 1, i8 1, i32 0, i8 2, i8 0, i8 0, i32 0} + +// Native 16-bit and 32-bit components must occupy different rows in both modes. +// NATIVE-DAG: !{i32 0, !"A", i32 8, i32 0, !{{[0-9]+}}, i32 0, i32 1, i8 1, i32 0, i8 0, i8 0, i8 0, i32 0} +// NATIVE-DAG: !{i32 1, !"B", i32 9, i32 0, !{{[0-9]+}}, i32 0, i32 1, i8 1, i32 1, i8 0, i8 0, i8 0, i32 0} +// NATIVE-DAG: !{i32 2, !"C", i32 8, i32 0, !{{[0-9]+}}, i32 0, i32 1, i8 1, i32 0, i8 1, i8 0, i8 0, i32 0} diff --git a/clang/test/CodeGenHLSL/semantics/signature-packing-errors.hlsl b/clang/test/CodeGenHLSL/semantics/signature-packing-errors.hlsl new file mode 100644 index 00000000000000..b451c865f83525 --- /dev/null +++ b/clang/test/CodeGenHLSL/semantics/signature-packing-errors.hlsl @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -DSTACKED -o /dev/null -verify %s +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -DSTACKED -o /dev/null -verify %s +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -DOUTPUT -o /dev/null -verify %s +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -DOUTPUT -o /dev/null -verify %s +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -o /dev/null -verify %s +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -o /dev/null -verify %s + +// Packing failures must be diagnosed rather than emitting unallocated metadata +// or reporting a fatal LLVM error. Stacked inputs are limited to 32 rows too. +#ifdef STACKED +[shader("vertex")] +void stacked_overflow(float data[33] : A) {} // expected-error {{failed to pack input signature: signature elements do not fit in 32 rows (element 0)}} + +#elif defined(OUTPUT) +struct Output { + float4 data[33] : A; +}; + +[shader("vertex")] +Output output_overflow() { // expected-error {{failed to pack output signature: signature elements do not fit in 32 rows (element 0)}} + Output output; + return output; +} + +#else +[shader("pixel")] +void input_overflow(float4 data[33] : A) {} // expected-error {{failed to pack input signature: signature elements do not fit in 32 rows (element 0)}} +#endif diff --git a/clang/test/CodeGenHLSL/semantics/signature-packing.hlsl b/clang/test/CodeGenHLSL/semantics/signature-packing.hlsl new file mode 100644 index 00000000000000..2dda3734a41658 --- /dev/null +++ b/clang/test/CodeGenHLSL/semantics/signature-packing.hlsl @@ -0,0 +1,84 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK,STABLE +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -o - %s | FileCheck %s --check-prefixes=CHECK,STABLE +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -o - %s | FileCheck %s --check-prefixes=CHECK,OPTIMIZED +// RUN: %clang_dxc -T lib_6_3 -fcgl %s | FileCheck %s --check-prefixes=CHECK,STABLE +// RUN: %clang_dxc -T lib_6_3 -fcgl -pack-prefix-stable %s | FileCheck %s --check-prefixes=CHECK,STABLE +// RUN: %clang_dxc -T lib_6_3 -fcgl -pack-optimized %s | FileCheck %s --check-prefixes=CHECK,OPTIMIZED + +struct Varyings { + float a : A; + float2 b : B; + float3 c : C; + float2 d : D; +}; + +struct Attributes { + float a : IA; + float2 b : IB; + float3 c : IC; + float2 d : ID; +}; + +[shader("vertex")] +Varyings vs_main(Attributes input) { + Varyings output = {input.a, input.b, input.c, input.d}; + return output; +} + +struct Targets { + float4 color : SV_Target3; + float extra : SV_Target0; +}; + +[shader("pixel")] +Targets ps_main(Varyings input) { + Targets output; + output.color = float4(input.a, input.b, input.c.x); + output.extra = input.d.x; + return output; +} + +// Signature IDs and intrinsic operands stay in declaration order even when +// optimized packing assigns locations in a different order. +// CHECK: call void @llvm.dx.store.output.f32(i32 0, i32 0, i8 0, +// CHECK: call void @llvm.dx.store.output.v2f32(i32 1, i32 0, i8 0, +// CHECK: call void @llvm.dx.store.output.v3f32(i32 2, i32 0, i8 0, +// CHECK: call void @llvm.dx.store.output.v2f32(i32 3, i32 0, i8 0, +// CHECK: call float @llvm.dx.load.input.f32(i32 0, i32 0, i8 0, +// CHECK: call <2 x float> @llvm.dx.load.input.v2f32(i32 1, i32 0, i8 0, +// CHECK: call <3 x float> @llvm.dx.load.input.v3f32(i32 2, i32 0, i8 0, +// CHECK: call <2 x float> @llvm.dx.load.input.v2f32(i32 3, i32 0, i8 0, + +// Use each entry's shader attribute, rather than the library target stage. +// Vertex outputs and pixel inputs have identical packed metadata. +// CHECK: !dx.semantic.signatures = !{![[VS:[0-9]+]], ![[PS:[0-9]+]]} +// CHECK-DAG: ![[VS]] = !{ptr @vs_main, ![[VSIN:[0-9]+]], ![[VARY:[0-9]+]]} +// CHECK-DAG: ![[PS]] = !{ptr @ps_main, ![[VARY]], ![[PSOUT:[0-9]+]]} +// CHECK-DAG: ![[VSIN]] = !{![[IA:[0-9]+]], ![[IB:[0-9]+]], ![[IC:[0-9]+]], ![[ID:[0-9]+]]} +// CHECK-DAG: ![[VARY]] = !{![[A:[0-9]+]], ![[B:[0-9]+]], ![[C:[0-9]+]], ![[D:[0-9]+]]} +// CHECK-DAG: ![[PSOUT]] = !{![[TARGET3:[0-9]+]], ![[TARGET0:[0-9]+]]} + +// Vertex inputs are stacked in declaration order regardless of packing mode. +// CHECK-DAG: ![[IA]] = !{i32 0, !"IA", i32 9, i32 0, ![[ZERO:[0-9]+]], i32 0, i32 1, i8 1, i32 0, i8 0, i8 0, i8 0, i32 0} +// CHECK-DAG: ![[IB]] = !{i32 1, !"IB", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 2, i32 1, i8 0, i8 0, i8 0, i32 0} +// CHECK-DAG: ![[IC]] = !{i32 2, !"IC", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 3, i32 2, i8 0, i8 0, i8 0, i32 0} +// CHECK-DAG: ![[ID]] = !{i32 3, !"ID", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 2, i32 3, i8 0, i8 0, i8 0, i32 0} + +// Prefix-stable packing uses three rows: (a,b), (c), (d). +// STABLE-DAG: ![[A]] = !{i32 0, !"A", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 1, i32 0, i8 0, i8 0, i8 0, i32 0} +// STABLE-DAG: ![[B]] = !{i32 1, !"B", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 2, i32 0, i8 1, i8 0, i8 0, i32 0} +// STABLE-DAG: ![[C]] = !{i32 2, !"C", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 3, i32 1, i8 0, i8 0, i8 0, i32 0} +// STABLE-DAG: ![[D]] = !{i32 3, !"D", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 2, i32 2, i8 0, i8 0, i8 0, i32 0} + +// Optimized packing uses two rows: (c,a), (b,d). +// OPTIMIZED-DAG: ![[A]] = !{i32 0, !"A", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 1, i32 0, i8 3, i8 0, i8 0, i32 0} +// OPTIMIZED-DAG: ![[B]] = !{i32 1, !"B", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 2, i32 1, i8 0, i8 0, i8 0, i32 0} +// OPTIMIZED-DAG: ![[C]] = !{i32 2, !"C", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 3, i32 0, i8 0, i8 0, i8 0, i32 0} +// OPTIMIZED-DAG: ![[D]] = !{i32 3, !"D", i32 9, i32 0, ![[ZERO]], i32 0, i32 1, i8 2, i32 1, i8 2, i8 0, i8 0, i32 0} + +// Pixel output rows always follow semantic indices, including gaps, not +// declaration order or the selected packing mode. +// CHECK-DAG: ![[TARGET3]] = !{i32 0, !"SV_Target", i32 9, i32 {{[0-9]+}}, ![[THREE:[0-9]+]], i32 0, i32 1, i8 4, i32 3, i8 0, i8 0, i8 0, i32 0} +// CHECK-DAG: ![[TARGET0]] = !{i32 1, !"SV_Target", i32 9, i32 {{[0-9]+}}, ![[ZERO]], i32 0, i32 1, i8 1, i32 0, i8 0, i8 0, i8 0, i32 0} +// CHECK-DAG: ![[ZERO]] = !{i32 0} +// CHECK-DAG: ![[THREE]] = !{i32 3} diff --git a/clang/test/Driver/dxc_signature_packing.hlsl b/clang/test/Driver/dxc_signature_packing.hlsl new file mode 100644 index 00000000000000..279eb38dfe605f --- /dev/null +++ b/clang/test/Driver/dxc_signature_packing.hlsl @@ -0,0 +1,23 @@ +// RUN: %clang_dxc -T vs_6_0 -### %s 2>&1 | FileCheck %s --check-prefix=DEFAULT +// RUN: %clang_dxc -T vs_6_0 -pack-prefix-stable -### %s 2>&1 | FileCheck %s --check-prefix=STABLE +// RUN: %clang_dxc -T vs_6_0 -pack-optimized -### %s 2>&1 | FileCheck %s --check-prefix=OPTIMIZED +// RUN: %clang_dxc -T vs_6_0 /pack-prefix-stable -### %s 2>&1 | FileCheck %s --check-prefix=STABLE +// RUN: %clang_dxc -T vs_6_0 /pack-optimized -### %s 2>&1 | FileCheck %s --check-prefix=OPTIMIZED +// RUN: not %clang_dxc -T vs_6_0 -pack-prefix-stable -pack-optimized -### %s 2>&1 | FileCheck %s --check-prefix=CONFLICT +// RUN: not %clang_dxc -T vs_6_0 -pack-optimized -pack-prefix-stable -### %s 2>&1 | FileCheck %s --check-prefix=CONFLICT +// RUN: %clang --target=dxil-pc-shadermodel6.0-vertex -fdx-semantic-signature-packing-mode=prefix-stable -### %s 2>&1 | FileCheck %s --check-prefix=STABLE +// RUN: %clang --target=dxil-pc-shadermodel6.0-vertex -fdx-semantic-signature-packing-mode=optimized -### %s 2>&1 | FileCheck %s --check-prefix=OPTIMIZED +// RUN: %clang --target=dxil-pc-shadermodel6.0-vertex -fdx-semantic-signature-packing-mode=prefix-stable -fdx-semantic-signature-packing-mode=optimized -### %s 2>&1 | FileCheck %s --check-prefix=OPTIMIZED +// RUN: not %clang --target=dxil-pc-shadermodel6.0-vertex -fdx-semantic-signature-packing-mode=invalid -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix=INVALID +// RUN: not %clang --target=dxil-pc-shadermodel6.0-vertex -fdx-semantic-signature-packing-mode= -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix=EMPTY +// RUN: not %clang -x c -Xclang -fdx-semantic-signature-packing-mode=optimized -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix=NOT-HLSL + +// DEFAULT-NOT: -fdx-semantic-signature-packing-mode= +// STABLE: "-fdx-semantic-signature-packing-mode=prefix-stable" +// STABLE-NOT: "-fdx-semantic-signature-packing-mode=optimized" +// OPTIMIZED-NOT: "-fdx-semantic-signature-packing-mode=prefix-stable" +// OPTIMIZED: "-fdx-semantic-signature-packing-mode=optimized" +// CONFLICT: error: invalid argument '-pack-prefix-stable' not allowed with '-pack-optimized' +// INVALID: error: invalid value 'invalid' in '-fdx-semantic-signature-packing-mode=invalid' +// EMPTY: error: invalid value '' in '-fdx-semantic-signature-packing-mode=' +// NOT-HLSL: error: invalid argument '-fdx-semantic-signature-packing-mode' not allowed with 'C' diff --git a/llvm/docs/DirectX/SemanticSignatures.md b/llvm/docs/DirectX/SemanticSignatures.md index 722594bf6f83f8..de8d6057adf56c 100644 --- a/llvm/docs/DirectX/SemanticSignatures.md +++ b/llvm/docs/DirectX/SemanticSignatures.md @@ -147,6 +147,16 @@ in-memory element representation they operate on is declared in [SemanticSignaturePacking.h]: https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/Frontend/HLSL/SemanticSignaturePacking.h +### Selecting a Packing Mode + +Clang packs semantic signatures before emitting `dx.semantic.signatures` +metadata. For signatures connecting programmable shader stages, the default is +prefix-stable packing. Use `-fdx-semantic-signature-packing-mode=prefix-stable` +or `-fdx-semantic-signature-packing-mode=optimized` to select the mode explicitly. +In DXC driver mode, the corresponding flags are `-pack-prefix-stable` and +`-pack-optimized`. These options do not affect vertex shader inputs, which always +use stacked packing, or pixel shader outputs, which always use indexed packing. + ### Prefix-Stable Packing Prefix-stable packing is used for signatures that connect programmable shader >From 3e08466b78d7dc904bdf7e78fec5d0f6b44743f0 Mon Sep 17 00:00:00 2001 From: Finn Plummer <[email protected]> Date: Wed, 7 Oct 2026 15:20:57 +0000 Subject: [PATCH 2/3] review: split tests by scenario --- .../signature-packing-errors-output.hlsl | 13 ++++++++++ .../signature-packing-errors-stacked.hlsl | 6 +++++ .../semantics/signature-packing-errors.hlsl | 26 ++----------------- 3 files changed, 21 insertions(+), 24 deletions(-) create mode 100644 clang/test/CodeGenHLSL/semantics/signature-packing-errors-output.hlsl create mode 100644 clang/test/CodeGenHLSL/semantics/signature-packing-errors-stacked.hlsl diff --git a/clang/test/CodeGenHLSL/semantics/signature-packing-errors-output.hlsl b/clang/test/CodeGenHLSL/semantics/signature-packing-errors-output.hlsl new file mode 100644 index 00000000000000..6f3bd07c7e3273 --- /dev/null +++ b/clang/test/CodeGenHLSL/semantics/signature-packing-errors-output.hlsl @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -o /dev/null -verify %s +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -o /dev/null -verify %s + +struct Output { + float4 data[33] : A; +}; + +[shader("vertex")] +// expected-error@+1 {{failed to pack output signature: signature elements do not fit in 32 rows (element 0)}} +Output output_overflow() { + Output output; + return output; +} diff --git a/clang/test/CodeGenHLSL/semantics/signature-packing-errors-stacked.hlsl b/clang/test/CodeGenHLSL/semantics/signature-packing-errors-stacked.hlsl new file mode 100644 index 00000000000000..7f6757e552e2d9 --- /dev/null +++ b/clang/test/CodeGenHLSL/semantics/signature-packing-errors-stacked.hlsl @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -o /dev/null -verify %s +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -o /dev/null -verify %s + +[shader("vertex")] +// expected-error@+1 {{failed to pack input signature: signature elements do not fit in 32 rows (element 0)}} +void stacked_overflow(float data[33] : A) {} diff --git a/clang/test/CodeGenHLSL/semantics/signature-packing-errors.hlsl b/clang/test/CodeGenHLSL/semantics/signature-packing-errors.hlsl index b451c865f83525..9ff50387de3c2b 100644 --- a/clang/test/CodeGenHLSL/semantics/signature-packing-errors.hlsl +++ b/clang/test/CodeGenHLSL/semantics/signature-packing-errors.hlsl @@ -1,28 +1,6 @@ -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -DSTACKED -o /dev/null -verify %s -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -DSTACKED -o /dev/null -verify %s -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -DOUTPUT -o /dev/null -verify %s -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -DOUTPUT -o /dev/null -verify %s // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -o /dev/null -verify %s // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -o /dev/null -verify %s -// Packing failures must be diagnosed rather than emitting unallocated metadata -// or reporting a fatal LLVM error. Stacked inputs are limited to 32 rows too. -#ifdef STACKED -[shader("vertex")] -void stacked_overflow(float data[33] : A) {} // expected-error {{failed to pack input signature: signature elements do not fit in 32 rows (element 0)}} - -#elif defined(OUTPUT) -struct Output { - float4 data[33] : A; -}; - -[shader("vertex")] -Output output_overflow() { // expected-error {{failed to pack output signature: signature elements do not fit in 32 rows (element 0)}} - Output output; - return output; -} - -#else [shader("pixel")] -void input_overflow(float4 data[33] : A) {} // expected-error {{failed to pack input signature: signature elements do not fit in 32 rows (element 0)}} -#endif +// expected-error@+1 {{failed to pack input signature: signature elements do not fit in 32 rows (element 0)}} +void input_overflow(float4 data[33] : A) {} >From 07803280b9014142e600d40b42b6e628b522fd9e Mon Sep 17 00:00:00 2001 From: Finn Plummer <[email protected]> Date: Fri, 9 Oct 2026 20:49:58 +0000 Subject: [PATCH 3/3] review: add a warnig when packing command would be ignored --- clang/include/clang/Basic/CodeGenOptions.def | 4 +- clang/include/clang/Basic/CodeGenOptions.h | 1 + .../clang/Basic/DiagnosticFrontendKinds.td | 4 ++ clang/include/clang/Options/Options.td | 2 +- clang/lib/CodeGen/CGHLSLRuntime.cpp | 17 ++++++-- .../semantics/signature-packing-warnings.hlsl | 43 +++++++++++++++++++ 6 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 clang/test/CodeGenHLSL/semantics/signature-packing-warnings.hlsl diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index 890cfd0ecbeaa6..cc87a28a98daaf 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -526,8 +526,8 @@ CODEGENOPT(ResMayAlias, 1, 0, Benign) CODEGENOPT(AllResourcesBound, 1, 0, Benign) /// Packing mode for HLSL signatures connecting programmable shader stages. -ENUM_CODEGENOPT(HLSLSemanticSignaturePacking, HLSLSemanticSignaturePackingMode, 1, - HLSLSemanticSignaturePackingMode::PrefixStable, Benign) +ENUM_CODEGENOPT(HLSLSemanticSignaturePacking, HLSLSemanticSignaturePackingMode, 2, + HLSLSemanticSignaturePackingMode::Default, Benign) /// Do not embed dx.source.* metadata in HLSL modules. CODEGENOPT(DisableDXSourceMetadata, 1, 0, Benign) diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h index 1f7b6cbac0b702..ecd1a63d6de4f3 100644 --- a/clang/include/clang/Basic/CodeGenOptions.h +++ b/clang/include/clang/Basic/CodeGenOptions.h @@ -143,6 +143,7 @@ class CodeGenOptions : public CodeGenOptionsBase { }; enum class HLSLSemanticSignaturePackingMode { + Default, PrefixStable, Optimized, }; diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td index 57369a9b7a73ea..51c71c7435f951 100644 --- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td @@ -506,6 +506,10 @@ def warn_hlsl_langstd_minimal : InGroup<HLSLDXCCompat>; def err_hlsl_signature_packing : Error< "failed to pack %select{input|output}0 signature: %1">; +def warn_hlsl_signature_packing_ignored : Warning< + "semantic signature packing mode '%0' is ignored as " + "%select{vertex shader inputs|pixel shader outputs}1 always use " + "%select{stacked|indexed}1 packing">; def warn_hlsl_failed_to_embed_source : Warning<"failed to embed source for '%0' into dx.source.contents">, InGroup<HLSLDXCCompat>; diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 9158ef38360e8d..bcec3026f98010 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -10033,7 +10033,7 @@ def fdx_semantic_signature_packing_mode_EQ : Values<"prefix-stable,optimized">, NormalizedValuesScope<"CodeGenOptions::HLSLSemanticSignaturePackingMode">, NormalizedValues<["PrefixStable", "Optimized"]>, - MarshallingInfoEnum<CodeGenOpts<"HLSLSemanticSignaturePacking">, "PrefixStable">; + MarshallingInfoEnum<CodeGenOpts<"HLSLSemanticSignaturePacking">, "Default">; def fdx_rootsignature_version : Joined<["-"], "fdx-rootsignature-version=">, Group<dxc_Group>, diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 8114e7f0f3edc0..cb77d937fd38ab 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -1887,18 +1887,29 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD, // Use the entry's shader stage, not the target environment, which may be // 'library' when compiling multiple entry points. auto Stage = FD->getAttr<HLSLShaderAttr>()->getType(); + using PackingMode = CodeGenOptions::HLSLSemanticSignaturePackingMode; auto Mode = CGM.getCodeGenOpts().getHLSLSemanticSignaturePacking(); for (auto IOTy : {llvm::hlsl::IOType::In, llvm::hlsl::IOType::Out}) { bool IsOutput = IOTy == llvm::hlsl::IOType::Out; - auto Packed = packSemanticSignature( - IsOutput ? OutputSignature : InputSignature, Stage, IOTy, Mode, - CGM.getLangOpts().NativeHalfType); + auto &Signature = IsOutput ? OutputSignature : InputSignature; + auto Packed = packSemanticSignature(Signature, Stage, IOTy, Mode, + CGM.getLangOpts().NativeHalfType); if (!Packed) { CGM.getDiags().Report(FD->getLocation(), diag::err_hlsl_signature_packing) << IsOutput << llvm::toString(Packed.takeError()); return; } + // Library entry points retain stage-specific packing without warnings. + if (Mode != PackingMode::Default && + CGM.getTarget().getTriple().getEnvironment() != + llvm::Triple::Library && + ((Stage == llvm::Triple::Vertex && !IsOutput) || + (Stage == llvm::Triple::Pixel && IsOutput))) + CGM.getDiags().Report(FD->getLocation(), + diag::warn_hlsl_signature_packing_ignored) + << (Mode == PackingMode::Optimized ? "optimized" : "prefix-stable") + << IsOutput; } } diff --git a/clang/test/CodeGenHLSL/semantics/signature-packing-warnings.hlsl b/clang/test/CodeGenHLSL/semantics/signature-packing-warnings.hlsl new file mode 100644 index 00000000000000..8b0d91b46207c8 --- /dev/null +++ b/clang/test/CodeGenHLSL/semantics/signature-packing-warnings.hlsl @@ -0,0 +1,43 @@ +// RUN: split-file %s %t && %clang_cc1 -triple dxil-pc-shadermodel6.3-vertex -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=prefix-stable -hlsl-entry vertex -o /dev/null -verify=vertex %t/vertex.hlsl +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-pixel -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -hlsl-entry pixel -o /dev/null -verify=pixel %t/pixel.hlsl +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -finclude-default-header -disable-llvm-passes -fdx-semantic-signature-packing-mode=optimized -o /dev/null -verify=library %t/library.hlsl + +//--- vertex.hlsl +// Vertex targets warn about their fixed input layout, including empty inputs. +[shader("vertex")] +// vertex-warning@+1 {{semantic signature packing mode 'prefix-stable' is ignored as vertex shader inputs always use stacked packing}} +float4 vertex(float4 position : POSITION) : SV_Position { + return position; +} + +[shader("vertex")] +// vertex-warning@+1 {{semantic signature packing mode 'prefix-stable' is ignored as vertex shader inputs always use stacked packing}} +float4 vertex_output_only() : SV_Position { + return float4(0, 0, 0, 1); +} + +[shader("vertex")] +// vertex-warning@+1 {{semantic signature packing mode 'prefix-stable' is ignored as vertex shader inputs always use stacked packing}} +void vertex_empty() {} + +//--- pixel.hlsl +// Pixel targets warn about their fixed output layout, including empty outputs. +[shader("pixel")] +// pixel-warning@+1 {{semantic signature packing mode 'optimized' is ignored as pixel shader outputs always use indexed packing}} +float4 pixel(float4 position : SV_Position) : SV_Target0 { + return position; +} + +[shader("pixel")] +// pixel-warning@+1 {{semantic signature packing mode 'optimized' is ignored as pixel shader outputs always use indexed packing}} +void pixel_input_only(float4 position : SV_Position) {} + +[shader("pixel")] +// pixel-warning@+1 {{semantic signature packing mode 'optimized' is ignored as pixel shader outputs always use indexed packing}} +void pixel_empty() {} + +//--- library.hlsl +// Library targets do not warn, even for vertex and pixel entry points. +// library-no-diagnostics +#include "vertex.hlsl" +#include "pixel.hlsl" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
