| // RUN: %clang_cc1 -triple spirv-linux-vulkan-vertex -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s | FileCheck %s |
| |
| struct Inner { |
| uint b : B; |
| }; |
| |
| struct VSInput { |
| float4 position : POSITION; // Not system semantic, Location 0 |
| }; |
| |
| struct VSOutput { |
| float4 position : SV_POSITION; // System semantic, builtin Position |
| uint a : A; // Location 0 |
| Inner inner; // Location 1 |
| uint c : C; // Location 2 |
| }; |
| |
| |
| // CHECK: @POSITION0 = external hidden thread_local addrspace(7) externally_initialized constant <4 x float>, !spirv.Decorations ![[#MD_0:]] |
| // CHECK: @SV_POSITION = external hidden thread_local addrspace(8) global <4 x float>, !spirv.Decorations ![[#MD_2:]] |
| // CHECK: @A0 = external hidden thread_local addrspace(8) global i32, !spirv.Decorations ![[#MD_0:]] |
| // CHECK: @B0 = external hidden thread_local addrspace(8) global i32, !spirv.Decorations ![[#MD_4:]] |
| // CHECK: @C0 = external hidden thread_local addrspace(8) global i32, !spirv.Decorations ![[#MD_6:]] |
| |
| VSOutput main(VSInput input) { |
| VSOutput output; |
| output.position = input.position; |
| output.a = 1; |
| output.inner.b = 2; |
| output.c = 3; |
| return output; |
| } |
| |
| // CHECK: ![[#MD_0]] = !{![[#MD_1:]]} |
| // CHECK: ![[#MD_1]] = !{i32 30, i32 0} |
| // | `-> Location index |
| // `-> SPIR-V decoration 'Location' |
| |
| // CHECK: ![[#MD_2]] = !{![[#MD_3:]]} |
| // CHECK: ![[#MD_3]] = !{i32 11, i32 0} |
| // | `-> BuiltIn 'Position' |
| // `-> SPIR-V decoration 'BuiltIn' |
| |
| // CHECK: ![[#MD_4]] = !{![[#MD_5:]]} |
| // CHECK: ![[#MD_5]] = !{i32 30, i32 1} |
| // | `-> Location index |
| // `-> SPIR-V decoration 'Location' |
| |
| // CHECK: ![[#MD_6]] = !{![[#MD_7:]]} |
| // CHECK: ![[#MD_7]] = !{i32 30, i32 2} |
| // | `-> Location index |
| // `-> SPIR-V decoration 'Location' |