e2c95bdcbc
We used to use the Binding decoration for this, but this method is hopelessly broken. If no explicit MSL resource remapping exists, we remap automatically in a manner which should always "just work".
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_2 [[texture(0)]], texture2d<uint> buff_in_1 [[texture(1)]], 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;
|
|
}
|
|
|