• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#pragma clang diagnostic ignored "-Wmissing-prototypes"
2#pragma clang diagnostic ignored "-Wunused-variable"
3
4#include <metal_stdlib>
5#include <simd/simd.h>
6#include <metal_atomic>
7
8using namespace metal;
9
10struct Buffer3
11{
12    int baz;
13};
14
15struct Buffer
16{
17    int foo;
18    uint bar;
19};
20
21struct Buffer2
22{
23    uint quux;
24};
25
26struct spvDescriptorSetBuffer0
27{
28    device Buffer3* m_9 [[id(0)]];
29    texture2d<float, access::write> img4 [[id(1)]];
30    texture2d<float, access::write> img [[id(2), raster_order_group(0)]];
31    texture2d<float> img3 [[id(3), raster_order_group(0)]];
32    texture2d<uint> img2 [[id(4), raster_order_group(0)]];
33    device atomic_uint* img2_atomic [[id(5), raster_order_group(0)]];
34    volatile device Buffer* m_42 [[id(6), raster_order_group(0)]];
35    device Buffer2* m_52 [[id(7), raster_order_group(0)]];
36};
37
38// The required alignment of a linear texture of R32Uint format.
39constant uint spvLinearTextureAlignmentOverride [[function_constant(65535)]];
40constant uint spvLinearTextureAlignment = is_function_constant_defined(spvLinearTextureAlignmentOverride) ? spvLinearTextureAlignmentOverride : 4;
41// Returns buffer coords corresponding to 2D texture coords for emulating 2D texture atomics
42#define spvImage2DAtomicCoord(tc, tex) (((((tex).get_width() +  spvLinearTextureAlignment / 4 - 1) & ~( spvLinearTextureAlignment / 4 - 1)) * (tc).y) + (tc).x)
43
44fragment void main0(constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
45{
46    (*spvDescriptorSet0.m_9).baz = 0;
47    spvDescriptorSet0.img4.write(float4(1.0, 0.0, 0.0, 1.0), uint2(int2(1)));
48    spvDescriptorSet0.img.write(spvDescriptorSet0.img3.read(uint2(int2(0))), uint2(int2(0)));
49    uint _39 = atomic_fetch_add_explicit((device atomic_uint*)&spvDescriptorSet0.img2_atomic[spvImage2DAtomicCoord(int2(0), spvDescriptorSet0.img2)], 1u, memory_order_relaxed);
50    (*spvDescriptorSet0.m_42).foo += 42;
51    uint _55 = atomic_fetch_and_explicit((volatile device atomic_uint*)&(*spvDescriptorSet0.m_42).bar, (*spvDescriptorSet0.m_52).quux, memory_order_relaxed);
52}
53
54