| #include <metal_stdlib> |
| |
| using namespace metal; |
| |
| template<typename T, size_t N> |
| struct tint_array { |
| const constant T& operator[](size_t i) const constant { return elements[i]; } |
| device T& operator[](size_t i) device { return elements[i]; } |
| const device T& operator[](size_t i) const device { return elements[i]; } |
| thread T& operator[](size_t i) thread { return elements[i]; } |
| const thread T& operator[](size_t i) const thread { return elements[i]; } |
| threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } |
| const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } |
| T elements[N]; |
| }; |
| |
| struct tint_private_vars_struct { |
| float2 rand_seed; |
| }; |
| |
| struct RenderParams_tint_packed_vec3 { |
| /* 0x0000 */ float4x4 modelViewProjectionMatrix; |
| /* 0x0040 */ packed_float3 right; |
| /* 0x004c */ tint_array<int8_t, 4> tint_pad; |
| /* 0x0050 */ packed_float3 up; |
| /* 0x005c */ tint_array<int8_t, 4> tint_pad_1; |
| }; |
| |
| struct Particle_tint_packed_vec3 { |
| /* 0x0000 */ packed_float3 position; |
| /* 0x000c */ float lifetime; |
| /* 0x0010 */ float4 color; |
| /* 0x0020 */ float2 velocity; |
| /* 0x0028 */ tint_array<int8_t, 8> tint_pad_2; |
| }; |
| |
| struct Particles_tint_packed_vec3 { |
| /* 0x0000 */ tint_array<Particle_tint_packed_vec3, 1> particles; |
| }; |
| |
| struct Particle { |
| float3 position; |
| float lifetime; |
| float4 color; |
| float2 velocity; |
| }; |
| |
| Particle tint_unpack_vec3_in_composite(Particle_tint_packed_vec3 in) { |
| Particle result = {}; |
| result.position = float3(in.position); |
| result.lifetime = in.lifetime; |
| result.color = in.color; |
| result.velocity = in.velocity; |
| return result; |
| } |
| |
| void asinh_468a48() { |
| half arg_0 = 0.0h; |
| half res = asinh(arg_0); |
| } |
| |
| struct tint_symbol_1 { |
| float4 value [[position]]; |
| }; |
| |
| float4 vertex_main_inner() { |
| asinh_468a48(); |
| return float4(0.0f); |
| } |
| |
| vertex tint_symbol_1 vertex_main() { |
| float4 const inner_result = vertex_main_inner(); |
| tint_symbol_1 wrapper_result = {}; |
| wrapper_result.value = inner_result; |
| return wrapper_result; |
| } |
| |
| fragment void fragment_main() { |
| asinh_468a48(); |
| return; |
| } |
| |
| kernel void rgba32uintin() { |
| asinh_468a48(); |
| return; |
| } |
| |
| struct TestData { |
| tint_array<atomic_int, 4> dmat2atxa2; |
| }; |
| |
| struct RenderParams { |
| float4x4 modelViewProjectionMatrix; |
| float3 right; |
| float3 up; |
| }; |
| |
| struct VertexInput { |
| float3 position; |
| float4 color; |
| float2 quad_pos; |
| }; |
| |
| struct VertexOutput { |
| float4 position; |
| float4 color; |
| float2 quad_pos; |
| }; |
| |
| struct tint_symbol_3 { |
| float3 position [[attribute(0)]]; |
| float4 color [[attribute(1)]]; |
| float2 quad_pos [[attribute(2)]]; |
| }; |
| |
| struct tint_symbol_4 { |
| float4 color [[user(locn0)]]; |
| float2 quad_pos [[user(locn1)]]; |
| float4 position [[position]]; |
| }; |
| |
| VertexOutput vs_main_inner(VertexInput in, const constant RenderParams_tint_packed_vec3* const tint_symbol_6) { |
| float3 quad_pos = (float2x3(float3((*(tint_symbol_6)).right), float3((*(tint_symbol_6)).up)) * in.quad_pos); |
| float3 position = (in.position - (quad_pos + 0.00999999977648258209f)); |
| VertexOutput out = {}; |
| out.position = ((*(tint_symbol_6)).modelViewProjectionMatrix * float4(position, 1.0f)); |
| out.color = in.color; |
| out.quad_pos = in.quad_pos; |
| return out; |
| } |
| |
| vertex tint_symbol_4 vs_main(const constant RenderParams_tint_packed_vec3* tint_symbol_7 [[buffer(0)]], tint_symbol_3 tint_symbol_2 [[stage_in]]) { |
| VertexInput const tint_symbol_5 = VertexInput{.position=tint_symbol_2.position, .color=tint_symbol_2.color, .quad_pos=tint_symbol_2.quad_pos}; |
| VertexOutput const inner_result_1 = vs_main_inner(tint_symbol_5, tint_symbol_7); |
| tint_symbol_4 wrapper_result_1 = {}; |
| wrapper_result_1.position = inner_result_1.position; |
| wrapper_result_1.color = inner_result_1.color; |
| wrapper_result_1.quad_pos = inner_result_1.quad_pos; |
| return wrapper_result_1; |
| } |
| |
| struct SimulationParams { |
| /* 0x0000 */ float deltaTime; |
| /* 0x0004 */ tint_array<int8_t, 12> tint_pad_3; |
| /* 0x0010 */ float4 seed; |
| }; |
| |
| struct Particles { |
| tint_array<Particle, 1> particles; |
| }; |
| |
| void assign_and_preserve_padding(device Particle_tint_packed_vec3* const dest, Particle value) { |
| (*(dest)).position = packed_float3(value.position); |
| (*(dest)).lifetime = value.lifetime; |
| (*(dest)).color = value.color; |
| (*(dest)).velocity = value.velocity; |
| } |
| |
| void simulate_inner(uint3 GlobalInvocationID, thread tint_private_vars_struct* const tint_private_vars, const constant SimulationParams* const tint_symbol_8, device Particles_tint_packed_vec3* const tint_symbol_9) { |
| (*(tint_private_vars)).rand_seed = (((*(tint_symbol_8)).seed.xy * float2(GlobalInvocationID.xy)) * (*(tint_symbol_8)).seed.zw); |
| uint const idx = GlobalInvocationID[0]; |
| Particle particle = tint_unpack_vec3_in_composite((*(tint_symbol_9)).particles[idx]); |
| assign_and_preserve_padding(&((*(tint_symbol_9)).particles[idx]), particle); |
| } |
| |
| kernel void simulate(const constant SimulationParams* tint_symbol_10 [[buffer(1)]], device Particles_tint_packed_vec3* tint_symbol_11 [[buffer(2)]], uint3 GlobalInvocationID [[thread_position_in_grid]]) { |
| thread tint_private_vars_struct tint_private_vars = {}; |
| simulate_inner(GlobalInvocationID, &(tint_private_vars), tint_symbol_10, tint_symbol_11); |
| return; |
| } |
| |
| struct UBO { |
| /* 0x0000 */ uint width; |
| }; |
| |
| struct Buffer { |
| /* 0x0000 */ tint_array<float, 1> weights; |
| }; |
| |
| void export_level_inner(uint3 coord, texture2d<float, access::write> tint_symbol_12, const constant UBO* const tint_symbol_13, const device Buffer* const tint_symbol_14, device Buffer* const tint_symbol_15) { |
| if (all((coord.xy < uint2(uint2(tint_symbol_12.get_width(), tint_symbol_12.get_height()))))) { |
| uint const dst_offset = (coord[0] << ((coord[1] * (*(tint_symbol_13)).width) & 31u)); |
| uint const src_offset = ((coord[0] - 2u) + ((coord[1] >> 2u) * (*(tint_symbol_13)).width)); |
| float const a = (*(tint_symbol_14)).weights[(src_offset << 0u)]; |
| float const b = (*(tint_symbol_14)).weights[(src_offset + 1u)]; |
| float const c = (*(tint_symbol_14)).weights[((src_offset + 1u) + (*(tint_symbol_13)).width)]; |
| float const d = (*(tint_symbol_14)).weights[((src_offset + 1u) + (*(tint_symbol_13)).width)]; |
| float const sum = dot(float4(a, b, c, d), float4(1.0f)); |
| (*(tint_symbol_15)).weights[dst_offset] = fmod(sum, 4.0f); |
| float4 const probabilities = (float4(a, (a * b), ((a / b) + c), sum) + fmax(sum, 0.0f)); |
| tint_symbol_12.write(probabilities, uint2(int2(coord.xy))); |
| } |
| } |
| |
| kernel void export_level(texture2d<float, access::write> tint_symbol_16 [[texture(0)]], const constant UBO* tint_symbol_17 [[buffer(3)]], const device Buffer* tint_symbol_18 [[buffer(4)]], device Buffer* tint_symbol_19 [[buffer(0)]], uint3 coord [[thread_position_in_grid]]) { |
| export_level_inner(coord, tint_symbol_16, tint_symbol_17, tint_symbol_18, tint_symbol_19); |
| return; |
| } |
| |