SPIRV-Cross/reference/shaders-ue4/asm/frag/texture-atomics.asm.argument.msl2.frag
Chip Davis 5547b25afe Interleave undef values with constants and types.
Undef values may be of struct type and may be used in constants.
Therefore, they must be interleaved with constants and types.

Fixes the rest of the Vulkan CTS test
`dEQP-VK.spirv_assembly.instruction.compute.opundef.undefined_spec_constant_composite`.

(Please excuse the churn in the reference output; it's an inevitable
result of this change.)
2022-11-20 02:08:37 -08:00

131 lines
4.1 KiB
GLSL

#pragma clang diagnostic ignored "-Wmissing-prototypes"
#pragma clang diagnostic ignored "-Wmissing-braces"
#pragma clang diagnostic ignored "-Wunused-variable"
#include <metal_stdlib>
#include <simd/simd.h>
#include <metal_atomic>
using namespace metal;
template<typename T, size_t Num>
struct spvUnsafeArray
{
T elements[Num ? Num : 1];
thread T& operator [] (size_t pos) thread
{
return elements[pos];
}
constexpr const thread T& operator [] (size_t pos) const thread
{
return elements[pos];
}
device T& operator [] (size_t pos) device
{
return elements[pos];
}
constexpr const device T& operator [] (size_t pos) const device
{
return elements[pos];
}
constexpr const constant T& operator [] (size_t pos) const constant
{
return elements[pos];
}
threadgroup T& operator [] (size_t pos) threadgroup
{
return elements[pos];
}
constexpr const threadgroup T& operator [] (size_t pos) const threadgroup
{
return elements[pos];
}
};
struct type_StructuredBuffer_v4float
{
float4 _m0[1];
};
struct type_Globals
{
uint2 ShadowTileListGroupSize;
};
constant float3 _70 = {};
struct spvDescriptorSetBuffer0
{
const device type_StructuredBuffer_v4float* CulledObjectBoxBounds [[id(0)]];
constant type_Globals* _Globals [[id(1)]];
texture2d<uint> RWShadowTileNumCulledObjects [[id(2)]];
device atomic_uint* RWShadowTileNumCulledObjects_atomic [[id(3)]];
};
struct main0_out
{
float4 out_var_SV_Target0 [[color(0)]];
};
struct main0_in
{
uint in_var_TEXCOORD0 [[user(locn0)]];
};
fragment main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]], float4 gl_FragCoord [[position]])
{
main0_out out = {};
uint2 _77 = uint2(gl_FragCoord.xy);
uint _78 = _77.y;
uint _83 = _77.x;
float2 _91 = float2(float(_83), float(((*spvDescriptorSet0._Globals).ShadowTileListGroupSize.y - 1u) - _78));
float2 _93 = float2((*spvDescriptorSet0._Globals).ShadowTileListGroupSize);
float2 _96 = ((_91 / _93) * float2(2.0)) - float2(1.0);
float2 _100 = (((_91 + float2(1.0)) / _93) * float2(2.0)) - float2(1.0);
float3 _101 = float3(_100.x, _100.y, _70.z);
_101.z = 1.0;
uint _103 = in.in_var_TEXCOORD0 * 5u;
uint _107 = _103 + 1u;
if (all((*spvDescriptorSet0.CulledObjectBoxBounds)._m0[_107].xy > _96.xy) && all((*spvDescriptorSet0.CulledObjectBoxBounds)._m0[_103].xyz < _101))
{
float3 _121 = float3(0.5) * ((*spvDescriptorSet0.CulledObjectBoxBounds)._m0[_103].xyz + (*spvDescriptorSet0.CulledObjectBoxBounds)._m0[_107].xyz);
float _122 = _96.x;
float _123 = _96.y;
spvUnsafeArray<float3, 8> _73;
_73[0] = float3(_122, _123, -1000.0);
float _126 = _100.x;
_73[1] = float3(_126, _123, -1000.0);
float _129 = _100.y;
_73[2] = float3(_122, _129, -1000.0);
_73[3] = float3(_126, _129, -1000.0);
_73[4] = float3(_122, _123, 1.0);
_73[5] = float3(_126, _123, 1.0);
_73[6] = float3(_122, _129, 1.0);
_73[7] = float3(_126, _129, 1.0);
float3 _155;
float3 _158;
_155 = float3(-500000.0);
_158 = float3(500000.0);
for (int _160 = 0; _160 < 8; )
{
float3 _166 = _73[_160] - _121;
float3 _170 = float3(dot(_166, (*spvDescriptorSet0.CulledObjectBoxBounds)._m0[_103 + 2u].xyz), dot(_166, (*spvDescriptorSet0.CulledObjectBoxBounds)._m0[_103 + 3u].xyz), dot(_166, (*spvDescriptorSet0.CulledObjectBoxBounds)._m0[_103 + 4u].xyz));
_155 = fast::max(_155, _170);
_158 = fast::min(_158, _170);
_160++;
continue;
}
if (all(_158 < float3(1.0)) && all(_155 > float3(-1.0)))
{
uint _179 = atomic_fetch_add_explicit((device atomic_uint*)&spvDescriptorSet0.RWShadowTileNumCulledObjects_atomic[(_78 * (*spvDescriptorSet0._Globals).ShadowTileListGroupSize.x) + _83], 1u, memory_order_relaxed);
}
}
out.out_var_SV_Target0 = float4(0.0);
return out;
}