test: Add E2E test coverage for shader IO

This provides much more complete coverage than what we have in the
unit tests. We now test:
- All builtins, for all stages, both struct and non-struct
- Multiple location attributes for vertex and fragment stages, both
  struct and non-struct
- Mixing builtins and location attributes, whilst mixing struct and
  non-struct
- A few "interesting" cases of IO structs being shared between
  different functions, stages, and with an SSBO variable

There are 7 skipped tests for MSL due to two different MSL bugs which
will be fixed in upcoming patches.

Change-Id: I8b802591762c8ff018e01bf37838551e353162b1
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/53120
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Auto-Submit: James Price <jrprice@google.com>
This commit is contained in:
James Price 2021-06-03 09:38:34 +00:00 committed by Tint LUCI CQ
parent 142143109a
commit bb0496e52a
120 changed files with 3179 additions and 0 deletions

View File

@ -0,0 +1,14 @@
[[stage(compute)]]
fn main(
[[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>,
[[builtin(local_invocation_index)]] local_invocation_index : u32,
[[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>,
[[builtin(workgroup_id)]] workgroup_id : vec3<u32>,
// TODO(crbug.com/tint/752): [[builtin(num_workgroups)]] num_workgroups : vec3<u32>;
) {
let foo : u32 =
local_invocation_id.x +
local_invocation_index +
global_invocation_id.x +
workgroup_id.x;
}

View File

@ -0,0 +1,17 @@
struct tint_symbol_1 {
uint3 local_invocation_id : SV_GroupThreadID;
uint local_invocation_index : SV_GroupIndex;
uint3 global_invocation_id : SV_DispatchThreadID;
uint3 workgroup_id : SV_GroupID;
};
[numthreads(1, 1, 1)]
void main(tint_symbol_1 tint_symbol) {
const uint3 local_invocation_id = tint_symbol.local_invocation_id;
const uint local_invocation_index = tint_symbol.local_invocation_index;
const uint3 global_invocation_id = tint_symbol.global_invocation_id;
const uint3 workgroup_id = tint_symbol.workgroup_id;
const uint foo = (((local_invocation_id.x + local_invocation_index) + global_invocation_id.x) + workgroup_id.x);
return;
}

View File

@ -0,0 +1 @@
SKIP: crbug.com/tint/817 attribute only applies to parameters

View File

@ -0,0 +1,43 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 24
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_2 %tint_symbol_3
OpExecutionMode %main LocalSize 1 1 1
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %main "main"
OpDecorate %tint_symbol BuiltIn LocalInvocationId
OpDecorate %tint_symbol_1 BuiltIn LocalInvocationIndex
OpDecorate %tint_symbol_2 BuiltIn GlobalInvocationId
OpDecorate %tint_symbol_3 BuiltIn WorkgroupId
%uint = OpTypeInt 32 0
%v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%tint_symbol = OpVariable %_ptr_Input_v3uint Input
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_1 = OpVariable %_ptr_Input_uint Input
%tint_symbol_2 = OpVariable %_ptr_Input_v3uint Input
%tint_symbol_3 = OpVariable %_ptr_Input_v3uint Input
%void = OpTypeVoid
%9 = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%main = OpFunction %void None %9
%12 = OpLabel
%14 = OpAccessChain %_ptr_Input_uint %tint_symbol %uint_0
%15 = OpLoad %uint %14
%16 = OpLoad %uint %tint_symbol_1
%17 = OpIAdd %uint %15 %16
%18 = OpAccessChain %_ptr_Input_uint %tint_symbol_2 %uint_0
%19 = OpLoad %uint %18
%20 = OpIAdd %uint %17 %19
%21 = OpAccessChain %_ptr_Input_uint %tint_symbol_3 %uint_0
%22 = OpLoad %uint %21
%23 = OpIAdd %uint %20 %22
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,4 @@
[[stage(compute)]]
fn main([[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>, [[builtin(local_invocation_index)]] local_invocation_index : u32, [[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>, [[builtin(workgroup_id)]] workgroup_id : vec3<u32>) {
let foo : u32 = (((local_invocation_id.x + local_invocation_index) + global_invocation_id.x) + workgroup_id.x);
}

View File

@ -0,0 +1,16 @@
struct ComputeInputs {
[[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>;
[[builtin(local_invocation_index)]] local_invocation_index : u32;
[[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>;
[[builtin(workgroup_id)]] workgroup_id : vec3<u32>;
// TODO(crbug.com/tint/752): [[builtin(num_workgroups)]] num_workgroups : vec3<u32>;
};
[[stage(compute)]]
fn main(inputs : ComputeInputs) {
let foo : u32 =
inputs.local_invocation_id.x +
inputs.local_invocation_index +
inputs.global_invocation_id.x +
inputs.workgroup_id.x;
}

View File

@ -0,0 +1,20 @@
struct ComputeInputs {
uint3 local_invocation_id;
uint local_invocation_index;
uint3 global_invocation_id;
uint3 workgroup_id;
};
struct tint_symbol_1 {
uint3 local_invocation_id : SV_GroupThreadID;
uint local_invocation_index : SV_GroupIndex;
uint3 global_invocation_id : SV_DispatchThreadID;
uint3 workgroup_id : SV_GroupID;
};
[numthreads(1, 1, 1)]
void main(tint_symbol_1 tint_symbol) {
const ComputeInputs inputs = {tint_symbol.local_invocation_id, tint_symbol.local_invocation_index, tint_symbol.global_invocation_id, tint_symbol.workgroup_id};
const uint foo = (((inputs.local_invocation_id.x + inputs.local_invocation_index) + inputs.global_invocation_id.x) + inputs.workgroup_id.x);
return;
}

View File

@ -0,0 +1 @@
SKIP: crbug.com/tint/817 attribute only applies to parameters

View File

@ -0,0 +1,57 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 29
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_2 %tint_symbol_3
OpExecutionMode %main LocalSize 1 1 1
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %main "main"
OpName %ComputeInputs "ComputeInputs"
OpMemberName %ComputeInputs 0 "local_invocation_id"
OpMemberName %ComputeInputs 1 "local_invocation_index"
OpMemberName %ComputeInputs 2 "global_invocation_id"
OpMemberName %ComputeInputs 3 "workgroup_id"
OpDecorate %tint_symbol BuiltIn LocalInvocationId
OpDecorate %tint_symbol_1 BuiltIn LocalInvocationIndex
OpDecorate %tint_symbol_2 BuiltIn GlobalInvocationId
OpDecorate %tint_symbol_3 BuiltIn WorkgroupId
OpMemberDecorate %ComputeInputs 0 Offset 0
OpMemberDecorate %ComputeInputs 1 Offset 12
OpMemberDecorate %ComputeInputs 2 Offset 16
OpMemberDecorate %ComputeInputs 3 Offset 32
%uint = OpTypeInt 32 0
%v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%tint_symbol = OpVariable %_ptr_Input_v3uint Input
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_1 = OpVariable %_ptr_Input_uint Input
%tint_symbol_2 = OpVariable %_ptr_Input_v3uint Input
%tint_symbol_3 = OpVariable %_ptr_Input_v3uint Input
%void = OpTypeVoid
%9 = OpTypeFunction %void
%ComputeInputs = OpTypeStruct %v3uint %uint %v3uint %v3uint
%main = OpFunction %void None %9
%12 = OpLabel
%14 = OpLoad %v3uint %tint_symbol
%15 = OpLoad %uint %tint_symbol_1
%16 = OpLoad %v3uint %tint_symbol_2
%17 = OpLoad %v3uint %tint_symbol_3
%18 = OpCompositeConstruct %ComputeInputs %14 %15 %16 %17
%19 = OpCompositeExtract %v3uint %18 0
%20 = OpCompositeExtract %uint %19 0
%21 = OpCompositeExtract %uint %18 1
%22 = OpIAdd %uint %20 %21
%23 = OpCompositeExtract %v3uint %18 2
%24 = OpCompositeExtract %uint %23 0
%25 = OpIAdd %uint %22 %24
%26 = OpCompositeExtract %v3uint %18 3
%27 = OpCompositeExtract %uint %26 0
%28 = OpIAdd %uint %25 %27
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,15 @@
struct ComputeInputs {
[[builtin(local_invocation_id)]]
local_invocation_id : vec3<u32>;
[[builtin(local_invocation_index)]]
local_invocation_index : u32;
[[builtin(global_invocation_id)]]
global_invocation_id : vec3<u32>;
[[builtin(workgroup_id)]]
workgroup_id : vec3<u32>;
};
[[stage(compute)]]
fn main(inputs : ComputeInputs) {
let foo : u32 = (((inputs.local_invocation_id.x + inputs.local_invocation_index) + inputs.global_invocation_id.x) + inputs.workgroup_id.x);
}

View File

@ -0,0 +1,20 @@
struct ComputeInputs0 {
[[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>;
};
struct ComputeInputs1 {
[[builtin(workgroup_id)]] workgroup_id : vec3<u32>;
};
[[stage(compute)]]
fn main(
inputs0 : ComputeInputs0,
[[builtin(local_invocation_index)]] local_invocation_index : u32,
[[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>,
inputs1 : ComputeInputs1,
) {
let foo : u32 =
inputs0.local_invocation_id.x +
local_invocation_index +
global_invocation_id.x +
inputs1.workgroup_id.x;
}

View File

@ -0,0 +1,23 @@
struct ComputeInputs0 {
uint3 local_invocation_id;
};
struct ComputeInputs1 {
uint3 workgroup_id;
};
struct tint_symbol_1 {
uint3 local_invocation_id : SV_GroupThreadID;
uint local_invocation_index : SV_GroupIndex;
uint3 global_invocation_id : SV_DispatchThreadID;
uint3 workgroup_id : SV_GroupID;
};
[numthreads(1, 1, 1)]
void main(tint_symbol_1 tint_symbol) {
const ComputeInputs0 inputs0 = {tint_symbol.local_invocation_id};
const uint local_invocation_index = tint_symbol.local_invocation_index;
const uint3 global_invocation_id = tint_symbol.global_invocation_id;
const ComputeInputs1 inputs1 = {tint_symbol.workgroup_id};
const uint foo = (((inputs0.local_invocation_id.x + local_invocation_index) + global_invocation_id.x) + inputs1.workgroup_id.x);
return;
}

View File

@ -0,0 +1 @@
SKIP: crbug.com/tint/817 attribute only applies to parameters

View File

@ -0,0 +1,55 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 30
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %tint_symbol %tint_symbol_4 %tint_symbol_2 %tint_symbol_3
OpExecutionMode %main LocalSize 1 1 1
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %main "main"
OpName %ComputeInputs0 "ComputeInputs0"
OpMemberName %ComputeInputs0 0 "local_invocation_id"
OpName %ComputeInputs1 "ComputeInputs1"
OpMemberName %ComputeInputs1 0 "workgroup_id"
OpDecorate %tint_symbol BuiltIn LocalInvocationId
OpDecorate %tint_symbol_2 BuiltIn LocalInvocationIndex
OpDecorate %tint_symbol_3 BuiltIn GlobalInvocationId
OpDecorate %tint_symbol_4 BuiltIn WorkgroupId
OpMemberDecorate %ComputeInputs0 0 Offset 0
OpMemberDecorate %ComputeInputs1 0 Offset 0
%uint = OpTypeInt 32 0
%v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%tint_symbol = OpVariable %_ptr_Input_v3uint Input
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_2 = OpVariable %_ptr_Input_uint Input
%tint_symbol_3 = OpVariable %_ptr_Input_v3uint Input
%tint_symbol_4 = OpVariable %_ptr_Input_v3uint Input
%void = OpTypeVoid
%9 = OpTypeFunction %void
%ComputeInputs0 = OpTypeStruct %v3uint
%ComputeInputs1 = OpTypeStruct %v3uint
%uint_0 = OpConstant %uint 0
%main = OpFunction %void None %9
%12 = OpLabel
%14 = OpLoad %v3uint %tint_symbol
%15 = OpCompositeConstruct %ComputeInputs0 %14
%17 = OpLoad %v3uint %tint_symbol_4
%18 = OpCompositeConstruct %ComputeInputs1 %17
%19 = OpCompositeExtract %v3uint %15 0
%20 = OpCompositeExtract %uint %19 0
%21 = OpLoad %uint %tint_symbol_2
%22 = OpIAdd %uint %20 %21
%24 = OpAccessChain %_ptr_Input_uint %tint_symbol_3 %uint_0
%25 = OpLoad %uint %24
%26 = OpIAdd %uint %22 %25
%27 = OpCompositeExtract %v3uint %18 0
%28 = OpCompositeExtract %uint %27 0
%29 = OpIAdd %uint %26 %28
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,14 @@
struct ComputeInputs0 {
[[builtin(local_invocation_id)]]
local_invocation_id : vec3<u32>;
};
struct ComputeInputs1 {
[[builtin(workgroup_id)]]
workgroup_id : vec3<u32>;
};
[[stage(compute)]]
fn main(inputs0 : ComputeInputs0, [[builtin(local_invocation_index)]] local_invocation_index : u32, [[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>, inputs1 : ComputeInputs1) {
let foo : u32 = (((inputs0.local_invocation_id.x + local_invocation_index) + global_invocation_id.x) + inputs1.workgroup_id.x);
}

View File

@ -0,0 +1,12 @@
[[stage(fragment)]]
fn main(
[[builtin(position)]] position : vec4<f32>,
[[builtin(front_facing)]] front_facing : bool,
[[builtin(sample_index)]] sample_index : u32,
[[builtin(sample_mask)]] sample_mask : u32,
) {
if (front_facing) {
let foo : vec4<f32> = position;
let bar : u32 = sample_index + sample_mask;
}
}

View File

@ -0,0 +1,19 @@
struct tint_symbol_1 {
float4 position : SV_Position;
bool front_facing : SV_IsFrontFace;
uint sample_index : SV_SampleIndex;
uint sample_mask : SV_Coverage;
};
void main(tint_symbol_1 tint_symbol) {
const float4 position = tint_symbol.position;
const bool front_facing = tint_symbol.front_facing;
const uint sample_index = tint_symbol.sample_index;
const uint sample_mask = tint_symbol.sample_mask;
if (front_facing) {
const float4 foo = position;
const uint bar = (sample_index + sample_mask);
}
return;
}

View File

@ -0,0 +1,22 @@
#include <metal_stdlib>
using namespace metal;
struct tint_symbol_2 {
float4 position [[position]];
bool front_facing [[front_facing]];
uint sample_index [[sample_id]];
uint sample_mask [[sample_mask]];
};
fragment void tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
float4 const position = tint_symbol_1.position;
bool const front_facing = tint_symbol_1.front_facing;
uint const sample_index = tint_symbol_1.sample_index;
uint const sample_mask = tint_symbol_1.sample_mask;
if (front_facing) {
float4 const foo = position;
uint const bar = (sample_index + sample_mask);
}
return;
}

View File

@ -0,0 +1,53 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 29
; Schema: 0
OpCapability Shader
OpCapability SampleRateShading
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol %tint_symbol_2 %tint_symbol_3
OpExecutionMode %main OriginUpperLeft
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %main "main"
OpDecorate %tint_symbol BuiltIn FragCoord
OpDecorate %tint_symbol_1 BuiltIn FrontFacing
OpDecorate %tint_symbol_2 BuiltIn SampleId
OpDecorate %_arr_uint_uint_1 ArrayStride 4
OpDecorate %tint_symbol_3 BuiltIn SampleMask
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol = OpVariable %_ptr_Input_v4float Input
%bool = OpTypeBool
%_ptr_Input_bool = OpTypePointer Input %bool
%tint_symbol_1 = OpVariable %_ptr_Input_bool Input
%uint = OpTypeInt 32 0
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_2 = OpVariable %_ptr_Input_uint Input
%uint_1 = OpConstant %uint 1
%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
%_ptr_Input__arr_uint_uint_1 = OpTypePointer Input %_arr_uint_uint_1
%tint_symbol_3 = OpVariable %_ptr_Input__arr_uint_uint_1 Input
%void = OpTypeVoid
%15 = OpTypeFunction %void
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%main = OpFunction %void None %15
%18 = OpLabel
%19 = OpLoad %bool %tint_symbol_1
OpSelectionMerge %20 None
OpBranchConditional %19 %21 %20
%21 = OpLabel
%22 = OpLoad %v4float %tint_symbol
%23 = OpLoad %uint %tint_symbol_2
%26 = OpAccessChain %_ptr_Input_uint %tint_symbol_3 %int_0
%27 = OpLoad %uint %26
%28 = OpIAdd %uint %23 %27
OpBranch %20
%20 = OpLabel
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,7 @@
[[stage(fragment)]]
fn main([[builtin(position)]] position : vec4<f32>, [[builtin(front_facing)]] front_facing : bool, [[builtin(sample_index)]] sample_index : u32, [[builtin(sample_mask)]] sample_mask : u32) {
if (front_facing) {
let foo : vec4<f32> = position;
let bar : u32 = (sample_index + sample_mask);
}
}

View File

@ -0,0 +1,14 @@
struct FragmentInputs {
[[builtin(position)]] position : vec4<f32>;
[[builtin(front_facing)]] front_facing : bool;
[[builtin(sample_index)]] sample_index : u32;
[[builtin(sample_mask)]] sample_mask : u32;
};
[[stage(fragment)]]
fn main(inputs : FragmentInputs) {
if (inputs.front_facing) {
let foo : vec4<f32> = inputs.position;
let bar : u32 = inputs.sample_index + inputs.sample_mask;
}
}

View File

@ -0,0 +1,22 @@
struct FragmentInputs {
float4 position;
bool front_facing;
uint sample_index;
uint sample_mask;
};
struct tint_symbol_1 {
float4 position : SV_Position;
bool front_facing : SV_IsFrontFace;
uint sample_index : SV_SampleIndex;
uint sample_mask : SV_Coverage;
};
void main(tint_symbol_1 tint_symbol) {
const FragmentInputs inputs = {tint_symbol.position, tint_symbol.front_facing, tint_symbol.sample_index, tint_symbol.sample_mask};
if (inputs.front_facing) {
const float4 foo = inputs.position;
const uint bar = (inputs.sample_index + inputs.sample_mask);
}
return;
}

View File

@ -0,0 +1,25 @@
#include <metal_stdlib>
using namespace metal;
struct FragmentInputs {
float4 position;
bool front_facing;
uint sample_index;
uint sample_mask;
};
struct tint_symbol_2 {
float4 position [[position]];
bool front_facing [[front_facing]];
uint sample_index [[sample_id]];
uint sample_mask [[sample_mask]];
};
fragment void tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
FragmentInputs const inputs = {tint_symbol_1.position, tint_symbol_1.front_facing, tint_symbol_1.sample_index, tint_symbol_1.sample_mask};
if (inputs.front_facing) {
float4 const foo = inputs.position;
uint const bar = (inputs.sample_index + inputs.sample_mask);
}
return;
}

View File

@ -0,0 +1,68 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 35
; Schema: 0
OpCapability Shader
OpCapability SampleRateShading
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_2 %tint_symbol_3
OpExecutionMode %main OriginUpperLeft
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %main "main"
OpName %FragmentInputs "FragmentInputs"
OpMemberName %FragmentInputs 0 "position"
OpMemberName %FragmentInputs 1 "front_facing"
OpMemberName %FragmentInputs 2 "sample_index"
OpMemberName %FragmentInputs 3 "sample_mask"
OpDecorate %tint_symbol BuiltIn FragCoord
OpDecorate %tint_symbol_1 BuiltIn FrontFacing
OpDecorate %tint_symbol_2 BuiltIn SampleId
OpDecorate %_arr_uint_uint_1 ArrayStride 4
OpDecorate %tint_symbol_3 BuiltIn SampleMask
OpMemberDecorate %FragmentInputs 0 Offset 0
OpMemberDecorate %FragmentInputs 1 Offset 16
OpMemberDecorate %FragmentInputs 2 Offset 20
OpMemberDecorate %FragmentInputs 3 Offset 24
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol = OpVariable %_ptr_Input_v4float Input
%bool = OpTypeBool
%_ptr_Input_bool = OpTypePointer Input %bool
%tint_symbol_1 = OpVariable %_ptr_Input_bool Input
%uint = OpTypeInt 32 0
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_2 = OpVariable %_ptr_Input_uint Input
%uint_1 = OpConstant %uint 1
%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
%_ptr_Input__arr_uint_uint_1 = OpTypePointer Input %_arr_uint_uint_1
%tint_symbol_3 = OpVariable %_ptr_Input__arr_uint_uint_1 Input
%void = OpTypeVoid
%15 = OpTypeFunction %void
%FragmentInputs = OpTypeStruct %v4float %bool %uint %uint
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%main = OpFunction %void None %15
%18 = OpLabel
%20 = OpLoad %v4float %tint_symbol
%21 = OpLoad %bool %tint_symbol_1
%22 = OpLoad %uint %tint_symbol_2
%25 = OpAccessChain %_ptr_Input_uint %tint_symbol_3 %int_0
%26 = OpLoad %uint %25
%27 = OpCompositeConstruct %FragmentInputs %20 %21 %22 %26
%28 = OpCompositeExtract %bool %27 1
OpSelectionMerge %29 None
OpBranchConditional %28 %30 %29
%30 = OpLabel
%31 = OpCompositeExtract %v4float %27 0
%32 = OpCompositeExtract %uint %27 2
%33 = OpCompositeExtract %uint %27 3
%34 = OpIAdd %uint %32 %33
OpBranch %29
%29 = OpLabel
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,18 @@
struct FragmentInputs {
[[builtin(position)]]
position : vec4<f32>;
[[builtin(front_facing)]]
front_facing : bool;
[[builtin(sample_index)]]
sample_index : u32;
[[builtin(sample_mask)]]
sample_mask : u32;
};
[[stage(fragment)]]
fn main(inputs : FragmentInputs) {
if (inputs.front_facing) {
let foo : vec4<f32> = inputs.position;
let bar : u32 = (inputs.sample_index + inputs.sample_mask);
}
}

View File

@ -0,0 +1,12 @@
[[stage(fragment)]]
fn main(
[[location(0)]] loc0 : i32,
[[location(1)]] loc1 : u32,
[[location(2)]] loc2 : f32,
[[location(3)]] loc3 : vec4<f32>,
) {
let i : i32 = loc0;
let u : u32 = loc1;
let f : f32 = loc2;
let v : vec4<f32> = loc3;
}

View File

@ -0,0 +1,19 @@
struct tint_symbol_1 {
int loc0 : TEXCOORD0;
uint loc1 : TEXCOORD1;
float loc2 : TEXCOORD2;
float4 loc3 : TEXCOORD3;
};
void main(tint_symbol_1 tint_symbol) {
const int loc0 = tint_symbol.loc0;
const uint loc1 = tint_symbol.loc1;
const float loc2 = tint_symbol.loc2;
const float4 loc3 = tint_symbol.loc3;
const int i = loc0;
const uint u = loc1;
const float f = loc2;
const float4 v = loc3;
return;
}

View File

@ -0,0 +1,22 @@
#include <metal_stdlib>
using namespace metal;
struct tint_symbol_2 {
int loc0 [[user(locn0)]];
uint loc1 [[user(locn1)]];
float loc2 [[user(locn2)]];
float4 loc3 [[user(locn3)]];
};
fragment void tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
int const loc0 = tint_symbol_1.loc0;
uint const loc1 = tint_symbol_1.loc1;
float const loc2 = tint_symbol_1.loc2;
float4 const loc3 = tint_symbol_1.loc3;
int const i = loc0;
uint const u = loc1;
float const f = loc2;
float4 const v = loc3;
return;
}

View File

@ -0,0 +1,40 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 21
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_2 %tint_symbol_3
OpExecutionMode %main OriginUpperLeft
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %main "main"
OpDecorate %tint_symbol Location 0
OpDecorate %tint_symbol_1 Location 1
OpDecorate %tint_symbol_2 Location 2
OpDecorate %tint_symbol_3 Location 3
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%tint_symbol = OpVariable %_ptr_Input_int Input
%uint = OpTypeInt 32 0
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_1 = OpVariable %_ptr_Input_uint Input
%float = OpTypeFloat 32
%_ptr_Input_float = OpTypePointer Input %float
%tint_symbol_2 = OpVariable %_ptr_Input_float Input
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol_3 = OpVariable %_ptr_Input_v4float Input
%void = OpTypeVoid
%13 = OpTypeFunction %void
%main = OpFunction %void None %13
%16 = OpLabel
%17 = OpLoad %int %tint_symbol
%18 = OpLoad %uint %tint_symbol_1
%19 = OpLoad %float %tint_symbol_2
%20 = OpLoad %v4float %tint_symbol_3
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,7 @@
[[stage(fragment)]]
fn main([[location(0)]] loc0 : i32, [[location(1)]] loc1 : u32, [[location(2)]] loc2 : f32, [[location(3)]] loc3 : vec4<f32>) {
let i : i32 = loc0;
let u : u32 = loc1;
let f : f32 = loc2;
let v : vec4<f32> = loc3;
}

View File

@ -0,0 +1,14 @@
struct FragmentInputs {
[[location(0)]] loc0 : i32;
[[location(1)]] loc1 : u32;
[[location(2)]] loc2 : f32;
[[location(3)]] loc3 : vec4<f32>;
};
[[stage(fragment)]]
fn main(inputs : FragmentInputs) {
let i : i32 = inputs.loc0;
let u : u32 = inputs.loc1;
let f : f32 = inputs.loc2;
let v : vec4<f32> = inputs.loc3;
}

View File

@ -0,0 +1,22 @@
struct FragmentInputs {
int loc0;
uint loc1;
float loc2;
float4 loc3;
};
struct tint_symbol_1 {
int loc0 : TEXCOORD0;
uint loc1 : TEXCOORD1;
float loc2 : TEXCOORD2;
float4 loc3 : TEXCOORD3;
};
void main(tint_symbol_1 tint_symbol) {
const FragmentInputs inputs = {tint_symbol.loc0, tint_symbol.loc1, tint_symbol.loc2, tint_symbol.loc3};
const int i = inputs.loc0;
const uint u = inputs.loc1;
const float f = inputs.loc2;
const float4 v = inputs.loc3;
return;
}

View File

@ -0,0 +1,25 @@
#include <metal_stdlib>
using namespace metal;
struct FragmentInputs {
int loc0;
uint loc1;
float loc2;
float4 loc3;
};
struct tint_symbol_2 {
int loc0 [[user(locn0)]];
uint loc1 [[user(locn1)]];
float loc2 [[user(locn2)]];
float4 loc3 [[user(locn3)]];
};
fragment void tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
FragmentInputs const inputs = {tint_symbol_1.loc0, tint_symbol_1.loc1, tint_symbol_1.loc2, tint_symbol_1.loc3};
int const i = inputs.loc0;
uint const u = inputs.loc1;
float const f = inputs.loc2;
float4 const v = inputs.loc3;
return;
}

View File

@ -0,0 +1,55 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 27
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_2 %tint_symbol_3
OpExecutionMode %main OriginUpperLeft
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %main "main"
OpName %FragmentInputs "FragmentInputs"
OpMemberName %FragmentInputs 0 "loc0"
OpMemberName %FragmentInputs 1 "loc1"
OpMemberName %FragmentInputs 2 "loc2"
OpMemberName %FragmentInputs 3 "loc3"
OpDecorate %tint_symbol Location 0
OpDecorate %tint_symbol_1 Location 1
OpDecorate %tint_symbol_2 Location 2
OpDecorate %tint_symbol_3 Location 3
OpMemberDecorate %FragmentInputs 0 Offset 0
OpMemberDecorate %FragmentInputs 1 Offset 4
OpMemberDecorate %FragmentInputs 2 Offset 8
OpMemberDecorate %FragmentInputs 3 Offset 16
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%tint_symbol = OpVariable %_ptr_Input_int Input
%uint = OpTypeInt 32 0
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_1 = OpVariable %_ptr_Input_uint Input
%float = OpTypeFloat 32
%_ptr_Input_float = OpTypePointer Input %float
%tint_symbol_2 = OpVariable %_ptr_Input_float Input
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol_3 = OpVariable %_ptr_Input_v4float Input
%void = OpTypeVoid
%13 = OpTypeFunction %void
%FragmentInputs = OpTypeStruct %int %uint %float %v4float
%main = OpFunction %void None %13
%16 = OpLabel
%18 = OpLoad %int %tint_symbol
%19 = OpLoad %uint %tint_symbol_1
%20 = OpLoad %float %tint_symbol_2
%21 = OpLoad %v4float %tint_symbol_3
%22 = OpCompositeConstruct %FragmentInputs %18 %19 %20 %21
%23 = OpCompositeExtract %int %22 0
%24 = OpCompositeExtract %uint %22 1
%25 = OpCompositeExtract %float %22 2
%26 = OpCompositeExtract %v4float %22 3
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,18 @@
struct FragmentInputs {
[[location(0)]]
loc0 : i32;
[[location(1)]]
loc1 : u32;
[[location(2)]]
loc2 : f32;
[[location(3)]]
loc3 : vec4<f32>;
};
[[stage(fragment)]]
fn main(inputs : FragmentInputs) {
let i : i32 = inputs.loc0;
let u : u32 = inputs.loc1;
let f : f32 = inputs.loc2;
let v : vec4<f32> = inputs.loc3;
}

View File

@ -0,0 +1,27 @@
struct FragmentInputs0 {
[[builtin(position)]] position : vec4<f32>;
[[location(0)]] loc0 : i32;
};
struct FragmentInputs1 {
[[location(3)]] loc3 : vec4<f32>;
[[builtin(sample_mask)]] sample_mask : u32;
};
[[stage(fragment)]]
fn main(
inputs0 : FragmentInputs0,
[[builtin(front_facing)]] front_facing : bool,
[[location(1)]] loc1 : u32,
[[builtin(sample_index)]] sample_index : u32,
inputs1 : FragmentInputs1,
[[location(2)]] loc2 : f32,
) {
if (front_facing) {
let foo : vec4<f32> = inputs0.position;
let bar : u32 = sample_index + inputs1.sample_mask;
let i : i32 = inputs0.loc0;
let u : u32 = loc1;
let f : f32 = loc2;
let v : vec4<f32> = inputs1.loc3;
}
}

View File

@ -0,0 +1,37 @@
struct FragmentInputs0 {
float4 position;
int loc0;
};
struct FragmentInputs1 {
float4 loc3;
uint sample_mask;
};
struct tint_symbol_1 {
int loc0 : TEXCOORD0;
uint loc1 : TEXCOORD1;
float loc2 : TEXCOORD2;
float4 loc3 : TEXCOORD3;
float4 position : SV_Position;
bool front_facing : SV_IsFrontFace;
uint sample_index : SV_SampleIndex;
uint sample_mask : SV_Coverage;
};
void main(tint_symbol_1 tint_symbol) {
const FragmentInputs0 inputs0 = {tint_symbol.position, tint_symbol.loc0};
const bool front_facing = tint_symbol.front_facing;
const uint loc1 = tint_symbol.loc1;
const uint sample_index = tint_symbol.sample_index;
const FragmentInputs1 inputs1 = {tint_symbol.loc3, tint_symbol.sample_mask};
const float loc2 = tint_symbol.loc2;
if (front_facing) {
const float4 foo = inputs0.position;
const uint bar = (sample_index + inputs1.sample_mask);
const int i = inputs0.loc0;
const uint u = loc1;
const float f = loc2;
const float4 v = inputs1.loc3;
}
return;
}

View File

@ -0,0 +1,40 @@
#include <metal_stdlib>
using namespace metal;
struct FragmentInputs0 {
float4 position;
int loc0;
};
struct FragmentInputs1 {
float4 loc3;
uint sample_mask;
};
struct tint_symbol_2 {
int loc0 [[user(locn0)]];
uint loc1 [[user(locn1)]];
float loc2 [[user(locn2)]];
float4 loc3 [[user(locn3)]];
float4 position [[position]];
bool front_facing [[front_facing]];
uint sample_index [[sample_id]];
uint sample_mask [[sample_mask]];
};
fragment void tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
FragmentInputs0 const inputs0 = {tint_symbol_1.position, tint_symbol_1.loc0};
bool const front_facing = tint_symbol_1.front_facing;
uint const loc1 = tint_symbol_1.loc1;
uint const sample_index = tint_symbol_1.sample_index;
FragmentInputs1 const inputs1 = {tint_symbol_1.loc3, tint_symbol_1.sample_mask};
float const loc2 = tint_symbol_1.loc2;
if (front_facing) {
float4 const foo = inputs0.position;
uint const bar = (sample_index + inputs1.sample_mask);
int const i = inputs0.loc0;
uint const u = loc1;
float const f = loc2;
float4 const v = inputs1.loc3;
}
return;
}

View File

@ -0,0 +1,89 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 47
; Schema: 0
OpCapability Shader
OpCapability SampleRateShading
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_6 %tint_symbol_7 %tint_symbol_3 %tint_symbol_5 %tint_symbol_4 %tint_symbol_9
OpExecutionMode %main OriginUpperLeft
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol_6 "tint_symbol_6"
OpName %tint_symbol_7 "tint_symbol_7"
OpName %tint_symbol_9 "tint_symbol_9"
OpName %main "main"
OpName %FragmentInputs0 "FragmentInputs0"
OpMemberName %FragmentInputs0 0 "position"
OpMemberName %FragmentInputs0 1 "loc0"
OpName %FragmentInputs1 "FragmentInputs1"
OpMemberName %FragmentInputs1 0 "loc3"
OpMemberName %FragmentInputs1 1 "sample_mask"
OpDecorate %tint_symbol BuiltIn FragCoord
OpDecorate %tint_symbol_1 Location 0
OpDecorate %tint_symbol_3 BuiltIn FrontFacing
OpDecorate %tint_symbol_4 Location 1
OpDecorate %tint_symbol_5 BuiltIn SampleId
OpDecorate %tint_symbol_6 Location 3
OpDecorate %_arr_uint_uint_1 ArrayStride 4
OpDecorate %tint_symbol_7 BuiltIn SampleMask
OpDecorate %tint_symbol_9 Location 2
OpMemberDecorate %FragmentInputs0 0 Offset 0
OpMemberDecorate %FragmentInputs0 1 Offset 16
OpMemberDecorate %FragmentInputs1 0 Offset 0
OpMemberDecorate %FragmentInputs1 1 Offset 16
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol = OpVariable %_ptr_Input_v4float Input
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%tint_symbol_1 = OpVariable %_ptr_Input_int Input
%bool = OpTypeBool
%_ptr_Input_bool = OpTypePointer Input %bool
%tint_symbol_3 = OpVariable %_ptr_Input_bool Input
%uint = OpTypeInt 32 0
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_4 = OpVariable %_ptr_Input_uint Input
%tint_symbol_5 = OpVariable %_ptr_Input_uint Input
%tint_symbol_6 = OpVariable %_ptr_Input_v4float Input
%uint_1 = OpConstant %uint 1
%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
%_ptr_Input__arr_uint_uint_1 = OpTypePointer Input %_arr_uint_uint_1
%tint_symbol_7 = OpVariable %_ptr_Input__arr_uint_uint_1 Input
%_ptr_Input_float = OpTypePointer Input %float
%tint_symbol_9 = OpVariable %_ptr_Input_float Input
%void = OpTypeVoid
%22 = OpTypeFunction %void
%FragmentInputs0 = OpTypeStruct %v4float %int
%FragmentInputs1 = OpTypeStruct %v4float %uint
%int_0 = OpConstant %int 0
%main = OpFunction %void None %22
%25 = OpLabel
%27 = OpLoad %v4float %tint_symbol
%28 = OpLoad %int %tint_symbol_1
%29 = OpCompositeConstruct %FragmentInputs0 %27 %28
%31 = OpLoad %v4float %tint_symbol_6
%33 = OpAccessChain %_ptr_Input_uint %tint_symbol_7 %int_0
%34 = OpLoad %uint %33
%35 = OpCompositeConstruct %FragmentInputs1 %31 %34
%36 = OpLoad %bool %tint_symbol_3
OpSelectionMerge %37 None
OpBranchConditional %36 %38 %37
%38 = OpLabel
%39 = OpCompositeExtract %v4float %29 0
%40 = OpLoad %uint %tint_symbol_5
%41 = OpCompositeExtract %uint %35 1
%42 = OpIAdd %uint %40 %41
%43 = OpCompositeExtract %int %29 1
%44 = OpLoad %uint %tint_symbol_4
%45 = OpLoad %float %tint_symbol_9
%46 = OpCompositeExtract %v4float %35 0
OpBranch %37
%37 = OpLabel
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,25 @@
struct FragmentInputs0 {
[[builtin(position)]]
position : vec4<f32>;
[[location(0)]]
loc0 : i32;
};
struct FragmentInputs1 {
[[location(3)]]
loc3 : vec4<f32>;
[[builtin(sample_mask)]]
sample_mask : u32;
};
[[stage(fragment)]]
fn main(inputs0 : FragmentInputs0, [[builtin(front_facing)]] front_facing : bool, [[location(1)]] loc1 : u32, [[builtin(sample_index)]] sample_index : u32, inputs1 : FragmentInputs1, [[location(2)]] loc2 : f32) {
if (front_facing) {
let foo : vec4<f32> = inputs0.position;
let bar : u32 = (sample_index + inputs1.sample_mask);
let i : i32 = inputs0.loc0;
let u : u32 = loc1;
let f : f32 = loc2;
let v : vec4<f32> = inputs1.loc3;
}
}

View File

@ -0,0 +1,9 @@
[[stage(fragment)]]
fn main1() -> [[builtin(frag_depth)]] f32 {
return 1.0;
}
[[stage(fragment)]]
fn main2() -> [[builtin(sample_mask)]] u32 {
return 1u;
}

View File

@ -0,0 +1,17 @@
struct tint_symbol {
float value : SV_Depth;
};
struct tint_symbol_1 {
uint value : SV_Coverage;
};
tint_symbol main1() {
const tint_symbol tint_symbol_2 = {1.0f};
return tint_symbol_2;
}
tint_symbol_1 main2() {
const tint_symbol_1 tint_symbol_3 = {1u};
return tint_symbol_3;
}

View File

@ -0,0 +1,20 @@
#include <metal_stdlib>
using namespace metal;
struct tint_symbol {
float value [[depth(any)]];
};
struct tint_symbol_1 {
uint value [[sample_mask]];
};
fragment tint_symbol main1() {
tint_symbol const tint_symbol_2 = {1.0f};
return tint_symbol_2;
}
fragment tint_symbol_1 main2() {
tint_symbol_1 const tint_symbol_3 = {1u};
return tint_symbol_3;
}

View File

@ -0,0 +1,64 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 32
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main1 "main1" %tint_symbol_1
OpEntryPoint Fragment %main2 "main2" %tint_symbol_4
OpExecutionMode %main1 OriginUpperLeft
OpExecutionMode %main1 DepthReplacing
OpExecutionMode %main2 OriginUpperLeft
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol "tint_symbol"
OpName %main1 "main1"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %main2 "main2"
OpDecorate %tint_symbol_1 BuiltIn FragDepth
OpDecorate %_arr_uint_uint_1 ArrayStride 4
OpDecorate %tint_symbol_4 BuiltIn SampleMask
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_symbol_1 = OpVariable %_ptr_Output_float Output %4
%uint = OpTypeInt 32 0
%uint_1 = OpConstant %uint 1
%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
%_ptr_Output__arr_uint_uint_1 = OpTypePointer Output %_arr_uint_uint_1
%10 = OpConstantNull %_arr_uint_uint_1
%tint_symbol_4 = OpVariable %_ptr_Output__arr_uint_uint_1 Output %10
%void = OpTypeVoid
%11 = OpTypeFunction %void %float
%16 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%21 = OpTypeFunction %void %uint
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%_ptr_Output_uint = OpTypePointer Output %uint
%tint_symbol_2 = OpFunction %void None %11
%tint_symbol = OpFunctionParameter %float
%15 = OpLabel
OpStore %tint_symbol_1 %tint_symbol
OpReturn
OpFunctionEnd
%main1 = OpFunction %void None %16
%18 = OpLabel
%19 = OpFunctionCall %void %tint_symbol_2 %float_1
OpReturn
OpFunctionEnd
%tint_symbol_5 = OpFunction %void None %21
%tint_symbol_3 = OpFunctionParameter %uint
%24 = OpLabel
%28 = OpAccessChain %_ptr_Output_uint %tint_symbol_4 %int_0
OpStore %28 %tint_symbol_3
OpReturn
OpFunctionEnd
%main2 = OpFunction %void None %16
%30 = OpLabel
%31 = OpFunctionCall %void %tint_symbol_5 %uint_1
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,9 @@
[[stage(fragment)]]
fn main1() -> [[builtin(frag_depth)]] f32 {
return 1.0;
}
[[stage(fragment)]]
fn main2() -> [[builtin(sample_mask)]] u32 {
return 1u;
}

View File

@ -0,0 +1,9 @@
struct FragmentOutputs {
[[builtin(frag_depth)]] frag_depth : f32;
[[builtin(sample_mask)]] sample_mask : u32;
};
[[stage(fragment)]]
fn main() -> FragmentOutputs {
return FragmentOutputs(1.0, 1u);
}

View File

@ -0,0 +1,15 @@
struct FragmentOutputs {
float frag_depth;
uint sample_mask;
};
struct tint_symbol {
float frag_depth : SV_Depth;
uint sample_mask : SV_Coverage;
};
tint_symbol main() {
const FragmentOutputs tint_symbol_1 = {1.0f, 1u};
const tint_symbol tint_symbol_2 = {tint_symbol_1.frag_depth, tint_symbol_1.sample_mask};
return tint_symbol_2;
}

View File

@ -0,0 +1,18 @@
#include <metal_stdlib>
using namespace metal;
struct FragmentOutputs {
float frag_depth;
uint sample_mask;
};
struct tint_symbol_1 {
float frag_depth [[depth(any)]];
uint sample_mask [[sample_mask]];
};
fragment tint_symbol_1 tint_symbol() {
FragmentOutputs const tint_symbol_2 = {1.0f, 1u};
tint_symbol_1 const tint_symbol_3 = {tint_symbol_2.frag_depth, tint_symbol_2.sample_mask};
return tint_symbol_3;
}

View File

@ -0,0 +1,57 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 29
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
OpExecutionMode %main OriginUpperLeft
OpExecutionMode %main DepthReplacing
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %FragmentOutputs "FragmentOutputs"
OpMemberName %FragmentOutputs 0 "frag_depth"
OpMemberName %FragmentOutputs 1 "sample_mask"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol "tint_symbol"
OpName %main "main"
OpDecorate %tint_symbol_1 BuiltIn FragDepth
OpDecorate %_arr_uint_uint_1 ArrayStride 4
OpDecorate %tint_symbol_2 BuiltIn SampleMask
OpMemberDecorate %FragmentOutputs 0 Offset 0
OpMemberDecorate %FragmentOutputs 1 Offset 4
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_symbol_1 = OpVariable %_ptr_Output_float Output %4
%uint = OpTypeInt 32 0
%uint_1 = OpConstant %uint 1
%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
%_ptr_Output__arr_uint_uint_1 = OpTypePointer Output %_arr_uint_uint_1
%10 = OpConstantNull %_arr_uint_uint_1
%tint_symbol_2 = OpVariable %_ptr_Output__arr_uint_uint_1 Output %10
%void = OpTypeVoid
%FragmentOutputs = OpTypeStruct %float %uint
%11 = OpTypeFunction %void %FragmentOutputs
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%_ptr_Output_uint = OpTypePointer Output %uint
%23 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%28 = OpConstantComposite %FragmentOutputs %float_1 %uint_1
%tint_symbol_3 = OpFunction %void None %11
%tint_symbol = OpFunctionParameter %FragmentOutputs
%16 = OpLabel
%17 = OpCompositeExtract %float %tint_symbol 0
OpStore %tint_symbol_1 %17
%21 = OpAccessChain %_ptr_Output_uint %tint_symbol_2 %int_0
%22 = OpCompositeExtract %uint %tint_symbol 1
OpStore %21 %22
OpReturn
OpFunctionEnd
%main = OpFunction %void None %23
%25 = OpLabel
%26 = OpFunctionCall %void %tint_symbol_3 %28
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,11 @@
struct FragmentOutputs {
[[builtin(frag_depth)]]
frag_depth : f32;
[[builtin(sample_mask)]]
sample_mask : u32;
};
[[stage(fragment)]]
fn main() -> FragmentOutputs {
return FragmentOutputs(1.0, 1u);
}

View File

@ -0,0 +1,19 @@
[[stage(fragment)]]
fn main0() -> [[location(0)]] i32 {
return 1;
}
[[stage(fragment)]]
fn main1() -> [[location(1)]] u32 {
return 1u;
}
[[stage(fragment)]]
fn main2() -> [[location(2)]] f32 {
return 1.0;
}
[[stage(fragment)]]
fn main3() -> [[location(3)]] vec4<f32> {
return vec4<f32>(1.0, 2.0, 3.0, 4.0);
}

View File

@ -0,0 +1,33 @@
struct tint_symbol {
int value : SV_Target0;
};
struct tint_symbol_1 {
uint value : SV_Target1;
};
struct tint_symbol_2 {
float value : SV_Target2;
};
struct tint_symbol_3 {
float4 value : SV_Target3;
};
tint_symbol main0() {
const tint_symbol tint_symbol_4 = {1};
return tint_symbol_4;
}
tint_symbol_1 main1() {
const tint_symbol_1 tint_symbol_5 = {1u};
return tint_symbol_5;
}
tint_symbol_2 main2() {
const tint_symbol_2 tint_symbol_6 = {1.0f};
return tint_symbol_6;
}
tint_symbol_3 main3() {
const tint_symbol_3 tint_symbol_7 = {float4(1.0f, 2.0f, 3.0f, 4.0f)};
return tint_symbol_7;
}

View File

@ -0,0 +1,36 @@
#include <metal_stdlib>
using namespace metal;
struct tint_symbol {
int value [[color(0)]];
};
struct tint_symbol_1 {
uint value [[color(1)]];
};
struct tint_symbol_2 {
float value [[color(2)]];
};
struct tint_symbol_3 {
float4 value [[color(3)]];
};
fragment tint_symbol main0() {
tint_symbol const tint_symbol_4 = {1};
return tint_symbol_4;
}
fragment tint_symbol_1 main1() {
tint_symbol_1 const tint_symbol_5 = {1u};
return tint_symbol_5;
}
fragment tint_symbol_2 main2() {
tint_symbol_2 const tint_symbol_6 = {1.0f};
return tint_symbol_6;
}
fragment tint_symbol_3 main3() {
tint_symbol_3 const tint_symbol_7 = {float4(1.0f, 2.0f, 3.0f, 4.0f)};
return tint_symbol_7;
}

View File

@ -0,0 +1,108 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 54
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main0 "main0" %tint_symbol_1
OpEntryPoint Fragment %main1 "main1" %tint_symbol_4
OpEntryPoint Fragment %main2 "main2" %tint_symbol_7
OpEntryPoint Fragment %main3 "main3" %tint_symbol_10
OpExecutionMode %main0 OriginUpperLeft
OpExecutionMode %main1 OriginUpperLeft
OpExecutionMode %main2 OriginUpperLeft
OpExecutionMode %main3 OriginUpperLeft
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %tint_symbol_7 "tint_symbol_7"
OpName %tint_symbol_10 "tint_symbol_10"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol "tint_symbol"
OpName %main0 "main0"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %main1 "main1"
OpName %tint_symbol_8 "tint_symbol_8"
OpName %tint_symbol_6 "tint_symbol_6"
OpName %main2 "main2"
OpName %tint_symbol_11 "tint_symbol_11"
OpName %tint_symbol_9 "tint_symbol_9"
OpName %main3 "main3"
OpDecorate %tint_symbol_1 Location 0
OpDecorate %tint_symbol_4 Location 1
OpDecorate %tint_symbol_7 Location 2
OpDecorate %tint_symbol_10 Location 3
%int = OpTypeInt 32 1
%_ptr_Output_int = OpTypePointer Output %int
%4 = OpConstantNull %int
%tint_symbol_1 = OpVariable %_ptr_Output_int Output %4
%uint = OpTypeInt 32 0
%_ptr_Output_uint = OpTypePointer Output %uint
%8 = OpConstantNull %uint
%tint_symbol_4 = OpVariable %_ptr_Output_uint Output %8
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%12 = OpConstantNull %float
%tint_symbol_7 = OpVariable %_ptr_Output_float Output %12
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%16 = OpConstantNull %v4float
%tint_symbol_10 = OpVariable %_ptr_Output_v4float Output %16
%void = OpTypeVoid
%17 = OpTypeFunction %void %int
%22 = OpTypeFunction %void
%int_1 = OpConstant %int 1
%27 = OpTypeFunction %void %uint
%uint_1 = OpConstant %uint 1
%35 = OpTypeFunction %void %float
%float_1 = OpConstant %float 1
%43 = OpTypeFunction %void %v4float
%float_2 = OpConstant %float 2
%float_3 = OpConstant %float 3
%float_4 = OpConstant %float 4
%53 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
%tint_symbol_2 = OpFunction %void None %17
%tint_symbol = OpFunctionParameter %int
%21 = OpLabel
OpStore %tint_symbol_1 %tint_symbol
OpReturn
OpFunctionEnd
%main0 = OpFunction %void None %22
%24 = OpLabel
%25 = OpFunctionCall %void %tint_symbol_2 %int_1
OpReturn
OpFunctionEnd
%tint_symbol_5 = OpFunction %void None %27
%tint_symbol_3 = OpFunctionParameter %uint
%30 = OpLabel
OpStore %tint_symbol_4 %tint_symbol_3
OpReturn
OpFunctionEnd
%main1 = OpFunction %void None %22
%32 = OpLabel
%33 = OpFunctionCall %void %tint_symbol_5 %uint_1
OpReturn
OpFunctionEnd
%tint_symbol_8 = OpFunction %void None %35
%tint_symbol_6 = OpFunctionParameter %float
%38 = OpLabel
OpStore %tint_symbol_7 %tint_symbol_6
OpReturn
OpFunctionEnd
%main2 = OpFunction %void None %22
%40 = OpLabel
%41 = OpFunctionCall %void %tint_symbol_8 %float_1
OpReturn
OpFunctionEnd
%tint_symbol_11 = OpFunction %void None %43
%tint_symbol_9 = OpFunctionParameter %v4float
%46 = OpLabel
OpStore %tint_symbol_10 %tint_symbol_9
OpReturn
OpFunctionEnd
%main3 = OpFunction %void None %22
%48 = OpLabel
%49 = OpFunctionCall %void %tint_symbol_11 %53
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,19 @@
[[stage(fragment)]]
fn main0() -> [[location(0)]] i32 {
return 1;
}
[[stage(fragment)]]
fn main1() -> [[location(1)]] u32 {
return 1u;
}
[[stage(fragment)]]
fn main2() -> [[location(2)]] f32 {
return 1.0;
}
[[stage(fragment)]]
fn main3() -> [[location(3)]] vec4<f32> {
return vec4<f32>(1.0, 2.0, 3.0, 4.0);
}

View File

@ -0,0 +1,11 @@
struct FragmentOutputs {
[[location(0)]] loc0 : i32;
[[location(1)]] loc1 : u32;
[[location(2)]] loc2 : f32;
[[location(3)]] loc3 : vec4<f32>;
};
[[stage(fragment)]]
fn main() -> FragmentOutputs {
return FragmentOutputs(1, 1u, 1.0, vec4<f32>(1.0, 2.0, 3.0, 4.0));
}

View File

@ -0,0 +1,19 @@
struct FragmentOutputs {
int loc0;
uint loc1;
float loc2;
float4 loc3;
};
struct tint_symbol {
int loc0 : SV_Target0;
uint loc1 : SV_Target1;
float loc2 : SV_Target2;
float4 loc3 : SV_Target3;
};
tint_symbol main() {
const FragmentOutputs tint_symbol_1 = {1, 1u, 1.0f, float4(1.0f, 2.0f, 3.0f, 4.0f)};
const tint_symbol tint_symbol_2 = {tint_symbol_1.loc0, tint_symbol_1.loc1, tint_symbol_1.loc2, tint_symbol_1.loc3};
return tint_symbol_2;
}

View File

@ -0,0 +1,22 @@
#include <metal_stdlib>
using namespace metal;
struct FragmentOutputs {
int loc0;
uint loc1;
float loc2;
float4 loc3;
};
struct tint_symbol_1 {
int loc0 [[color(0)]];
uint loc1 [[color(1)]];
float loc2 [[color(2)]];
float4 loc3 [[color(3)]];
};
fragment tint_symbol_1 tint_symbol() {
FragmentOutputs const tint_symbol_2 = {1, 1u, 1.0f, float4(1.0f, 2.0f, 3.0f, 4.0f)};
tint_symbol_1 const tint_symbol_3 = {tint_symbol_2.loc0, tint_symbol_2.loc1, tint_symbol_2.loc2, tint_symbol_2.loc3};
return tint_symbol_3;
}

View File

@ -0,0 +1,75 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 39
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2 %tint_symbol_3 %tint_symbol_4
OpExecutionMode %main OriginUpperLeft
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %FragmentOutputs "FragmentOutputs"
OpMemberName %FragmentOutputs 0 "loc0"
OpMemberName %FragmentOutputs 1 "loc1"
OpMemberName %FragmentOutputs 2 "loc2"
OpMemberName %FragmentOutputs 3 "loc3"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol "tint_symbol"
OpName %main "main"
OpDecorate %tint_symbol_1 Location 0
OpDecorate %tint_symbol_2 Location 1
OpDecorate %tint_symbol_3 Location 2
OpDecorate %tint_symbol_4 Location 3
OpMemberDecorate %FragmentOutputs 0 Offset 0
OpMemberDecorate %FragmentOutputs 1 Offset 4
OpMemberDecorate %FragmentOutputs 2 Offset 8
OpMemberDecorate %FragmentOutputs 3 Offset 16
%int = OpTypeInt 32 1
%_ptr_Output_int = OpTypePointer Output %int
%4 = OpConstantNull %int
%tint_symbol_1 = OpVariable %_ptr_Output_int Output %4
%uint = OpTypeInt 32 0
%_ptr_Output_uint = OpTypePointer Output %uint
%8 = OpConstantNull %uint
%tint_symbol_2 = OpVariable %_ptr_Output_uint Output %8
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%12 = OpConstantNull %float
%tint_symbol_3 = OpVariable %_ptr_Output_float Output %12
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%16 = OpConstantNull %v4float
%tint_symbol_4 = OpVariable %_ptr_Output_v4float Output %16
%void = OpTypeVoid
%FragmentOutputs = OpTypeStruct %int %uint %float %v4float
%17 = OpTypeFunction %void %FragmentOutputs
%27 = OpTypeFunction %void
%int_1 = OpConstant %int 1
%uint_1 = OpConstant %uint 1
%float_1 = OpConstant %float 1
%float_2 = OpConstant %float 2
%float_3 = OpConstant %float 3
%float_4 = OpConstant %float 4
%37 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
%38 = OpConstantComposite %FragmentOutputs %int_1 %uint_1 %float_1 %37
%tint_symbol_5 = OpFunction %void None %17
%tint_symbol = OpFunctionParameter %FragmentOutputs
%22 = OpLabel
%23 = OpCompositeExtract %int %tint_symbol 0
OpStore %tint_symbol_1 %23
%24 = OpCompositeExtract %uint %tint_symbol 1
OpStore %tint_symbol_2 %24
%25 = OpCompositeExtract %float %tint_symbol 2
OpStore %tint_symbol_3 %25
%26 = OpCompositeExtract %v4float %tint_symbol 3
OpStore %tint_symbol_4 %26
OpReturn
OpFunctionEnd
%main = OpFunction %void None %27
%29 = OpLabel
%30 = OpFunctionCall %void %tint_symbol_5 %38
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,15 @@
struct FragmentOutputs {
[[location(0)]]
loc0 : i32;
[[location(1)]]
loc1 : u32;
[[location(2)]]
loc2 : f32;
[[location(3)]]
loc3 : vec4<f32>;
};
[[stage(fragment)]]
fn main() -> FragmentOutputs {
return FragmentOutputs(1, 1u, 1.0, vec4<f32>(1.0, 2.0, 3.0, 4.0));
}

View File

@ -0,0 +1,13 @@
struct FragmentOutputs {
[[location(0)]] loc0 : i32;
[[builtin(frag_depth)]] frag_depth : f32;
[[location(1)]] loc1 : u32;
[[location(2)]] loc2 : f32;
[[builtin(sample_mask)]] sample_mask : u32;
[[location(3)]] loc3 : vec4<f32>;
};
[[stage(fragment)]]
fn main() -> FragmentOutputs {
return FragmentOutputs(1, 2.0, 1u, 1.0, 2u, vec4<f32>(1.0, 2.0, 3.0, 4.0));
}

View File

@ -0,0 +1,23 @@
struct FragmentOutputs {
int loc0;
float frag_depth;
uint loc1;
float loc2;
uint sample_mask;
float4 loc3;
};
struct tint_symbol {
int loc0 : SV_Target0;
uint loc1 : SV_Target1;
float loc2 : SV_Target2;
float4 loc3 : SV_Target3;
float frag_depth : SV_Depth;
uint sample_mask : SV_Coverage;
};
tint_symbol main() {
const FragmentOutputs tint_symbol_1 = {1, 2.0f, 1u, 1.0f, 2u, float4(1.0f, 2.0f, 3.0f, 4.0f)};
const tint_symbol tint_symbol_2 = {tint_symbol_1.loc0, tint_symbol_1.loc1, tint_symbol_1.loc2, tint_symbol_1.loc3, tint_symbol_1.frag_depth, tint_symbol_1.sample_mask};
return tint_symbol_2;
}

View File

@ -0,0 +1,26 @@
#include <metal_stdlib>
using namespace metal;
struct FragmentOutputs {
int loc0;
float frag_depth;
uint loc1;
float loc2;
uint sample_mask;
float4 loc3;
};
struct tint_symbol_1 {
int loc0 [[color(0)]];
uint loc1 [[color(1)]];
float loc2 [[color(2)]];
float4 loc3 [[color(3)]];
float frag_depth [[depth(any)]];
uint sample_mask [[sample_mask]];
};
fragment tint_symbol_1 tint_symbol() {
FragmentOutputs const tint_symbol_2 = {1, 2.0f, 1u, 1.0f, 2u, float4(1.0f, 2.0f, 3.0f, 4.0f)};
tint_symbol_1 const tint_symbol_3 = {tint_symbol_2.loc0, tint_symbol_2.loc1, tint_symbol_2.loc2, tint_symbol_2.loc3, tint_symbol_2.frag_depth, tint_symbol_2.sample_mask};
return tint_symbol_3;
}

View File

@ -0,0 +1,97 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 49
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2 %tint_symbol_3 %tint_symbol_4 %tint_symbol_5 %tint_symbol_6
OpExecutionMode %main OriginUpperLeft
OpExecutionMode %main DepthReplacing
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol_6 "tint_symbol_6"
OpName %FragmentOutputs "FragmentOutputs"
OpMemberName %FragmentOutputs 0 "loc0"
OpMemberName %FragmentOutputs 1 "frag_depth"
OpMemberName %FragmentOutputs 2 "loc1"
OpMemberName %FragmentOutputs 3 "loc2"
OpMemberName %FragmentOutputs 4 "sample_mask"
OpMemberName %FragmentOutputs 5 "loc3"
OpName %tint_symbol_7 "tint_symbol_7"
OpName %tint_symbol "tint_symbol"
OpName %main "main"
OpDecorate %tint_symbol_1 Location 0
OpDecorate %tint_symbol_2 BuiltIn FragDepth
OpDecorate %tint_symbol_3 Location 1
OpDecorate %tint_symbol_4 Location 2
OpDecorate %_arr_uint_uint_1 ArrayStride 4
OpDecorate %tint_symbol_5 BuiltIn SampleMask
OpDecorate %tint_symbol_6 Location 3
OpMemberDecorate %FragmentOutputs 0 Offset 0
OpMemberDecorate %FragmentOutputs 1 Offset 4
OpMemberDecorate %FragmentOutputs 2 Offset 8
OpMemberDecorate %FragmentOutputs 3 Offset 12
OpMemberDecorate %FragmentOutputs 4 Offset 16
OpMemberDecorate %FragmentOutputs 5 Offset 32
%int = OpTypeInt 32 1
%_ptr_Output_int = OpTypePointer Output %int
%4 = OpConstantNull %int
%tint_symbol_1 = OpVariable %_ptr_Output_int Output %4
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%8 = OpConstantNull %float
%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
%uint = OpTypeInt 32 0
%_ptr_Output_uint = OpTypePointer Output %uint
%12 = OpConstantNull %uint
%tint_symbol_3 = OpVariable %_ptr_Output_uint Output %12
%tint_symbol_4 = OpVariable %_ptr_Output_float Output %8
%uint_1 = OpConstant %uint 1
%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
%_ptr_Output__arr_uint_uint_1 = OpTypePointer Output %_arr_uint_uint_1
%18 = OpConstantNull %_arr_uint_uint_1
%tint_symbol_5 = OpVariable %_ptr_Output__arr_uint_uint_1 Output %18
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%22 = OpConstantNull %v4float
%tint_symbol_6 = OpVariable %_ptr_Output_v4float Output %22
%void = OpTypeVoid
%FragmentOutputs = OpTypeStruct %int %float %uint %float %uint %v4float
%23 = OpTypeFunction %void %FragmentOutputs
%int_0 = OpConstant %int 0
%37 = OpTypeFunction %void
%int_1 = OpConstant %int 1
%float_2 = OpConstant %float 2
%float_1 = OpConstant %float 1
%uint_2 = OpConstant %uint 2
%float_3 = OpConstant %float 3
%float_4 = OpConstant %float 4
%47 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
%48 = OpConstantComposite %FragmentOutputs %int_1 %float_2 %uint_1 %float_1 %uint_2 %47
%tint_symbol_7 = OpFunction %void None %23
%tint_symbol = OpFunctionParameter %FragmentOutputs
%28 = OpLabel
%29 = OpCompositeExtract %int %tint_symbol 0
OpStore %tint_symbol_1 %29
%30 = OpCompositeExtract %float %tint_symbol 1
OpStore %tint_symbol_2 %30
%31 = OpCompositeExtract %uint %tint_symbol 2
OpStore %tint_symbol_3 %31
%32 = OpCompositeExtract %float %tint_symbol 3
OpStore %tint_symbol_4 %32
%34 = OpAccessChain %_ptr_Output_uint %tint_symbol_5 %int_0
%35 = OpCompositeExtract %uint %tint_symbol 4
OpStore %34 %35
%36 = OpCompositeExtract %v4float %tint_symbol 5
OpStore %tint_symbol_6 %36
OpReturn
OpFunctionEnd
%main = OpFunction %void None %37
%39 = OpLabel
%40 = OpFunctionCall %void %tint_symbol_7 %48
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,19 @@
struct FragmentOutputs {
[[location(0)]]
loc0 : i32;
[[builtin(frag_depth)]]
frag_depth : f32;
[[location(1)]]
loc1 : u32;
[[location(2)]]
loc2 : f32;
[[builtin(sample_mask)]]
sample_mask : u32;
[[location(3)]]
loc3 : vec4<f32>;
};
[[stage(fragment)]]
fn main() -> FragmentOutputs {
return FragmentOutputs(1, 2.0, 1u, 1.0, 2u, vec4<f32>(1.0, 2.0, 3.0, 4.0));
}

View File

@ -0,0 +1,16 @@
struct Interface {
[[location(1)]] col1 : f32;
[[location(2)]] col2 : f32;
[[builtin(position)]] pos : vec4<f32>;
};
[[stage(vertex)]]
fn vert_main() -> Interface {
return Interface(0.4, 0.6, vec4<f32>());
}
[[stage(fragment)]]
fn frag_main(colors : Interface) {
let r : f32 = colors.col1;
let g : f32 = colors.col2;
}

View File

@ -0,0 +1,29 @@
struct Interface {
float col1;
float col2;
float4 pos;
};
struct tint_symbol {
float col1 : TEXCOORD1;
float col2 : TEXCOORD2;
float4 pos : SV_Position;
};
struct tint_symbol_3 {
float col1 : TEXCOORD1;
float col2 : TEXCOORD2;
float4 pos : SV_Position;
};
tint_symbol vert_main() {
const Interface tint_symbol_1 = {0.400000006f, 0.600000024f, float4(0.0f, 0.0f, 0.0f, 0.0f)};
const tint_symbol tint_symbol_4 = {tint_symbol_1.col1, tint_symbol_1.col2, tint_symbol_1.pos};
return tint_symbol_4;
}
void frag_main(tint_symbol_3 tint_symbol_2) {
const Interface colors = {tint_symbol_2.col1, tint_symbol_2.col2, tint_symbol_2.pos};
const float r = colors.col1;
const float g = colors.col2;
return;
}

View File

@ -0,0 +1,32 @@
#include <metal_stdlib>
using namespace metal;
struct Interface {
float col1;
float col2;
float4 pos;
};
struct tint_symbol {
float col1 [[user(locn1)]];
float col2 [[user(locn2)]];
float4 pos [[position]];
};
struct tint_symbol_3 {
float col1 [[user(locn1)]];
float col2 [[user(locn2)]];
float4 pos [[position]];
};
vertex tint_symbol vert_main() {
Interface const tint_symbol_1 = {0.400000006f, 0.600000024f, float4()};
tint_symbol const tint_symbol_4 = {tint_symbol_1.col1, tint_symbol_1.col2, tint_symbol_1.pos};
return tint_symbol_4;
}
fragment void frag_main(tint_symbol_3 tint_symbol_2 [[stage_in]]) {
Interface const colors = {tint_symbol_2.col1, tint_symbol_2.col2, tint_symbol_2.pos};
float const r = colors.col1;
float const g = colors.col2;
return;
}

View File

@ -0,0 +1,85 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 41
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vert_main "vert_main" %tint_pointsize %tint_symbol_1 %tint_symbol_2 %tint_symbol_3
OpEntryPoint Fragment %frag_main "frag_main" %tint_symbol_5 %tint_symbol_6 %tint_symbol_7
OpExecutionMode %frag_main OriginUpperLeft
OpName %tint_pointsize "tint_pointsize"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol_6 "tint_symbol_6"
OpName %tint_symbol_7 "tint_symbol_7"
OpName %Interface "Interface"
OpMemberName %Interface 0 "col1"
OpMemberName %Interface 1 "col2"
OpMemberName %Interface 2 "pos"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %tint_symbol "tint_symbol"
OpName %vert_main "vert_main"
OpName %frag_main "frag_main"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %tint_symbol_1 Location 1
OpDecorate %tint_symbol_2 Location 2
OpDecorate %tint_symbol_3 BuiltIn Position
OpDecorate %tint_symbol_5 Location 1
OpDecorate %tint_symbol_6 Location 2
OpDecorate %tint_symbol_7 BuiltIn FragCoord
OpMemberDecorate %Interface 0 Offset 0
OpMemberDecorate %Interface 1 Offset 4
OpMemberDecorate %Interface 2 Offset 16
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_pointsize = OpVariable %_ptr_Output_float Output %4
%tint_symbol_1 = OpVariable %_ptr_Output_float Output %4
%tint_symbol_2 = OpVariable %_ptr_Output_float Output %4
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%10 = OpConstantNull %v4float
%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %10
%_ptr_Input_float = OpTypePointer Input %float
%tint_symbol_5 = OpVariable %_ptr_Input_float Input
%tint_symbol_6 = OpVariable %_ptr_Input_float Input
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol_7 = OpVariable %_ptr_Input_v4float Input
%void = OpTypeVoid
%Interface = OpTypeStruct %float %float %v4float
%16 = OpTypeFunction %void %Interface
%25 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%float_0_400000006 = OpConstant %float 0.400000006
%float_0_600000024 = OpConstant %float 0.600000024
%32 = OpConstantComposite %Interface %float_0_400000006 %float_0_600000024 %10
%tint_symbol_4 = OpFunction %void None %16
%tint_symbol = OpFunctionParameter %Interface
%21 = OpLabel
%22 = OpCompositeExtract %float %tint_symbol 0
OpStore %tint_symbol_1 %22
%23 = OpCompositeExtract %float %tint_symbol 1
OpStore %tint_symbol_2 %23
%24 = OpCompositeExtract %v4float %tint_symbol 2
OpStore %tint_symbol_3 %24
OpReturn
OpFunctionEnd
%vert_main = OpFunction %void None %25
%27 = OpLabel
OpStore %tint_pointsize %float_1
%29 = OpFunctionCall %void %tint_symbol_4 %32
OpReturn
OpFunctionEnd
%frag_main = OpFunction %void None %25
%34 = OpLabel
%35 = OpLoad %float %tint_symbol_5
%36 = OpLoad %float %tint_symbol_6
%37 = OpLoad %v4float %tint_symbol_7
%38 = OpCompositeConstruct %Interface %35 %36 %37
%39 = OpCompositeExtract %float %38 0
%40 = OpCompositeExtract %float %38 1
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,19 @@
struct Interface {
[[location(1)]]
col1 : f32;
[[location(2)]]
col2 : f32;
[[builtin(position)]]
pos : vec4<f32>;
};
[[stage(vertex)]]
fn vert_main() -> Interface {
return Interface(0.400000006, 0.600000024, vec4<f32>());
}
[[stage(fragment)]]
fn frag_main(colors : Interface) {
let r : f32 = colors.col1;
let g : f32 = colors.col2;
}

View File

@ -0,0 +1,16 @@
struct VertexOutput {
[[builtin(position)]] pos : vec4<f32>;
[[location(0)]] loc0 : i32;
};
fn foo(x : f32) -> VertexOutput {
return VertexOutput(vec4<f32>(x, x, x, 1.0), 42);
}
fn vert_main1() -> VertexOutput {
return foo(0.5);
}
fn vert_main2() -> VertexOutput {
return foo(0.25);
}

View File

@ -0,0 +1,23 @@
struct VertexOutput {
float4 pos;
int loc0;
};
VertexOutput foo(float x) {
const VertexOutput tint_symbol = {float4(x, x, x, 1.0f), 42};
return tint_symbol;
}
VertexOutput vert_main1() {
return foo(0.5f);
}
VertexOutput vert_main2() {
return foo(0.25f);
}
[numthreads(1, 1, 1)]
void unused_entry_point() {
return;
}

View File

@ -0,0 +1,21 @@
#include <metal_stdlib>
using namespace metal;
struct VertexOutput {
float4 pos;
int loc0;
};
VertexOutput foo(float x) {
VertexOutput const tint_symbol = {float4(x, x, x, 1.0f), 42};
return tint_symbol;
}
VertexOutput vert_main1() {
return foo(0.5f);
}
VertexOutput vert_main2() {
return foo(0.25f);
}

View File

@ -0,0 +1,52 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 26
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
OpExecutionMode %unused_entry_point LocalSize 1 1 1
OpName %unused_entry_point "unused_entry_point"
OpName %VertexOutput "VertexOutput"
OpMemberName %VertexOutput 0 "pos"
OpMemberName %VertexOutput 1 "loc0"
OpName %foo "foo"
OpName %x "x"
OpName %vert_main1 "vert_main1"
OpName %vert_main2 "vert_main2"
OpMemberDecorate %VertexOutput 0 Offset 0
OpMemberDecorate %VertexOutput 1 Offset 16
%void = OpTypeVoid
%1 = OpTypeFunction %void
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%int = OpTypeInt 32 1
%VertexOutput = OpTypeStruct %v4float %int
%5 = OpTypeFunction %VertexOutput %float
%float_1 = OpConstant %float 1
%int_42 = OpConstant %int 42
%17 = OpTypeFunction %VertexOutput
%float_0_5 = OpConstant %float 0.5
%float_0_25 = OpConstant %float 0.25
%unused_entry_point = OpFunction %void None %1
%4 = OpLabel
OpReturn
OpFunctionEnd
%foo = OpFunction %VertexOutput None %5
%x = OpFunctionParameter %float
%12 = OpLabel
%14 = OpCompositeConstruct %v4float %x %x %x %float_1
%16 = OpCompositeConstruct %VertexOutput %14 %int_42
OpReturnValue %16
OpFunctionEnd
%vert_main1 = OpFunction %VertexOutput None %17
%19 = OpLabel
%20 = OpFunctionCall %VertexOutput %foo %float_0_5
OpReturnValue %20
OpFunctionEnd
%vert_main2 = OpFunction %VertexOutput None %17
%23 = OpLabel
%24 = OpFunctionCall %VertexOutput %foo %float_0_25
OpReturnValue %24
OpFunctionEnd

View File

@ -0,0 +1,18 @@
struct VertexOutput {
[[builtin(position)]]
pos : vec4<f32>;
[[location(0)]]
loc0 : i32;
};
fn foo(x : f32) -> VertexOutput {
return VertexOutput(vec4<f32>(x, x, x, 1.0), 42);
}
fn vert_main1() -> VertexOutput {
return foo(0.5);
}
fn vert_main2() -> VertexOutput {
return foo(0.25);
}

View File

@ -0,0 +1,17 @@
[[block]]
struct S {
[[align(64)]] [[location(0)]] f : f32;
[[size(32)]] [[location(1)]] u : u32;
[[align(128)]] [[builtin(position)]] v : vec4<f32>;
};
[[group(0), binding(0)]]
var<storage> output : [[access(write)]] S;
[[stage(fragment)]]
fn frag_main(input : S) {
let f : f32 = input.f;
let u : u32 = input.u;
let v : vec4<f32> = input.v;
output = input;
}

View File

@ -0,0 +1,28 @@
struct S {
float f;
uint u;
float4 v;
};
struct tint_symbol_1 {
float f : TEXCOORD0;
uint u : TEXCOORD1;
float4 v : SV_Position;
};
RWByteAddressBuffer output : register(u0, space0);
void tint_symbol_5(RWByteAddressBuffer buffer, uint offset, S value) {
buffer.Store((offset + 0u), asuint(value.f));
buffer.Store((offset + 4u), asuint(value.u));
buffer.Store4((offset + 128u), asuint(value.v));
}
void frag_main(tint_symbol_1 tint_symbol) {
const S input = {tint_symbol.f, tint_symbol.u, tint_symbol.v};
const float f = input.f;
const uint u = input.u;
const float4 v = input.v;
tint_symbol_5(output, 0u, input);
return;
}

View File

@ -0,0 +1 @@
SKIP: crbug.com/tint/853 type constructors broken with explicit layout structs

View File

@ -0,0 +1,54 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 24
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %frag_main "frag_main" %tint_symbol %tint_symbol_1 %tint_symbol_2
OpExecutionMode %frag_main OriginUpperLeft
OpName %S "S"
OpMemberName %S 0 "f"
OpMemberName %S 1 "u"
OpMemberName %S 2 "v"
OpName %output "output"
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %frag_main "frag_main"
OpDecorate %S Block
OpMemberDecorate %S 0 Offset 0
OpMemberDecorate %S 1 Offset 4
OpMemberDecorate %S 2 Offset 128
OpDecorate %output NonReadable
OpDecorate %output DescriptorSet 0
OpDecorate %output Binding 0
OpDecorate %tint_symbol Location 0
OpDecorate %tint_symbol_1 Location 1
OpDecorate %tint_symbol_2 BuiltIn FragCoord
%float = OpTypeFloat 32
%uint = OpTypeInt 32 0
%v4float = OpTypeVector %float 4
%S = OpTypeStruct %float %uint %v4float
%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
%output = OpVariable %_ptr_StorageBuffer_S StorageBuffer
%_ptr_Input_float = OpTypePointer Input %float
%tint_symbol = OpVariable %_ptr_Input_float Input
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_1 = OpVariable %_ptr_Input_uint Input
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol_2 = OpVariable %_ptr_Input_v4float Input
%void = OpTypeVoid
%13 = OpTypeFunction %void
%frag_main = OpFunction %void None %13
%16 = OpLabel
%17 = OpLoad %float %tint_symbol
%18 = OpLoad %uint %tint_symbol_1
%19 = OpLoad %v4float %tint_symbol_2
%20 = OpCompositeConstruct %S %17 %18 %19
%21 = OpCompositeExtract %float %20 0
%22 = OpCompositeExtract %uint %20 1
%23 = OpCompositeExtract %v4float %20 2
OpStore %output %20
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,19 @@
[[block]]
struct S {
[[align(64), location(0)]]
f : f32;
[[size(32), location(1)]]
u : u32;
[[align(128), builtin(position)]]
v : vec4<f32>;
};
[[group(0), binding(0)]] var<storage> output : [[access(write)]] S;
[[stage(fragment)]]
fn frag_main(input : S) {
let f : f32 = input.f;
let u : u32 = input.u;
let v : vec4<f32> = input.v;
output = input;
}

View File

@ -0,0 +1,8 @@
[[stage(vertex)]]
fn main(
[[builtin(vertex_index)]] vertex_index : u32,
[[builtin(instance_index)]] instance_index : u32,
) -> [[builtin(position)]] vec4<f32> {
let foo : u32 = vertex_index + instance_index;
return vec4<f32>();
}

View File

@ -0,0 +1,16 @@
struct tint_symbol_1 {
uint vertex_index : SV_VertexID;
uint instance_index : SV_InstanceID;
};
struct tint_symbol_2 {
float4 value : SV_Position;
};
tint_symbol_2 main(tint_symbol_1 tint_symbol) {
const uint vertex_index = tint_symbol.vertex_index;
const uint instance_index = tint_symbol.instance_index;
const uint foo = (vertex_index + instance_index);
const tint_symbol_2 tint_symbol_3 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
return tint_symbol_3;
}

View File

@ -0,0 +1 @@
SKIP: crbug.com/tint/817 attribute only applies to parameters

View File

@ -0,0 +1,50 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 26
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_1 %tint_symbol_3
OpName %tint_pointsize "tint_pointsize"
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %main "main"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %tint_symbol BuiltIn VertexIndex
OpDecorate %tint_symbol_1 BuiltIn InstanceIndex
OpDecorate %tint_symbol_3 BuiltIn Position
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_pointsize = OpVariable %_ptr_Output_float Output %4
%uint = OpTypeInt 32 0
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol = OpVariable %_ptr_Input_uint Input
%tint_symbol_1 = OpVariable %_ptr_Input_uint Input
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%12 = OpConstantNull %v4float
%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %12
%void = OpTypeVoid
%13 = OpTypeFunction %void %v4float
%18 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%tint_symbol_4 = OpFunction %void None %13
%tint_symbol_2 = OpFunctionParameter %v4float
%17 = OpLabel
OpStore %tint_symbol_3 %tint_symbol_2
OpReturn
OpFunctionEnd
%main = OpFunction %void None %18
%20 = OpLabel
OpStore %tint_pointsize %float_1
%22 = OpLoad %uint %tint_symbol
%23 = OpLoad %uint %tint_symbol_1
%24 = OpIAdd %uint %22 %23
%25 = OpFunctionCall %void %tint_symbol_4 %12
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,5 @@
[[stage(vertex)]]
fn main([[builtin(vertex_index)]] vertex_index : u32, [[builtin(instance_index)]] instance_index : u32) -> [[builtin(position)]] vec4<f32> {
let foo : u32 = (vertex_index + instance_index);
return vec4<f32>();
}

View File

@ -0,0 +1,10 @@
struct VertexInputs {
[[builtin(vertex_index)]] vertex_index : u32;
[[builtin(instance_index)]] instance_index : u32;
};
[[stage(vertex)]]
fn main(inputs : VertexInputs) -> [[builtin(position)]] vec4<f32> {
let foo : u32 = inputs.vertex_index + inputs.instance_index;
return vec4<f32>();
}

View File

@ -0,0 +1,19 @@
struct VertexInputs {
uint vertex_index;
uint instance_index;
};
struct tint_symbol_1 {
uint vertex_index : SV_VertexID;
uint instance_index : SV_InstanceID;
};
struct tint_symbol_2 {
float4 value : SV_Position;
};
tint_symbol_2 main(tint_symbol_1 tint_symbol) {
const VertexInputs inputs = {tint_symbol.vertex_index, tint_symbol.instance_index};
const uint foo = (inputs.vertex_index + inputs.instance_index);
const tint_symbol_2 tint_symbol_3 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
return tint_symbol_3;
}

View File

@ -0,0 +1 @@
SKIP: crbug.com/tint/817 attribute only applies to parameters

View File

@ -0,0 +1,59 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 30
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_1 %tint_symbol_4
OpName %tint_pointsize "tint_pointsize"
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %main "main"
OpName %VertexInputs "VertexInputs"
OpMemberName %VertexInputs 0 "vertex_index"
OpMemberName %VertexInputs 1 "instance_index"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %tint_symbol BuiltIn VertexIndex
OpDecorate %tint_symbol_1 BuiltIn InstanceIndex
OpDecorate %tint_symbol_4 BuiltIn Position
OpMemberDecorate %VertexInputs 0 Offset 0
OpMemberDecorate %VertexInputs 1 Offset 4
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_pointsize = OpVariable %_ptr_Output_float Output %4
%uint = OpTypeInt 32 0
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol = OpVariable %_ptr_Input_uint Input
%tint_symbol_1 = OpVariable %_ptr_Input_uint Input
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%12 = OpConstantNull %v4float
%tint_symbol_4 = OpVariable %_ptr_Output_v4float Output %12
%void = OpTypeVoid
%13 = OpTypeFunction %void %v4float
%18 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%VertexInputs = OpTypeStruct %uint %uint
%tint_symbol_5 = OpFunction %void None %13
%tint_symbol_3 = OpFunctionParameter %v4float
%17 = OpLabel
OpStore %tint_symbol_4 %tint_symbol_3
OpReturn
OpFunctionEnd
%main = OpFunction %void None %18
%20 = OpLabel
OpStore %tint_pointsize %float_1
%23 = OpLoad %uint %tint_symbol
%24 = OpLoad %uint %tint_symbol_1
%25 = OpCompositeConstruct %VertexInputs %23 %24
%26 = OpCompositeExtract %uint %25 0
%27 = OpCompositeExtract %uint %25 1
%28 = OpIAdd %uint %26 %27
%29 = OpFunctionCall %void %tint_symbol_5 %12
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,12 @@
struct VertexInputs {
[[builtin(vertex_index)]]
vertex_index : u32;
[[builtin(instance_index)]]
instance_index : u32;
};
[[stage(vertex)]]
fn main(inputs : VertexInputs) -> [[builtin(position)]] vec4<f32> {
let foo : u32 = (inputs.vertex_index + inputs.instance_index);
return vec4<f32>();
}

View File

@ -0,0 +1,13 @@
[[stage(vertex)]]
fn main(
[[location(0)]] loc0 : i32,
[[location(1)]] loc1 : u32,
[[location(2)]] loc2 : f32,
[[location(3)]] loc3 : vec4<f32>,
) -> [[builtin(position)]] vec4<f32> {
let i : i32 = loc0;
let u : u32 = loc1;
let f : f32 = loc2;
let v : vec4<f32> = loc3;
return vec4<f32>();
}

View File

@ -0,0 +1,23 @@
struct tint_symbol_1 {
int loc0 : TEXCOORD0;
uint loc1 : TEXCOORD1;
float loc2 : TEXCOORD2;
float4 loc3 : TEXCOORD3;
};
struct tint_symbol_2 {
float4 value : SV_Position;
};
tint_symbol_2 main(tint_symbol_1 tint_symbol) {
const int loc0 = tint_symbol.loc0;
const uint loc1 = tint_symbol.loc1;
const float loc2 = tint_symbol.loc2;
const float4 loc3 = tint_symbol.loc3;
const int i = loc0;
const uint u = loc1;
const float f = loc2;
const float4 v = loc3;
const tint_symbol_2 tint_symbol_3 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
return tint_symbol_3;
}

View File

@ -0,0 +1,26 @@
#include <metal_stdlib>
using namespace metal;
struct tint_symbol_2 {
int loc0 [[attribute(0)]];
uint loc1 [[attribute(1)]];
float loc2 [[attribute(2)]];
float4 loc3 [[attribute(3)]];
};
struct tint_symbol_3 {
float4 value [[position]];
};
vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
int const loc0 = tint_symbol_1.loc0;
uint const loc1 = tint_symbol_1.loc1;
float const loc2 = tint_symbol_1.loc2;
float4 const loc3 = tint_symbol_1.loc3;
int const i = loc0;
uint const u = loc1;
float const f = loc2;
float4 const v = loc3;
tint_symbol_3 const tint_symbol_4 = {float4()};
return tint_symbol_4;
}

View File

@ -0,0 +1,61 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 33
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_1 %tint_symbol_2 %tint_symbol_3 %tint_symbol_5
OpName %tint_pointsize "tint_pointsize"
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol_6 "tint_symbol_6"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %main "main"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %tint_symbol Location 0
OpDecorate %tint_symbol_1 Location 1
OpDecorate %tint_symbol_2 Location 2
OpDecorate %tint_symbol_3 Location 3
OpDecorate %tint_symbol_5 BuiltIn Position
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_pointsize = OpVariable %_ptr_Output_float Output %4
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%tint_symbol = OpVariable %_ptr_Input_int Input
%uint = OpTypeInt 32 0
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_1 = OpVariable %_ptr_Input_uint Input
%_ptr_Input_float = OpTypePointer Input %float
%tint_symbol_2 = OpVariable %_ptr_Input_float Input
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol_3 = OpVariable %_ptr_Input_v4float Input
%_ptr_Output_v4float = OpTypePointer Output %v4float
%18 = OpConstantNull %v4float
%tint_symbol_5 = OpVariable %_ptr_Output_v4float Output %18
%void = OpTypeVoid
%19 = OpTypeFunction %void %v4float
%24 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%tint_symbol_6 = OpFunction %void None %19
%tint_symbol_4 = OpFunctionParameter %v4float
%23 = OpLabel
OpStore %tint_symbol_5 %tint_symbol_4
OpReturn
OpFunctionEnd
%main = OpFunction %void None %24
%26 = OpLabel
OpStore %tint_pointsize %float_1
%28 = OpLoad %int %tint_symbol
%29 = OpLoad %uint %tint_symbol_1
%30 = OpLoad %float %tint_symbol_2
%31 = OpLoad %v4float %tint_symbol_3
%32 = OpFunctionCall %void %tint_symbol_6 %18
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,8 @@
[[stage(vertex)]]
fn main([[location(0)]] loc0 : i32, [[location(1)]] loc1 : u32, [[location(2)]] loc2 : f32, [[location(3)]] loc3 : vec4<f32>) -> [[builtin(position)]] vec4<f32> {
let i : i32 = loc0;
let u : u32 = loc1;
let f : f32 = loc2;
let v : vec4<f32> = loc3;
return vec4<f32>();
}

View File

@ -0,0 +1,15 @@
struct VertexInputs {
[[location(0)]] loc0 : i32;
[[location(1)]] loc1 : u32;
[[location(2)]] loc2 : f32;
[[location(3)]] loc3 : vec4<f32>;
};
[[stage(vertex)]]
fn main(inputs : VertexInputs) -> [[builtin(position)]] vec4<f32> {
let i : i32 = inputs.loc0;
let u : u32 = inputs.loc1;
let f : f32 = inputs.loc2;
let v : vec4<f32> = inputs.loc3;
return vec4<f32>();
}

View File

@ -0,0 +1,26 @@
struct VertexInputs {
int loc0;
uint loc1;
float loc2;
float4 loc3;
};
struct tint_symbol_1 {
int loc0 : TEXCOORD0;
uint loc1 : TEXCOORD1;
float loc2 : TEXCOORD2;
float4 loc3 : TEXCOORD3;
};
struct tint_symbol_2 {
float4 value : SV_Position;
};
tint_symbol_2 main(tint_symbol_1 tint_symbol) {
const VertexInputs inputs = {tint_symbol.loc0, tint_symbol.loc1, tint_symbol.loc2, tint_symbol.loc3};
const int i = inputs.loc0;
const uint u = inputs.loc1;
const float f = inputs.loc2;
const float4 v = inputs.loc3;
const tint_symbol_2 tint_symbol_3 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
return tint_symbol_3;
}

View File

@ -0,0 +1,29 @@
#include <metal_stdlib>
using namespace metal;
struct VertexInputs {
int loc0;
uint loc1;
float loc2;
float4 loc3;
};
struct tint_symbol_2 {
int loc0 [[attribute(0)]];
uint loc1 [[attribute(1)]];
float loc2 [[attribute(2)]];
float4 loc3 [[attribute(3)]];
};
struct tint_symbol_3 {
float4 value [[position]];
};
vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
VertexInputs const inputs = {tint_symbol_1.loc0, tint_symbol_1.loc1, tint_symbol_1.loc2, tint_symbol_1.loc3};
int const i = inputs.loc0;
uint const u = inputs.loc1;
float const f = inputs.loc2;
float4 const v = inputs.loc3;
tint_symbol_3 const tint_symbol_4 = {float4()};
return tint_symbol_4;
}

View File

@ -0,0 +1,76 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 39
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_1 %tint_symbol_2 %tint_symbol_3 %tint_symbol_6
OpName %tint_pointsize "tint_pointsize"
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol_6 "tint_symbol_6"
OpName %tint_symbol_7 "tint_symbol_7"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %main "main"
OpName %VertexInputs "VertexInputs"
OpMemberName %VertexInputs 0 "loc0"
OpMemberName %VertexInputs 1 "loc1"
OpMemberName %VertexInputs 2 "loc2"
OpMemberName %VertexInputs 3 "loc3"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %tint_symbol Location 0
OpDecorate %tint_symbol_1 Location 1
OpDecorate %tint_symbol_2 Location 2
OpDecorate %tint_symbol_3 Location 3
OpDecorate %tint_symbol_6 BuiltIn Position
OpMemberDecorate %VertexInputs 0 Offset 0
OpMemberDecorate %VertexInputs 1 Offset 4
OpMemberDecorate %VertexInputs 2 Offset 8
OpMemberDecorate %VertexInputs 3 Offset 16
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_pointsize = OpVariable %_ptr_Output_float Output %4
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%tint_symbol = OpVariable %_ptr_Input_int Input
%uint = OpTypeInt 32 0
%_ptr_Input_uint = OpTypePointer Input %uint
%tint_symbol_1 = OpVariable %_ptr_Input_uint Input
%_ptr_Input_float = OpTypePointer Input %float
%tint_symbol_2 = OpVariable %_ptr_Input_float Input
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol_3 = OpVariable %_ptr_Input_v4float Input
%_ptr_Output_v4float = OpTypePointer Output %v4float
%18 = OpConstantNull %v4float
%tint_symbol_6 = OpVariable %_ptr_Output_v4float Output %18
%void = OpTypeVoid
%19 = OpTypeFunction %void %v4float
%24 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%VertexInputs = OpTypeStruct %int %uint %float %v4float
%tint_symbol_7 = OpFunction %void None %19
%tint_symbol_5 = OpFunctionParameter %v4float
%23 = OpLabel
OpStore %tint_symbol_6 %tint_symbol_5
OpReturn
OpFunctionEnd
%main = OpFunction %void None %24
%26 = OpLabel
OpStore %tint_pointsize %float_1
%29 = OpLoad %int %tint_symbol
%30 = OpLoad %uint %tint_symbol_1
%31 = OpLoad %float %tint_symbol_2
%32 = OpLoad %v4float %tint_symbol_3
%33 = OpCompositeConstruct %VertexInputs %29 %30 %31 %32
%34 = OpCompositeExtract %int %33 0
%35 = OpCompositeExtract %uint %33 1
%36 = OpCompositeExtract %float %33 2
%37 = OpCompositeExtract %v4float %33 3
%38 = OpFunctionCall %void %tint_symbol_7 %18
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,19 @@
struct VertexInputs {
[[location(0)]]
loc0 : i32;
[[location(1)]]
loc1 : u32;
[[location(2)]]
loc2 : f32;
[[location(3)]]
loc3 : vec4<f32>;
};
[[stage(vertex)]]
fn main(inputs : VertexInputs) -> [[builtin(position)]] vec4<f32> {
let i : i32 = inputs.loc0;
let u : u32 = inputs.loc1;
let f : f32 = inputs.loc2;
let v : vec4<f32> = inputs.loc3;
return vec4<f32>();
}

Some files were not shown because too many files have changed in this diff Show More