Skip to content

Commit ddf2c21

Browse files
committed
fix shader kind in CG
1 parent 97d25e5 commit ddf2c21

File tree

3 files changed

+52
-6
lines changed

3 files changed

+52
-6
lines changed

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -699,8 +699,9 @@ void CGHLSLRuntime::emitUserSemanticStore(IRBuilder<> &B, llvm::Value *Source,
699699
}
700700

701701
llvm::Value *CGHLSLRuntime::emitSystemSemanticLoad(
702-
IRBuilder<> &B, llvm::Type *Type, const clang::DeclaratorDecl *Decl,
703-
HLSLAppliedSemanticAttr *Semantic, std::optional<unsigned> Index) {
702+
IRBuilder<> &B, const FunctionDecl *FD, llvm::Type *Type,
703+
const clang::DeclaratorDecl *Decl, HLSLAppliedSemanticAttr *Semantic,
704+
std::optional<unsigned> Index) {
704705

705706
std::string SemanticName = Semantic->getAttrName()->getName().upper();
706707
if (SemanticName == "SV_GROUPINDEX") {
@@ -736,8 +737,12 @@ llvm::Value *CGHLSLRuntime::emitSystemSemanticLoad(
736737
return buildVectorInput(B, GroupIDIntrinsic, Type);
737738
}
738739

740+
const auto *ShaderAttr = FD->getAttr<HLSLShaderAttr>();
741+
assert(ShaderAttr && "Entry point has no shader attribute");
742+
llvm::Triple::EnvironmentType ST = ShaderAttr->getType();
743+
739744
if (SemanticName == "SV_POSITION") {
740-
if (CGM.getTriple().getEnvironment() == Triple::EnvironmentType::Pixel) {
745+
if (ST == Triple::EnvironmentType::Pixel) {
741746
if (CGM.getTarget().getTriple().isSPIRV())
742747
return createSPIRVBuiltinLoad(B, CGM.getModule(), Type,
743748
Semantic->getAttrName()->getName(),
@@ -746,7 +751,7 @@ llvm::Value *CGHLSLRuntime::emitSystemSemanticLoad(
746751
return emitDXILUserSemanticLoad(B, Type, Semantic, Index);
747752
}
748753

749-
if (CGM.getTriple().getEnvironment() == Triple::EnvironmentType::Vertex) {
754+
if (ST == Triple::EnvironmentType::Vertex) {
750755
return emitUserSemanticLoad(B, Type, Decl, Semantic, Index);
751756
}
752757
}
@@ -804,7 +809,7 @@ llvm::Value *CGHLSLRuntime::handleScalarSemanticLoad(
804809

805810
std::optional<unsigned> Index = Semantic->getSemanticIndex();
806811
if (Semantic->getAttrName()->getName().starts_with_insensitive("SV_"))
807-
return emitSystemSemanticLoad(B, Type, Decl, Semantic, Index);
812+
return emitSystemSemanticLoad(B, FD, Type, Decl, Semantic, Index);
808813
return emitUserSemanticLoad(B, Type, Decl, Semantic, Index);
809814
}
810815

clang/lib/CodeGen/CGHLSLRuntime.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@ class CGHLSLRuntime {
179179
protected:
180180
CodeGenModule &CGM;
181181

182-
llvm::Value *emitSystemSemanticLoad(llvm::IRBuilder<> &B, llvm::Type *Type,
182+
llvm::Value *emitSystemSemanticLoad(llvm::IRBuilder<> &B,
183+
const FunctionDecl *FD, llvm::Type *Type,
183184
const clang::DeclaratorDecl *Decl,
184185
HLSLAppliedSemanticAttr *Semantic,
185186
std::optional<unsigned> Index);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// RUN: %clang_cc1 -triple spirv-linux-vulkan-library -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK
2+
3+
// The followiong file contains both implicit and explicit vk::location, but
4+
// because each entrypoint has only one kind, this is allowed.
5+
6+
[shader("vertex")]
7+
float4 vs_main(float4 p : SV_Position) : A {
8+
return p;
9+
}
10+
11+
[shader("pixel")]
12+
float4 ps_main([[vk::location(0)]] float4 p : A) : SV_Target {
13+
return p;
14+
}
15+
16+
// The following function is not marked as being a shader entrypoint, this
17+
// means the semantics and [[vk::location]] attributes are ignored.
18+
// Otherwise, the partial explicit location assignment would be illegal.
19+
float4 not_an_entry([[vk::location(0)]] float4 a : A, float4 b : B) : C {
20+
return a + b;
21+
}
22+
23+
// CHECK: @SV_Position0 = external hidden thread_local addrspace(7) externally_initialized constant <4 x float>, !spirv.Decorations ![[#MD_0:]]
24+
// CHECK: @A0 = external hidden thread_local addrspace(8) global <4 x float>, !spirv.Decorations ![[#MD_0:]]
25+
// CHECK: @A0.1 = external hidden thread_local addrspace(7) externally_initialized constant <4 x float>, !spirv.Decorations ![[#MD_0:]]
26+
// CHECK: @SV_Target0 = external hidden thread_local addrspace(8) global <4 x float>, !spirv.Decorations ![[#MD_2:]]
27+
28+
29+
// CHECK: define void @vs_main()
30+
// CHECK: %[[#]] = load <4 x float>, ptr addrspace(7) @SV_Position0, align 16
31+
// CHECK: store <4 x float> %[[#]], ptr addrspace(8) @A0, align 16
32+
33+
// CHECK: define void @ps_main()
34+
// CHECK: %[[#]] = load <4 x float>, ptr addrspace(7) @A0.1, align 16
35+
// CHECK: store <4 x float> %[[#]], ptr addrspace(8) @SV_Target0, align 16
36+
37+
// CHECK: ![[#MD_0]] = !{![[#MD_1:]]}
38+
// CHECK: ![[#MD_1]] = !{i32 30, i32 0}
39+
// CHECK: ![[#MD_2]] = !{![[#MD_3:]]}
40+
// CHECK: ![[#MD_3]] = !{i32 30, i32 1}

0 commit comments

Comments
 (0)