03d93abc1a
There is a risk that we try to preserve a loop variable through multiple iterations, even though the dominating block is inside a loop. Fix this by analyzing if a block starts off by writing to a variable. In that case, there cannot be any preservation going on. If we don't, pretend the loop header is reading the variable, which moves the variable to an appropriate scope.
196 lines
6.3 KiB
GLSL
196 lines
6.3 KiB
GLSL
#pragma clang diagnostic ignored "-Wmissing-prototypes"
|
|
|
|
#include <metal_stdlib>
|
|
#include <simd/simd.h>
|
|
|
|
using namespace metal;
|
|
|
|
struct attr_desc
|
|
{
|
|
int type;
|
|
int attribute_size;
|
|
int starting_offset;
|
|
int stride;
|
|
int swap_bytes;
|
|
int is_volatile;
|
|
};
|
|
|
|
struct VertexBuffer
|
|
{
|
|
float4x4 scale_offset_mat;
|
|
uint vertex_base_index;
|
|
int4 input_attributes[16];
|
|
};
|
|
|
|
struct VertexConstantsBuffer
|
|
{
|
|
float4 vc[16];
|
|
};
|
|
|
|
constant float4 _295 = {};
|
|
|
|
struct main0_out
|
|
{
|
|
float4 tc0 [[user(locn0)]];
|
|
float4 back_color [[user(locn10)]];
|
|
float4 gl_Position [[position]];
|
|
};
|
|
|
|
// Returns 2D texture coords corresponding to 1D texel buffer coords
|
|
uint2 spvTexelBufferCoord(uint tc)
|
|
{
|
|
return uint2(tc % 4096, tc / 4096);
|
|
}
|
|
|
|
attr_desc fetch_desc(thread const int& location, constant VertexBuffer& v_227)
|
|
{
|
|
int attribute_flags = v_227.input_attributes[location].w;
|
|
attr_desc result;
|
|
result.type = v_227.input_attributes[location].x;
|
|
result.attribute_size = v_227.input_attributes[location].y;
|
|
result.starting_offset = v_227.input_attributes[location].z;
|
|
result.stride = attribute_flags & 255;
|
|
result.swap_bytes = (attribute_flags >> 8) & 1;
|
|
result.is_volatile = (attribute_flags >> 9) & 1;
|
|
return result;
|
|
}
|
|
|
|
uint get_bits(thread const uint4& v, thread const int& swap)
|
|
{
|
|
if (swap != 0)
|
|
{
|
|
return ((v.w | (v.z << uint(8))) | (v.y << uint(16))) | (v.x << uint(24));
|
|
}
|
|
return ((v.x | (v.y << uint(8))) | (v.z << uint(16))) | (v.w << uint(24));
|
|
}
|
|
|
|
float4 fetch_attr(thread const attr_desc& desc, thread const int& vertex_id, thread const texture2d<uint> input_stream)
|
|
{
|
|
float4 result = float4(0.0, 0.0, 0.0, 1.0);
|
|
bool reverse_order = false;
|
|
int first_byte = (vertex_id * desc.stride) + desc.starting_offset;
|
|
uint4 tmp;
|
|
for (int n = 0; n < 4; n++)
|
|
{
|
|
if (n == desc.attribute_size)
|
|
{
|
|
break;
|
|
}
|
|
switch (desc.type)
|
|
{
|
|
case 0:
|
|
{
|
|
int _131 = first_byte;
|
|
first_byte = _131 + 1;
|
|
tmp.x = input_stream.read(spvTexelBufferCoord(_131)).x;
|
|
int _138 = first_byte;
|
|
first_byte = _138 + 1;
|
|
tmp.y = input_stream.read(spvTexelBufferCoord(_138)).x;
|
|
uint4 param = tmp;
|
|
int param_1 = desc.swap_bytes;
|
|
result[n] = float(get_bits(param, param_1));
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
int _156 = first_byte;
|
|
first_byte = _156 + 1;
|
|
tmp.x = input_stream.read(spvTexelBufferCoord(_156)).x;
|
|
int _163 = first_byte;
|
|
first_byte = _163 + 1;
|
|
tmp.y = input_stream.read(spvTexelBufferCoord(_163)).x;
|
|
int _170 = first_byte;
|
|
first_byte = _170 + 1;
|
|
tmp.z = input_stream.read(spvTexelBufferCoord(_170)).x;
|
|
int _177 = first_byte;
|
|
first_byte = _177 + 1;
|
|
tmp.w = input_stream.read(spvTexelBufferCoord(_177)).x;
|
|
uint4 param_2 = tmp;
|
|
int param_3 = desc.swap_bytes;
|
|
result[n] = as_type<float>(get_bits(param_2, param_3));
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
int _195 = first_byte;
|
|
first_byte = _195 + 1;
|
|
result[n] = float(input_stream.read(spvTexelBufferCoord(_195)).x);
|
|
reverse_order = desc.swap_bytes != 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
float4 _210;
|
|
if (reverse_order)
|
|
{
|
|
_210 = result.wzyx;
|
|
}
|
|
else
|
|
{
|
|
_210 = result;
|
|
}
|
|
return _210;
|
|
}
|
|
|
|
float4 read_location(thread const int& location, constant VertexBuffer& v_227, thread uint& gl_VertexIndex, thread texture2d<uint> buff_in_2, thread texture2d<uint> buff_in_1)
|
|
{
|
|
int param = location;
|
|
attr_desc desc = fetch_desc(param, v_227);
|
|
int vertex_id = gl_VertexIndex - int(v_227.vertex_base_index);
|
|
if (desc.is_volatile != 0)
|
|
{
|
|
attr_desc param_1 = desc;
|
|
int param_2 = vertex_id;
|
|
return fetch_attr(param_1, param_2, buff_in_2);
|
|
}
|
|
else
|
|
{
|
|
attr_desc param_3 = desc;
|
|
int param_4 = vertex_id;
|
|
return fetch_attr(param_3, param_4, buff_in_1);
|
|
}
|
|
}
|
|
|
|
void vs_adjust(thread float4& dst_reg0, thread float4& dst_reg1, thread float4& dst_reg7, constant VertexBuffer& v_227, thread uint& gl_VertexIndex, thread texture2d<uint> buff_in_2, thread texture2d<uint> buff_in_1, constant VertexConstantsBuffer& v_309)
|
|
{
|
|
int param = 3;
|
|
float4 in_diff_color = read_location(param, v_227, gl_VertexIndex, buff_in_2, buff_in_1);
|
|
int param_1 = 0;
|
|
float4 in_pos = read_location(param_1, v_227, gl_VertexIndex, buff_in_2, buff_in_1);
|
|
int param_2 = 8;
|
|
float4 in_tc0 = read_location(param_2, v_227, gl_VertexIndex, buff_in_2, buff_in_1);
|
|
dst_reg1 = in_diff_color * v_309.vc[13];
|
|
float4 tmp0;
|
|
tmp0.x = float4(dot(float4(in_pos.xyz, 1.0), v_309.vc[4])).x;
|
|
tmp0.y = float4(dot(float4(in_pos.xyz, 1.0), v_309.vc[5])).y;
|
|
tmp0.z = float4(dot(float4(in_pos.xyz, 1.0), v_309.vc[6])).z;
|
|
float4 tmp1;
|
|
tmp1 = float4(in_tc0.xy.x, in_tc0.xy.y, tmp1.z, tmp1.w);
|
|
tmp1.z = v_309.vc[15].x;
|
|
dst_reg7.y = float4(dot(float4(tmp1.xyz, 1.0), v_309.vc[8])).y;
|
|
dst_reg7.x = float4(dot(float4(tmp1.xyz, 1.0), v_309.vc[7])).x;
|
|
dst_reg0.y = float4(dot(float4(tmp0.xyz, 1.0), v_309.vc[1])).y;
|
|
dst_reg0.x = float4(dot(float4(tmp0.xyz, 1.0), v_309.vc[0])).x;
|
|
}
|
|
|
|
vertex main0_out main0(constant VertexBuffer& v_227 [[buffer(0)]], constant VertexConstantsBuffer& v_309 [[buffer(1)]], texture2d<uint> buff_in_1 [[texture(3)]], texture2d<uint> buff_in_2 [[texture(4)]], uint gl_VertexIndex [[vertex_id]])
|
|
{
|
|
main0_out out = {};
|
|
float4 dst_reg0 = float4(0.0, 0.0, 0.0, 1.0);
|
|
float4 dst_reg1 = float4(0.0);
|
|
float4 dst_reg7 = float4(0.0);
|
|
float4 param = dst_reg0;
|
|
float4 param_1 = dst_reg1;
|
|
float4 param_2 = dst_reg7;
|
|
vs_adjust(param, param_1, param_2, v_227, gl_VertexIndex, buff_in_2, buff_in_1, v_309);
|
|
dst_reg0 = param;
|
|
dst_reg1 = param_1;
|
|
dst_reg7 = param_2;
|
|
out.gl_Position = dst_reg0;
|
|
out.back_color = dst_reg1;
|
|
out.tc0 = dst_reg7;
|
|
out.gl_Position *= v_227.scale_offset_mat;
|
|
return out;
|
|
}
|
|
|