test: Generate expected output for all tests

The expected output is far from perfect, and the generated HLSL and MSL
isn't even validated yet, so may be incorrect.

However, by committing the generated output, we get clear examples of
the currently generated output of each backend. As we land fixes and
improvements to each backend, the presubmits will require us to update
the expected test output, and so code reviews will include diffs of
each backend's generated output.

Change-Id: I5c2a9e5b796d0ab75b3ec4c7f8ad00a0a2ab166f
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51224
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Reviewed-by: David Neto <dneto@google.com>
This commit is contained in:
Ben Clayton 2021-05-18 09:24:18 +00:00 committed by Commit Bot service account
parent 5858dcc313
commit d1232670ae
29 changed files with 2938 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,12 @@
void foo() {
int tint_symbol[2] = {0, 0};
int implict[2] = {0, 0};
implict = tint_symbol;
}
[numthreads(1, 1, 1)]
void unused_entry_point() {
return;
}

View File

@ -0,0 +1,10 @@
#include <metal_stdlib>
using namespace metal;
void foo() {
int tint_symbol[2] = {0};
int implict[2] = {0};
implict = tint_symbol;
}

View File

@ -0,0 +1,34 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 16
; 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 %foo "foo"
OpName %explicit "explicit"
OpName %implict "implict"
OpDecorate %_arr_int_uint_2 ArrayStride 4
%void = OpTypeVoid
%1 = OpTypeFunction %void
%int = OpTypeInt 32 1
%uint = OpTypeInt 32 0
%uint_2 = OpConstant %uint 2
%_arr_int_uint_2 = OpTypeArray %int %uint_2
%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
%13 = OpConstantNull %_arr_int_uint_2
%unused_entry_point = OpFunction %void None %1
%4 = OpLabel
OpReturn
OpFunctionEnd
%foo = OpFunction %void None %1
%6 = OpLabel
%explicit = OpVariable %_ptr_Function__arr_int_uint_2 Function %13
%implict = OpVariable %_ptr_Function__arr_int_uint_2 Function %13
%15 = OpLoad %_arr_int_uint_2 %explicit
OpStore %implict %15
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,9 @@
type ArrayExplicitStride = [[stride(4)]] array<i32, 2>;
type ArrayImplicitStride = array<i32, 2>;
fn foo() {
var explicit : ArrayExplicitStride;
var implict : ArrayImplicitStride;
implict = explicit;
}

View File

@ -0,0 +1,118 @@
struct tint_symbol_1 {
float2 a_particlePos : TEXCOORD0;
float2 a_particleVel : TEXCOORD1;
float2 a_pos : TEXCOORD2;
};
struct tint_symbol_2 {
float4 value : SV_Position;
};
struct tint_symbol_3 {
float4 value : SV_Target0;
};
struct SimParams {
float deltaT;
float rule1Distance;
float rule2Distance;
float rule3Distance;
float rule1Scale;
float rule2Scale;
float rule3Scale;
};
struct tint_symbol_5 {
uint3 gl_GlobalInvocationID : SV_DispatchThreadID;
};
ConstantBuffer<SimParams> params : register(b0, space0);
RWByteAddressBuffer particlesA : register(u1, space0);
RWByteAddressBuffer particlesB : register(u2, space0);
tint_symbol_2 vert_main(tint_symbol_1 tint_symbol) {
const float2 a_particlePos = tint_symbol.a_particlePos;
const float2 a_particleVel = tint_symbol.a_particleVel;
const float2 a_pos = tint_symbol.a_pos;
float angle = -( atan2(a_particleVel.x, a_particleVel.y));
float2 pos = float2(((a_pos.x * cos(angle)) - (a_pos.y * sin(angle))), ((a_pos.x * sin(angle)) + (a_pos.y * cos(angle))));
const tint_symbol_2 tint_symbol_8 = {float4((pos + a_particlePos), 0.0f, 1.0f)};
return tint_symbol_8;
}
tint_symbol_3 frag_main() {
const tint_symbol_3 tint_symbol_9 = {float4(1.0f, 1.0f, 1.0f, 1.0f)};
return tint_symbol_9;
}
[numthreads(1, 1, 1)]
void comp_main(tint_symbol_5 tint_symbol_4) {
const uint3 gl_GlobalInvocationID = tint_symbol_4.gl_GlobalInvocationID;
uint index = gl_GlobalInvocationID.x;
if ((index >= 5u)) {
return;
}
float2 vPos = asfloat(particlesA.Load2((16u * index)));
float2 vVel = asfloat(particlesA.Load2(((16u * index) + 8u)));
float2 cMass = float2(0.0f, 0.0f);
float2 cVel = float2(0.0f, 0.0f);
float2 colVel = float2(0.0f, 0.0f);
int cMassCount = 0;
int cVelCount = 0;
float2 pos = float2(0.0f, 0.0f);
float2 vel = float2(0.0f, 0.0f);
{
uint i = 0u;
{
bool tint_hlsl_is_first_1 = true;
for(;;) {
if (!tint_hlsl_is_first_1) {
i = (i + 1u);
}
tint_hlsl_is_first_1 = false;
if (!((i < 5u))) {
break;
}
if ((i == index)) {
continue;
}
pos = asfloat(particlesA.Load2((16u * i))).xy;
vel = asfloat(particlesA.Load2(((16u * i) + 8u))).xy;
if (( distance(pos, vPos) < params.rule1Distance)) {
cMass = (cMass + pos);
cMassCount = (cMassCount + 1);
}
if (( distance(pos, vPos) < params.rule2Distance)) {
colVel = (colVel - (pos - vPos));
}
if (( distance(pos, vPos) < params.rule3Distance)) {
cVel = (cVel + vel);
cVelCount = (cVelCount + 1);
}
}
}
}
if ((cMassCount > 0)) {
cMass = ((cMass / float2(float(cMassCount), float(cMassCount))) - vPos);
}
if ((cVelCount > 0)) {
cVel = (cVel / float2(float(cVelCount), float(cVelCount)));
}
vVel = (((vVel + (cMass * params.rule1Scale)) + (colVel * params.rule2Scale)) + (cVel * params.rule3Scale));
vVel = ( normalize(vVel) * clamp( length(vVel), 0.0f, 0.100000001f));
vPos = (vPos + (vVel * params.deltaT));
if ((vPos.x < -1.0f)) {
vPos.x = 1.0f;
}
if ((vPos.x > 1.0f)) {
vPos.x = -1.0f;
}
if ((vPos.y < -1.0f)) {
vPos.y = 1.0f;
}
if ((vPos.y > 1.0f)) {
vPos.y = -1.0f;
}
particlesB.Store2((16u * index), asuint(vPos));
particlesB.Store2(((16u * index) + 8u), asuint(vVel));
return;
}

View File

@ -0,0 +1,120 @@
#include <metal_stdlib>
using namespace metal;
struct tint_symbol_1 {
float2 a_particlePos [[attribute(0)]];
float2 a_particleVel [[attribute(1)]];
float2 a_pos [[attribute(2)]];
};
struct tint_symbol_2 {
float4 value [[position]];
};
struct tint_symbol_3 {
float4 value [[color(0)]];
};
struct Particle {
/* 0x0000 */ packed_float2 pos;
/* 0x0008 */ packed_float2 vel;
};
struct SimParams {
/* 0x0000 */ float deltaT;
/* 0x0004 */ float rule1Distance;
/* 0x0008 */ float rule2Distance;
/* 0x000c */ float rule3Distance;
/* 0x0010 */ float rule1Scale;
/* 0x0014 */ float rule2Scale;
/* 0x0018 */ float rule3Scale;
};
struct Particles {
/* 0x0000 */ Particle particles[5];
};
struct tint_symbol_5 {
uint3 gl_GlobalInvocationID [[thread_position_in_grid]];
};
vertex tint_symbol_2 vert_main(tint_symbol_1 tint_symbol [[stage_in]]) {
const float2 a_particlePos = tint_symbol.a_particlePos;
const float2 a_particleVel = tint_symbol.a_particleVel;
const float2 a_pos = tint_symbol.a_pos;
float angle = -( atan2(a_particleVel.x, a_particleVel.y));
float2 pos = float2(((a_pos.x * cos(angle)) - (a_pos.y * sin(angle))), ((a_pos.x * sin(angle)) + (a_pos.y * cos(angle))));
return {float4((pos + a_particlePos), 0.0f, 1.0f)};
}
fragment tint_symbol_3 frag_main() {
return {float4(1.0f, 1.0f, 1.0f, 1.0f)};
}
kernel void comp_main(tint_symbol_5 tint_symbol_4 [[stage_in]], constant SimParams& params [[buffer(0)]], device Particles& particlesA [[buffer(1)]], device Particles& particlesB [[buffer(2)]]) {
const uint3 gl_GlobalInvocationID = tint_symbol_4.gl_GlobalInvocationID;
uint index = gl_GlobalInvocationID.x;
if ((index >= 5u)) {
return;
}
float2 vPos = particlesA.particles[index].pos;
float2 vVel = particlesA.particles[index].vel;
float2 cMass = float2(0.0f, 0.0f);
float2 cVel = float2(0.0f, 0.0f);
float2 colVel = float2(0.0f, 0.0f);
int cMassCount = 0;
int cVelCount = 0;
float2 pos = 0.0f;
float2 vel = 0.0f;
{
uint i = 0u;
{
bool tint_msl_is_first_1 = true;
for(;;) {
if (!tint_msl_is_first_1) {
i = (i + 1u);
}
tint_msl_is_first_1 = false;
if (!((i < 5u))) {
break;
}
if ((i == index)) {
continue;
}
pos = particlesA.particles[i].pos.xy;
vel = particlesA.particles[i].vel.xy;
if (( distance(pos, vPos) < params.rule1Distance)) {
cMass = (cMass + pos);
cMassCount = (cMassCount + 1);
}
if (( distance(pos, vPos) < params.rule2Distance)) {
colVel = (colVel - (pos - vPos));
}
if (( distance(pos, vPos) < params.rule3Distance)) {
cVel = (cVel + vel);
cVelCount = (cVelCount + 1);
}
}
}
}
if ((cMassCount > 0)) {
cMass = ((cMass / float2(float(cMassCount), float(cMassCount))) - vPos);
}
if ((cVelCount > 0)) {
cVel = (cVel / float2(float(cVelCount), float(cVelCount)));
}
vVel = (((vVel + (cMass * params.rule1Scale)) + (colVel * params.rule2Scale)) + (cVel * params.rule3Scale));
vVel = ( normalize(vVel) * clamp( length(vVel), 0.0f, 0.100000001f));
vPos = (vPos + (vVel * params.deltaT));
if ((vPos.x < -1.0f)) {
vPos.x = 1.0f;
}
if ((vPos.x > 1.0f)) {
vPos.x = -1.0f;
}
if ((vPos.y < -1.0f)) {
vPos.y = 1.0f;
}
if ((vPos.y > 1.0f)) {
vPos.y = -1.0f;
}
particlesB.particles[index].pos = vPos;
particlesB.particles[index].vel = vVel;
return;
}

View File

@ -0,0 +1,443 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 279
; Schema: 0
OpCapability Shader
%40 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vert_main "vert_main" %tint_pointsize %tint_symbol_1 %tint_symbol_2 %tint_symbol %tint_symbol_4
OpEntryPoint Fragment %frag_main "frag_main" %tint_symbol_7
OpEntryPoint GLCompute %comp_main "comp_main" %tint_symbol_9
OpExecutionMode %frag_main OriginUpperLeft
OpExecutionMode %comp_main LocalSize 1 1 1
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_4 "tint_symbol_4"
OpName %tint_symbol_7 "tint_symbol_7"
OpName %SimParams "SimParams"
OpMemberName %SimParams 0 "deltaT"
OpMemberName %SimParams 1 "rule1Distance"
OpMemberName %SimParams 2 "rule2Distance"
OpMemberName %SimParams 3 "rule3Distance"
OpMemberName %SimParams 4 "rule1Scale"
OpMemberName %SimParams 5 "rule2Scale"
OpMemberName %SimParams 6 "rule3Scale"
OpName %params "params"
OpName %Particles "Particles"
OpMemberName %Particles 0 "particles"
OpName %Particle "Particle"
OpMemberName %Particle 0 "pos"
OpMemberName %Particle 1 "vel"
OpName %particlesA "particlesA"
OpName %particlesB "particlesB"
OpName %tint_symbol_9 "tint_symbol_9"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %vert_main "vert_main"
OpName %angle "angle"
OpName %pos "pos"
OpName %tint_symbol_8 "tint_symbol_8"
OpName %tint_symbol_6 "tint_symbol_6"
OpName %frag_main "frag_main"
OpName %comp_main "comp_main"
OpName %index "index"
OpName %vPos "vPos"
OpName %vVel "vVel"
OpName %cMass "cMass"
OpName %cVel "cVel"
OpName %colVel "colVel"
OpName %cMassCount "cMassCount"
OpName %cVelCount "cVelCount"
OpName %pos_0 "pos"
OpName %vel "vel"
OpName %i "i"
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_4 BuiltIn Position
OpDecorate %tint_symbol_7 Location 0
OpDecorate %SimParams Block
OpMemberDecorate %SimParams 0 Offset 0
OpMemberDecorate %SimParams 1 Offset 4
OpMemberDecorate %SimParams 2 Offset 8
OpMemberDecorate %SimParams 3 Offset 12
OpMemberDecorate %SimParams 4 Offset 16
OpMemberDecorate %SimParams 5 Offset 20
OpMemberDecorate %SimParams 6 Offset 24
OpDecorate %params Binding 0
OpDecorate %params DescriptorSet 0
OpDecorate %Particles Block
OpMemberDecorate %Particles 0 Offset 0
OpMemberDecorate %Particle 0 Offset 0
OpMemberDecorate %Particle 1 Offset 8
OpDecorate %_arr_Particle_uint_5 ArrayStride 16
OpDecorate %particlesA Binding 1
OpDecorate %particlesA DescriptorSet 0
OpDecorate %particlesB Binding 2
OpDecorate %particlesB DescriptorSet 0
OpDecorate %tint_symbol_9 BuiltIn GlobalInvocationId
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_pointsize = OpVariable %_ptr_Output_float Output %4
%v2float = OpTypeVector %float 2
%_ptr_Input_v2float = OpTypePointer Input %v2float
%tint_symbol = OpVariable %_ptr_Input_v2float Input
%tint_symbol_1 = OpVariable %_ptr_Input_v2float Input
%tint_symbol_2 = OpVariable %_ptr_Input_v2float Input
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%13 = OpConstantNull %v4float
%tint_symbol_4 = OpVariable %_ptr_Output_v4float Output %13
%tint_symbol_7 = OpVariable %_ptr_Output_v4float Output %13
%SimParams = OpTypeStruct %float %float %float %float %float %float %float
%_ptr_Uniform_SimParams = OpTypePointer Uniform %SimParams
%params = OpVariable %_ptr_Uniform_SimParams Uniform
%Particle = OpTypeStruct %v2float %v2float
%uint = OpTypeInt 32 0
%uint_5 = OpConstant %uint 5
%_arr_Particle_uint_5 = OpTypeArray %Particle %uint_5
%Particles = OpTypeStruct %_arr_Particle_uint_5
%_ptr_StorageBuffer_Particles = OpTypePointer StorageBuffer %Particles
%particlesA = OpVariable %_ptr_StorageBuffer_Particles StorageBuffer
%particlesB = OpVariable %_ptr_StorageBuffer_Particles StorageBuffer
%v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%tint_symbol_9 = OpVariable %_ptr_Input_v3uint Input
%void = OpTypeVoid
%29 = OpTypeFunction %void %v4float
%34 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%uint_0 = OpConstant %uint 0
%_ptr_Input_float = OpTypePointer Input %float
%uint_1 = OpConstant %uint 1
%_ptr_Function_float = OpTypePointer Function %float
%_ptr_Function_v2float = OpTypePointer Function %v2float
%75 = OpConstantNull %v2float
%float_0 = OpConstant %float 0
%90 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%_ptr_Input_uint = OpTypePointer Input %uint
%_ptr_Function_uint = OpTypePointer Function %uint
%98 = OpConstantNull %uint
%bool = OpTypeBool
%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
%113 = OpConstantComposite %v2float %float_0 %float_0
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%_ptr_Function_int = OpTypePointer Function %int
%121 = OpConstantNull %int
%_ptr_Uniform_float = OpTypePointer Uniform %float
%int_1 = OpConstant %int 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_4 = OpConstant %uint 4
%uint_6 = OpConstant %uint 6
%float_0_100000001 = OpConstant %float 0.100000001
%float_n1 = OpConstant %float -1
%tint_symbol_5 = OpFunction %void None %29
%tint_symbol_3 = OpFunctionParameter %v4float
%33 = OpLabel
OpStore %tint_symbol_4 %tint_symbol_3
OpReturn
OpFunctionEnd
%vert_main = OpFunction %void None %34
%36 = OpLabel
%angle = OpVariable %_ptr_Function_float Function %4
%pos = OpVariable %_ptr_Function_v2float Function %75
OpStore %tint_pointsize %float_1
%43 = OpAccessChain %_ptr_Input_float %tint_symbol_1 %uint_0
%44 = OpLoad %float %43
%46 = OpAccessChain %_ptr_Input_float %tint_symbol_1 %uint_1
%47 = OpLoad %float %46
%39 = OpExtInst %float %40 Atan2 %44 %47
%38 = OpFNegate %float %39
OpStore %angle %38
%50 = OpAccessChain %_ptr_Input_float %tint_symbol_2 %uint_0
%51 = OpLoad %float %50
%53 = OpLoad %float %angle
%52 = OpExtInst %float %40 Cos %53
%54 = OpFMul %float %51 %52
%55 = OpAccessChain %_ptr_Input_float %tint_symbol_2 %uint_1
%56 = OpLoad %float %55
%58 = OpLoad %float %angle
%57 = OpExtInst %float %40 Sin %58
%59 = OpFMul %float %56 %57
%60 = OpFSub %float %54 %59
%61 = OpAccessChain %_ptr_Input_float %tint_symbol_2 %uint_0
%62 = OpLoad %float %61
%64 = OpLoad %float %angle
%63 = OpExtInst %float %40 Sin %64
%65 = OpFMul %float %62 %63
%66 = OpAccessChain %_ptr_Input_float %tint_symbol_2 %uint_1
%67 = OpLoad %float %66
%69 = OpLoad %float %angle
%68 = OpExtInst %float %40 Cos %69
%70 = OpFMul %float %67 %68
%71 = OpFAdd %float %65 %70
%72 = OpCompositeConstruct %v2float %60 %71
OpStore %pos %72
%77 = OpLoad %v2float %pos
%78 = OpLoad %v2float %tint_symbol
%79 = OpFAdd %v2float %77 %78
%80 = OpCompositeExtract %float %79 0
%81 = OpCompositeExtract %float %79 1
%83 = OpCompositeConstruct %v4float %80 %81 %float_0 %float_1
%76 = OpFunctionCall %void %tint_symbol_5 %83
OpReturn
OpFunctionEnd
%tint_symbol_8 = OpFunction %void None %29
%tint_symbol_6 = OpFunctionParameter %v4float
%86 = OpLabel
OpStore %tint_symbol_7 %tint_symbol_6
OpReturn
OpFunctionEnd
%frag_main = OpFunction %void None %34
%88 = OpLabel
%89 = OpFunctionCall %void %tint_symbol_8 %90
OpReturn
OpFunctionEnd
%comp_main = OpFunction %void None %34
%92 = OpLabel
%index = OpVariable %_ptr_Function_uint Function %98
%vPos = OpVariable %_ptr_Function_v2float Function %75
%vVel = OpVariable %_ptr_Function_v2float Function %75
%cMass = OpVariable %_ptr_Function_v2float Function %75
%cVel = OpVariable %_ptr_Function_v2float Function %75
%colVel = OpVariable %_ptr_Function_v2float Function %75
%cMassCount = OpVariable %_ptr_Function_int Function %121
%cVelCount = OpVariable %_ptr_Function_int Function %121
%pos_0 = OpVariable %_ptr_Function_v2float Function %75
%vel = OpVariable %_ptr_Function_v2float Function %75
%i = OpVariable %_ptr_Function_uint Function %98
%94 = OpAccessChain %_ptr_Input_uint %tint_symbol_9 %uint_0
%95 = OpLoad %uint %94
OpStore %index %95
%99 = OpLoad %uint %index
%100 = OpUGreaterThanEqual %bool %99 %uint_5
OpSelectionMerge %102 None
OpBranchConditional %100 %103 %102
%103 = OpLabel
OpReturn
%102 = OpLabel
%104 = OpLoad %uint %index
%106 = OpAccessChain %_ptr_StorageBuffer_v2float %particlesA %uint_0 %104 %uint_0
%107 = OpLoad %v2float %106
OpStore %vPos %107
%109 = OpLoad %uint %index
%110 = OpAccessChain %_ptr_StorageBuffer_v2float %particlesA %uint_0 %109 %uint_1
%111 = OpLoad %v2float %110
OpStore %vVel %111
OpStore %cMass %113
OpStore %cVel %113
OpStore %colVel %113
OpStore %cMassCount %int_0
OpStore %cVelCount %int_0
OpStore %i %uint_0
OpBranch %126
%126 = OpLabel
OpLoopMerge %127 %128 None
OpBranch %129
%129 = OpLabel
%131 = OpLoad %uint %i
%132 = OpULessThan %bool %131 %uint_5
%130 = OpLogicalNot %bool %132
OpSelectionMerge %133 None
OpBranchConditional %130 %134 %133
%134 = OpLabel
OpBranch %127
%133 = OpLabel
%135 = OpLoad %uint %i
%136 = OpLoad %uint %index
%137 = OpIEqual %bool %135 %136
OpSelectionMerge %138 None
OpBranchConditional %137 %139 %138
%139 = OpLabel
OpBranch %128
%138 = OpLabel
%140 = OpLoad %uint %i
%141 = OpAccessChain %_ptr_StorageBuffer_v2float %particlesA %uint_0 %140 %uint_0
%142 = OpLoad %v2float %141
%143 = OpVectorShuffle %v2float %142 %142 0 1
OpStore %pos_0 %143
%144 = OpLoad %uint %i
%145 = OpAccessChain %_ptr_StorageBuffer_v2float %particlesA %uint_0 %144 %uint_1
%146 = OpLoad %v2float %145
%147 = OpVectorShuffle %v2float %146 %146 0 1
OpStore %vel %147
%149 = OpLoad %v2float %pos_0
%150 = OpLoad %v2float %vPos
%148 = OpExtInst %float %40 Distance %149 %150
%152 = OpAccessChain %_ptr_Uniform_float %params %uint_1
%153 = OpLoad %float %152
%154 = OpFOrdLessThan %bool %148 %153
OpSelectionMerge %155 None
OpBranchConditional %154 %156 %155
%156 = OpLabel
%157 = OpLoad %v2float %cMass
%158 = OpLoad %v2float %pos_0
%159 = OpFAdd %v2float %157 %158
OpStore %cMass %159
%160 = OpLoad %int %cMassCount
%162 = OpIAdd %int %160 %int_1
OpStore %cMassCount %162
OpBranch %155
%155 = OpLabel
%164 = OpLoad %v2float %pos_0
%165 = OpLoad %v2float %vPos
%163 = OpExtInst %float %40 Distance %164 %165
%167 = OpAccessChain %_ptr_Uniform_float %params %uint_2
%168 = OpLoad %float %167
%169 = OpFOrdLessThan %bool %163 %168
OpSelectionMerge %170 None
OpBranchConditional %169 %171 %170
%171 = OpLabel
%172 = OpLoad %v2float %colVel
%173 = OpLoad %v2float %pos_0
%174 = OpLoad %v2float %vPos
%175 = OpFSub %v2float %173 %174
%176 = OpFSub %v2float %172 %175
OpStore %colVel %176
OpBranch %170
%170 = OpLabel
%178 = OpLoad %v2float %pos_0
%179 = OpLoad %v2float %vPos
%177 = OpExtInst %float %40 Distance %178 %179
%181 = OpAccessChain %_ptr_Uniform_float %params %uint_3
%182 = OpLoad %float %181
%183 = OpFOrdLessThan %bool %177 %182
OpSelectionMerge %184 None
OpBranchConditional %183 %185 %184
%185 = OpLabel
%186 = OpLoad %v2float %cVel
%187 = OpLoad %v2float %vel
%188 = OpFAdd %v2float %186 %187
OpStore %cVel %188
%189 = OpLoad %int %cVelCount
%190 = OpIAdd %int %189 %int_1
OpStore %cVelCount %190
OpBranch %184
%184 = OpLabel
OpBranch %128
%128 = OpLabel
%191 = OpLoad %uint %i
%192 = OpIAdd %uint %191 %uint_1
OpStore %i %192
OpBranch %126
%127 = OpLabel
%193 = OpLoad %int %cMassCount
%194 = OpSGreaterThan %bool %193 %int_0
OpSelectionMerge %195 None
OpBranchConditional %194 %196 %195
%196 = OpLabel
%197 = OpLoad %v2float %cMass
%199 = OpLoad %int %cMassCount
%198 = OpConvertSToF %float %199
%201 = OpLoad %int %cMassCount
%200 = OpConvertSToF %float %201
%202 = OpCompositeConstruct %v2float %198 %200
%203 = OpFDiv %v2float %197 %202
%204 = OpLoad %v2float %vPos
%205 = OpFSub %v2float %203 %204
OpStore %cMass %205
OpBranch %195
%195 = OpLabel
%206 = OpLoad %int %cVelCount
%207 = OpSGreaterThan %bool %206 %int_0
OpSelectionMerge %208 None
OpBranchConditional %207 %209 %208
%209 = OpLabel
%210 = OpLoad %v2float %cVel
%212 = OpLoad %int %cVelCount
%211 = OpConvertSToF %float %212
%214 = OpLoad %int %cVelCount
%213 = OpConvertSToF %float %214
%215 = OpCompositeConstruct %v2float %211 %213
%216 = OpFDiv %v2float %210 %215
OpStore %cVel %216
OpBranch %208
%208 = OpLabel
%217 = OpLoad %v2float %vVel
%218 = OpLoad %v2float %cMass
%220 = OpAccessChain %_ptr_Uniform_float %params %uint_4
%221 = OpLoad %float %220
%222 = OpVectorTimesScalar %v2float %218 %221
%223 = OpFAdd %v2float %217 %222
%224 = OpLoad %v2float %colVel
%225 = OpAccessChain %_ptr_Uniform_float %params %uint_5
%226 = OpLoad %float %225
%227 = OpVectorTimesScalar %v2float %224 %226
%228 = OpFAdd %v2float %223 %227
%229 = OpLoad %v2float %cVel
%231 = OpAccessChain %_ptr_Uniform_float %params %uint_6
%232 = OpLoad %float %231
%233 = OpVectorTimesScalar %v2float %229 %232
%234 = OpFAdd %v2float %228 %233
OpStore %vVel %234
%236 = OpLoad %v2float %vVel
%235 = OpExtInst %v2float %40 Normalize %236
%239 = OpLoad %v2float %vVel
%238 = OpExtInst %float %40 Length %239
%237 = OpExtInst %float %40 NClamp %238 %float_0 %float_0_100000001
%241 = OpVectorTimesScalar %v2float %235 %237
OpStore %vVel %241
%242 = OpLoad %v2float %vPos
%243 = OpLoad %v2float %vVel
%244 = OpAccessChain %_ptr_Uniform_float %params %uint_0
%245 = OpLoad %float %244
%246 = OpVectorTimesScalar %v2float %243 %245
%247 = OpFAdd %v2float %242 %246
OpStore %vPos %247
%248 = OpAccessChain %_ptr_Function_float %vPos %uint_0
%249 = OpLoad %float %248
%251 = OpFOrdLessThan %bool %249 %float_n1
OpSelectionMerge %252 None
OpBranchConditional %251 %253 %252
%253 = OpLabel
%254 = OpAccessChain %_ptr_Function_float %vPos %uint_0
OpStore %254 %float_1
OpBranch %252
%252 = OpLabel
%255 = OpAccessChain %_ptr_Function_float %vPos %uint_0
%256 = OpLoad %float %255
%257 = OpFOrdGreaterThan %bool %256 %float_1
OpSelectionMerge %258 None
OpBranchConditional %257 %259 %258
%259 = OpLabel
%260 = OpAccessChain %_ptr_Function_float %vPos %uint_0
OpStore %260 %float_n1
OpBranch %258
%258 = OpLabel
%261 = OpAccessChain %_ptr_Function_float %vPos %uint_1
%262 = OpLoad %float %261
%263 = OpFOrdLessThan %bool %262 %float_n1
OpSelectionMerge %264 None
OpBranchConditional %263 %265 %264
%265 = OpLabel
%266 = OpAccessChain %_ptr_Function_float %vPos %uint_1
OpStore %266 %float_1
OpBranch %264
%264 = OpLabel
%267 = OpAccessChain %_ptr_Function_float %vPos %uint_1
%268 = OpLoad %float %267
%269 = OpFOrdGreaterThan %bool %268 %float_1
OpSelectionMerge %270 None
OpBranchConditional %269 %271 %270
%271 = OpLabel
%272 = OpAccessChain %_ptr_Function_float %vPos %uint_1
OpStore %272 %float_n1
OpBranch %270
%270 = OpLabel
%273 = OpLoad %uint %index
%274 = OpAccessChain %_ptr_StorageBuffer_v2float %particlesB %uint_0 %273 %uint_0
%275 = OpLoad %v2float %vPos
OpStore %274 %275
%276 = OpLoad %uint %index
%277 = OpAccessChain %_ptr_StorageBuffer_v2float %particlesB %uint_0 %276 %uint_1
%278 = OpLoad %v2float %vVel
OpStore %277 %278
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,106 @@
[[stage(vertex)]]
fn vert_main([[location(0)]] a_particlePos : vec2<f32>, [[location(1)]] a_particleVel : vec2<f32>, [[location(2)]] a_pos : vec2<f32>) -> [[builtin(position)]] vec4<f32> {
var angle : f32 = -(atan2(a_particleVel.x, a_particleVel.y));
var pos : vec2<f32> = vec2<f32>(((a_pos.x * cos(angle)) - (a_pos.y * sin(angle))), ((a_pos.x * sin(angle)) + (a_pos.y * cos(angle))));
return vec4<f32>((pos + a_particlePos), 0.0, 1.0);
}
[[stage(fragment)]]
fn frag_main() -> [[location(0)]] vec4<f32> {
return vec4<f32>(1.0, 1.0, 1.0, 1.0);
}
struct Particle {
pos : vec2<f32>;
vel : vec2<f32>;
};
[[block]]
struct SimParams {
deltaT : f32;
rule1Distance : f32;
rule2Distance : f32;
rule3Distance : f32;
rule1Scale : f32;
rule2Scale : f32;
rule3Scale : f32;
};
[[block]]
struct Particles {
particles : array<Particle, 5>;
};
[[binding(0), group(0)]] var<uniform> params : SimParams;
[[binding(1), group(0)]] var<storage> particlesA : [[access(read_write)]] Particles;
[[binding(2), group(0)]] var<storage> particlesB : [[access(read_write)]] Particles;
[[stage(compute)]]
fn comp_main([[builtin(global_invocation_id)]] gl_GlobalInvocationID : vec3<u32>) {
var index : u32 = gl_GlobalInvocationID.x;
if ((index >= 5u)) {
return;
}
var vPos : vec2<f32> = particlesA.particles[index].pos;
var vVel : vec2<f32> = particlesA.particles[index].vel;
var cMass : vec2<f32> = vec2<f32>(0.0, 0.0);
var cVel : vec2<f32> = vec2<f32>(0.0, 0.0);
var colVel : vec2<f32> = vec2<f32>(0.0, 0.0);
var cMassCount : i32 = 0;
var cVelCount : i32 = 0;
var pos : vec2<f32>;
var vel : vec2<f32>;
{
var i : u32 = 0u;
loop {
if (!((i < 5u))) {
break;
}
if ((i == index)) {
continue;
}
pos = particlesA.particles[i].pos.xy;
vel = particlesA.particles[i].vel.xy;
if ((distance(pos, vPos) < params.rule1Distance)) {
cMass = (cMass + pos);
cMassCount = (cMassCount + 1);
}
if ((distance(pos, vPos) < params.rule2Distance)) {
colVel = (colVel - (pos - vPos));
}
if ((distance(pos, vPos) < params.rule3Distance)) {
cVel = (cVel + vel);
cVelCount = (cVelCount + 1);
}
continuing {
i = (i + 1u);
}
}
}
if ((cMassCount > 0)) {
cMass = ((cMass / vec2<f32>(f32(cMassCount), f32(cMassCount))) - vPos);
}
if ((cVelCount > 0)) {
cVel = (cVel / vec2<f32>(f32(cVelCount), f32(cVelCount)));
}
vVel = (((vVel + (cMass * params.rule1Scale)) + (colVel * params.rule2Scale)) + (cVel * params.rule3Scale));
vVel = (normalize(vVel) * clamp(length(vVel), 0.0, 0.100000001));
vPos = (vPos + (vVel * params.deltaT));
if ((vPos.x < -1.0)) {
vPos.x = 1.0;
}
if ((vPos.x > 1.0)) {
vPos.x = -1.0;
}
if ((vPos.y < -1.0)) {
vPos.y = 1.0;
}
if ((vPos.y > 1.0)) {
vPos.y = -1.0;
}
particlesB.particles[index].pos = vPos;
particlesB.particles[index].vel = vVel;
}

View File

@ -0,0 +1,43 @@
struct Uniforms {
float4x4 modelViewProjectionMatrix;
};
struct VertexInput {
float4 cur_position;
float4 color;
};
struct VertexOutput {
float4 vtxFragColor;
float4 Position;
};
struct tint_symbol_1 {
float4 cur_position : TEXCOORD0;
float4 color : TEXCOORD1;
};
struct tint_symbol_2 {
float4 vtxFragColor : TEXCOORD0;
float4 Position : SV_Position;
};
struct tint_symbol_4 {
float4 fragColor : TEXCOORD0;
};
struct tint_symbol_5 {
float4 value : SV_Target0;
};
ConstantBuffer<Uniforms> uniforms : register(b0, space0);
tint_symbol_2 vtx_main(tint_symbol_1 tint_symbol) {
const VertexInput input = {tint_symbol.cur_position, tint_symbol.color};
VertexOutput output = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
output.Position = mul(input.cur_position, uniforms.modelViewProjectionMatrix);
output.vtxFragColor = input.color;
const tint_symbol_2 tint_symbol_6 = {output.vtxFragColor, output.Position};
return tint_symbol_6;
}
tint_symbol_5 frag_main(tint_symbol_4 tint_symbol_3) {
const float4 fragColor = tint_symbol_3.fragColor;
const tint_symbol_5 tint_symbol_7 = {fragColor};
return tint_symbol_7;
}

View File

@ -0,0 +1,42 @@
#include <metal_stdlib>
using namespace metal;
struct Uniforms {
/* 0x0000 */ float4x4 modelViewProjectionMatrix;
};
struct VertexInput {
float4 cur_position;
float4 color;
};
struct VertexOutput {
float4 vtxFragColor;
float4 Position;
};
struct tint_symbol_1 {
float4 cur_position [[attribute(0)]];
float4 color [[attribute(1)]];
};
struct tint_symbol_2 {
float4 vtxFragColor [[user(locn0)]];
float4 Position [[position]];
};
struct tint_symbol_4 {
float4 fragColor [[user(locn0)]];
};
struct tint_symbol_5 {
float4 value [[color(0)]];
};
vertex tint_symbol_2 vtx_main(tint_symbol_1 tint_symbol [[stage_in]], constant Uniforms& uniforms [[buffer(0)]]) {
const VertexInput input = {tint_symbol.cur_position, tint_symbol.color};
VertexOutput output = {};
output.Position = (uniforms.modelViewProjectionMatrix * input.cur_position);
output.vtxFragColor = input.color;
return {output.vtxFragColor, output.Position};
}
fragment tint_symbol_5 frag_main(tint_symbol_4 tint_symbol_3 [[stage_in]]) {
const float4 fragColor = tint_symbol_3.fragColor;
return {fragColor};
}

View File

@ -0,0 +1,123 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 60
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vtx_main "vtx_main" %tint_pointsize %tint_symbol %tint_symbol_1 %tint_symbol_4 %tint_symbol_5
OpEntryPoint Fragment %frag_main "frag_main" %tint_symbol_7 %tint_symbol_9
OpExecutionMode %frag_main OriginUpperLeft
OpName %tint_pointsize "tint_pointsize"
OpName %Uniforms "Uniforms"
OpMemberName %Uniforms 0 "modelViewProjectionMatrix"
OpName %uniforms "uniforms"
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_7 "tint_symbol_7"
OpName %tint_symbol_9 "tint_symbol_9"
OpName %VertexOutput "VertexOutput"
OpMemberName %VertexOutput 0 "vtxFragColor"
OpMemberName %VertexOutput 1 "Position"
OpName %tint_symbol_6 "tint_symbol_6"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %vtx_main "vtx_main"
OpName %VertexInput "VertexInput"
OpMemberName %VertexInput 0 "cur_position"
OpMemberName %VertexInput 1 "color"
OpName %output "output"
OpName %tint_symbol_10 "tint_symbol_10"
OpName %tint_symbol_8 "tint_symbol_8"
OpName %frag_main "frag_main"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %Uniforms Block
OpMemberDecorate %Uniforms 0 Offset 0
OpMemberDecorate %Uniforms 0 ColMajor
OpMemberDecorate %Uniforms 0 MatrixStride 16
OpDecorate %uniforms Binding 0
OpDecorate %uniforms DescriptorSet 0
OpDecorate %tint_symbol Location 0
OpDecorate %tint_symbol_1 Location 1
OpDecorate %tint_symbol_4 Location 0
OpDecorate %tint_symbol_5 BuiltIn Position
OpDecorate %tint_symbol_7 Location 0
OpDecorate %tint_symbol_9 Location 0
OpMemberDecorate %VertexOutput 0 Offset 0
OpMemberDecorate %VertexOutput 1 Offset 16
OpMemberDecorate %VertexInput 0 Offset 0
OpMemberDecorate %VertexInput 1 Offset 16
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_pointsize = OpVariable %_ptr_Output_float Output %4
%v4float = OpTypeVector %float 4
%mat4v4float = OpTypeMatrix %v4float 4
%Uniforms = OpTypeStruct %mat4v4float
%_ptr_Uniform_Uniforms = OpTypePointer Uniform %Uniforms
%uniforms = OpVariable %_ptr_Uniform_Uniforms Uniform
%_ptr_Input_v4float = OpTypePointer Input %v4float
%tint_symbol = OpVariable %_ptr_Input_v4float Input
%tint_symbol_1 = OpVariable %_ptr_Input_v4float Input
%_ptr_Output_v4float = OpTypePointer Output %v4float
%15 = OpConstantNull %v4float
%tint_symbol_4 = OpVariable %_ptr_Output_v4float Output %15
%tint_symbol_5 = OpVariable %_ptr_Output_v4float Output %15
%tint_symbol_7 = OpVariable %_ptr_Input_v4float Input
%tint_symbol_9 = OpVariable %_ptr_Output_v4float Output %15
%void = OpTypeVoid
%VertexOutput = OpTypeStruct %v4float %v4float
%19 = OpTypeFunction %void %VertexOutput
%27 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%VertexInput = OpTypeStruct %v4float %v4float
%_ptr_Function_VertexOutput = OpTypePointer Function %VertexOutput
%37 = OpConstantNull %VertexOutput
%uint = OpTypeInt 32 0
%uint_1 = OpConstant %uint 1
%_ptr_Function_v4float = OpTypePointer Function %v4float
%uint_0 = OpConstant %uint 0
%_ptr_Uniform_mat4v4float = OpTypePointer Uniform %mat4v4float
%52 = OpTypeFunction %void %v4float
%tint_symbol_6 = OpFunction %void None %19
%tint_symbol_3 = OpFunctionParameter %VertexOutput
%24 = OpLabel
%25 = OpCompositeExtract %v4float %tint_symbol_3 0
OpStore %tint_symbol_4 %25
%26 = OpCompositeExtract %v4float %tint_symbol_3 1
OpStore %tint_symbol_5 %26
OpReturn
OpFunctionEnd
%vtx_main = OpFunction %void None %27
%29 = OpLabel
%output = OpVariable %_ptr_Function_VertexOutput Function %37
OpStore %tint_pointsize %float_1
%32 = OpLoad %v4float %tint_symbol
%33 = OpLoad %v4float %tint_symbol_1
%34 = OpCompositeConstruct %VertexInput %32 %33
%41 = OpAccessChain %_ptr_Function_v4float %output %uint_1
%44 = OpAccessChain %_ptr_Uniform_mat4v4float %uniforms %uint_0
%45 = OpLoad %mat4v4float %44
%46 = OpCompositeExtract %v4float %34 0
%47 = OpMatrixTimesVector %v4float %45 %46
OpStore %41 %47
%48 = OpAccessChain %_ptr_Function_v4float %output %uint_0
%49 = OpCompositeExtract %v4float %34 1
OpStore %48 %49
%51 = OpLoad %VertexOutput %output
%50 = OpFunctionCall %void %tint_symbol_6 %51
OpReturn
OpFunctionEnd
%tint_symbol_10 = OpFunction %void None %52
%tint_symbol_8 = OpFunctionParameter %v4float
%55 = OpLabel
OpStore %tint_symbol_9 %tint_symbol_8
OpReturn
OpFunctionEnd
%frag_main = OpFunction %void None %27
%57 = OpLabel
%59 = OpLoad %v4float %tint_symbol_7
%58 = OpFunctionCall %void %tint_symbol_10 %59
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,33 @@
[[block]]
struct Uniforms {
modelViewProjectionMatrix : mat4x4<f32>;
};
[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
struct VertexInput {
[[location(0)]]
cur_position : vec4<f32>;
[[location(1)]]
color : vec4<f32>;
};
struct VertexOutput {
[[location(0)]]
vtxFragColor : vec4<f32>;
[[builtin(position)]]
Position : vec4<f32>;
};
[[stage(vertex)]]
fn vtx_main(input : VertexInput) -> VertexOutput {
var output : VertexOutput;
output.Position = (uniforms.modelViewProjectionMatrix * input.cur_position);
output.vtxFragColor = input.color;
return output;
}
[[stage(fragment)]]
fn frag_main([[location(0)]] fragColor : vec4<f32>) -> [[location(0)]] vec4<f32> {
return fragColor;
}

View File

@ -0,0 +1,9 @@
float main() {
return (((2.0f * 3.0f) - 4.0f) / 5.0f);
}
[numthreads(2, 1, 1)]
void ep() {
return;
}

View File

@ -0,0 +1,11 @@
#include <metal_stdlib>
using namespace metal;
float tint_symbol() {
return (((2.0f * 3.0f) - 4.0f) / 5.0f);
}
kernel void ep() {
return;
}

View File

@ -0,0 +1,30 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 16
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %ep "ep"
OpExecutionMode %ep LocalSize 2 1 1
OpName %main "main"
OpName %ep "ep"
%float = OpTypeFloat 32
%1 = OpTypeFunction %float
%float_2 = OpConstant %float 2
%float_3 = OpConstant %float 3
%float_4 = OpConstant %float 4
%float_5 = OpConstant %float 5
%void = OpTypeVoid
%12 = OpTypeFunction %void
%main = OpFunction %float None %1
%4 = OpLabel
%7 = OpFMul %float %float_2 %float_3
%9 = OpFSub %float %7 %float_4
%11 = OpFDiv %float %9 %float_5
OpReturnValue %11
OpFunctionEnd
%ep = OpFunction %void None %12
%15 = OpLabel
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,7 @@
fn main() -> f32 {
return (((2.0 * 3.0) - 4.0) / 5.0);
}
[[stage(compute), workgroup_size(2, 1, 1)]]
fn ep() {
}

View File

@ -0,0 +1,14 @@
struct tint_symbol {
float4 value : SV_Target0;
};
void bar() {
}
tint_symbol main() {
float2 a = float2(0.0f, 0.0f);
bar();
const tint_symbol tint_symbol_1 = {float4(0.400000006f, 0.400000006f, 0.800000012f, 1.0f)};
return tint_symbol_1;
}

View File

@ -0,0 +1,16 @@
#include <metal_stdlib>
using namespace metal;
struct tint_symbol_1 {
float4 value [[color(0)]];
};
void bar() {
}
fragment tint_symbol_1 tint_symbol() {
float2 a = float2(0.0f);
bar();
return {float4(0.400000006f, 0.400000006f, 0.800000012f, 1.0f)};
}

View File

@ -0,0 +1,49 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 26
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %tint_symbol_1
OpExecutionMode %main OriginUpperLeft
OpName %tint_symbol_1 "tint_symbol_1"
OpName %bar "bar"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol "tint_symbol"
OpName %main "main"
OpName %a "a"
OpDecorate %tint_symbol_1 Location 0
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%5 = OpConstantNull %v4float
%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
%void = OpTypeVoid
%6 = OpTypeFunction %void
%10 = OpTypeFunction %void %v4float
%v2float = OpTypeVector %float 2
%17 = OpConstantNull %v2float
%_ptr_Function_v2float = OpTypePointer Function %v2float
%float_0_400000006 = OpConstant %float 0.400000006
%float_0_800000012 = OpConstant %float 0.800000012
%float_1 = OpConstant %float 1
%25 = OpConstantComposite %v4float %float_0_400000006 %float_0_400000006 %float_0_800000012 %float_1
%bar = OpFunction %void None %6
%9 = OpLabel
OpReturn
OpFunctionEnd
%tint_symbol_2 = OpFunction %void None %10
%tint_symbol = OpFunctionParameter %v4float
%13 = OpLabel
OpStore %tint_symbol_1 %tint_symbol
OpReturn
OpFunctionEnd
%main = OpFunction %void None %6
%15 = OpLabel
%a = OpVariable %_ptr_Function_v2float Function %17
OpStore %a %17
%20 = OpFunctionCall %void %bar
%21 = OpFunctionCall %void %tint_symbol_2 %25
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,9 @@
fn bar() {
}
[[stage(fragment)]]
fn main() -> [[location(0)]] vec4<f32> {
var a : vec2<f32> = vec2<f32>();
bar();
return vec4<f32>(0.400000006, 0.400000006, 0.800000012, 1.0);
}

View File

@ -0,0 +1,10 @@
struct main_out {
float4 gl_Position : SV_Position;
};
main_out main() {
main_out tint_out = (main_out)0;
tint_out.gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
return tint_out;
}

View File

@ -0,0 +1,13 @@
#include <metal_stdlib>
using namespace metal;
struct tint_symbol_out {
float4 gl_Position [[position]];
};
vertex tint_symbol_out tint_symbol() {
tint_symbol_out _tint_out = {};
_tint_out.gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
return _tint_out;
}

View File

@ -0,0 +1,32 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 16
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %main "main" %tint_pointsize %gl_Position
OpName %tint_pointsize "tint_pointsize"
OpName %gl_Position "gl_Position"
OpName %main "main"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %gl_Position BuiltIn Position
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_pointsize = OpVariable %_ptr_Output_float Output %4
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%8 = OpConstantNull %v4float
%gl_Position = OpVariable %_ptr_Output_v4float Output %8
%void = OpTypeVoid
%9 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%float_0 = OpConstant %float 0
%15 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
%main = OpFunction %void None %9
%12 = OpLabel
OpStore %tint_pointsize %float_1
OpStore %gl_Position %15
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,7 @@
[[builtin(position)]] var<out> gl_Position : vec4<f32>;
[[stage(vertex)]]
fn main() {
gl_Position = vec4<f32>(0.0, 0.0, 0.0, 0.0);
return;
}

View File

@ -0,0 +1,22 @@
struct tint_symbol_1 {
int VertexIndex : SV_VertexID;
};
struct tint_symbol_2 {
float4 value : SV_Position;
};
struct tint_symbol_3 {
float4 value : SV_Target0;
};
static const float2 pos[3] = {float2(0.0f, 0.5f), float2(-0.5f, -0.5f), float2(0.5f, -0.5f)};
tint_symbol_2 vtx_main(tint_symbol_1 tint_symbol) {
const int VertexIndex = tint_symbol.VertexIndex;
const tint_symbol_2 tint_symbol_4 = {float4(pos[VertexIndex], 0.0f, 1.0f)};
return tint_symbol_4;
}
tint_symbol_3 frag_main() {
const tint_symbol_3 tint_symbol_5 = {float4(1.0f, 0.0f, 0.0f, 1.0f)};
return tint_symbol_5;
}

View File

@ -0,0 +1,23 @@
#include <metal_stdlib>
using namespace metal;
struct tint_symbol_1 {
int VertexIndex [[vertex_id]];
};
struct tint_symbol_2 {
float4 value [[position]];
};
struct tint_symbol_3 {
float4 value [[color(0)]];
};
constant float2 pos[3] = {float2(0.0f, 0.5f), float2(-0.5f, -0.5f), float2(0.5f, -0.5f)};
vertex tint_symbol_2 vtx_main(tint_symbol_1 tint_symbol [[stage_in]]) {
const int VertexIndex = tint_symbol.VertexIndex;
return {float4(pos[VertexIndex], 0.0f, 1.0f)};
}
fragment tint_symbol_3 frag_main() {
return {float4(1.0f, 0.0f, 0.0f, 1.0f)};
}

View File

@ -0,0 +1,88 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 51
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %vtx_main "vtx_main" %tint_pointsize %tint_symbol %tint_symbol_2
OpEntryPoint Fragment %frag_main "frag_main" %tint_symbol_5
OpExecutionMode %frag_main OriginUpperLeft
OpName %tint_pointsize "tint_pointsize"
OpName %pos "pos"
OpName %tint_symbol "tint_symbol"
OpName %tint_symbol_2 "tint_symbol_2"
OpName %tint_symbol_5 "tint_symbol_5"
OpName %tint_symbol_3 "tint_symbol_3"
OpName %tint_symbol_1 "tint_symbol_1"
OpName %vtx_main "vtx_main"
OpName %tint_symbol_6 "tint_symbol_6"
OpName %tint_symbol_4 "tint_symbol_4"
OpName %frag_main "frag_main"
OpDecorate %tint_pointsize BuiltIn PointSize
OpDecorate %_arr_v2float_uint_3 ArrayStride 8
OpDecorate %tint_symbol BuiltIn VertexIndex
OpDecorate %tint_symbol_2 BuiltIn Position
OpDecorate %tint_symbol_5 Location 0
%float = OpTypeFloat 32
%_ptr_Output_float = OpTypePointer Output %float
%4 = OpConstantNull %float
%tint_pointsize = OpVariable %_ptr_Output_float Output %4
%v2float = OpTypeVector %float 2
%uint = OpTypeInt 32 0
%uint_3 = OpConstant %uint 3
%_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3
%float_0 = OpConstant %float 0
%float_0_5 = OpConstant %float 0.5
%11 = OpConstantComposite %v2float %float_0 %float_0_5
%float_n0_5 = OpConstant %float -0.5
%13 = OpConstantComposite %v2float %float_n0_5 %float_n0_5
%14 = OpConstantComposite %v2float %float_0_5 %float_n0_5
%pos = OpConstantComposite %_arr_v2float_uint_3 %11 %13 %14
%int = OpTypeInt 32 1
%_ptr_Input_int = OpTypePointer Input %int
%tint_symbol = OpVariable %_ptr_Input_int Input
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%22 = OpConstantNull %v4float
%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %22
%tint_symbol_5 = OpVariable %_ptr_Output_v4float Output %22
%void = OpTypeVoid
%24 = OpTypeFunction %void %v4float
%29 = OpTypeFunction %void
%float_1 = OpConstant %float 1
%_ptr_Function__arr_v2float_uint_3 = OpTypePointer Function %_arr_v2float_uint_3
%36 = OpConstantNull %_arr_v2float_uint_3
%_ptr_Function_v2float = OpTypePointer Function %v2float
%50 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
%tint_symbol_3 = OpFunction %void None %24
%tint_symbol_1 = OpFunctionParameter %v4float
%28 = OpLabel
OpStore %tint_symbol_2 %tint_symbol_1
OpReturn
OpFunctionEnd
%vtx_main = OpFunction %void None %29
%31 = OpLabel
%35 = OpVariable %_ptr_Function__arr_v2float_uint_3 Function %36
OpStore %tint_pointsize %float_1
OpStore %35 %pos
%37 = OpLoad %int %tint_symbol
%39 = OpAccessChain %_ptr_Function_v2float %35 %37
%40 = OpLoad %v2float %39
%41 = OpCompositeExtract %float %40 0
%42 = OpCompositeExtract %float %40 1
%43 = OpCompositeConstruct %v4float %41 %42 %float_0 %float_1
%33 = OpFunctionCall %void %tint_symbol_3 %43
OpReturn
OpFunctionEnd
%tint_symbol_6 = OpFunction %void None %24
%tint_symbol_4 = OpFunctionParameter %v4float
%46 = OpLabel
OpStore %tint_symbol_5 %tint_symbol_4
OpReturn
OpFunctionEnd
%frag_main = OpFunction %void None %29
%48 = OpLabel
%49 = OpFunctionCall %void %tint_symbol_6 %50
OpReturn
OpFunctionEnd

View File

@ -0,0 +1,11 @@
let pos : array<vec2<f32>, 3> = array<vec2<f32>, 3>(vec2<f32>(0.0, 0.5), vec2<f32>(-0.5, -0.5), vec2<f32>(0.5, -0.5));
[[stage(vertex)]]
fn vtx_main([[builtin(vertex_index)]] VertexIndex : i32) -> [[builtin(position)]] vec4<f32> {
return vec4<f32>(pos[VertexIndex], 0.0, 1.0);
}
[[stage(fragment)]]
fn frag_main() -> [[location(0)]] vec4<f32> {
return vec4<f32>(1.0, 0.0, 0.0, 1.0);
}