RetroArch/deps/SPIRV-Cross/reference/shaders-msl/frag/shader-arithmetic-8bit.frag
twinaphex 420b7913d4 Squashed 'deps/SPIRV-Cross/' changes from 8aa6731925..2820ab0b51
2820ab0b51 Merge pull request #1076 from KhronosGroup/bitcast-pre-330-glsl
63bcbd511e GLSL: Need extension to use bitcast on GLSL < 330.
9f3bebe3d0 Merge pull request #1075 from lifpan/master
b11c20fc1d Remove unreasonable assertion for OpTypeImage Sampled parameter.
1a592b7c0f Merge pull request #1067 from cdavis5e/msl-scalar-block-layout
28454facbb MSL: Handle packed matrices.
ea5c0ed82f MSL: Fix alignment of packed types.
44f688bf0b Merge pull request #1070 from KhronosGroup/fix-1066
25c74b324e Forget loop variable enables after emitting block chain.
6b010e0cbc Merge pull request #1069 from KhronosGroup/fix-1053
f6f849397e MSL: Re-roll array expressions in initializers.
e5fa7edfd6 MSL: Support scalar block layout.

git-subtree-dir: deps/SPIRV-Cross
git-subtree-split: 2820ab0b51bf5e4187435d904b34e762b988f48b
2019-07-11 20:37:45 +02:00

99 lines
2.2 KiB
JavaScript

#pragma clang diagnostic ignored "-Wmissing-prototypes"
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct SSBO
{
char i8[16];
uchar u8[16];
};
struct Push
{
char i8;
uchar u8;
};
struct UBO
{
char i8;
uchar u8;
};
struct main0_out
{
int4 FragColorInt [[color(0)]];
uint4 FragColorUint [[color(1)]];
};
struct main0_in
{
int4 vColor [[user(locn0)]];
};
void packing_int8(device SSBO& ssbo)
{
short i16 = 10;
int i32 = 20;
char2 i8_2 = as_type<char2>(i16);
char4 i8_4 = as_type<char4>(i32);
i16 = as_type<short>(i8_2);
i32 = as_type<int>(i8_4);
ssbo.i8[0] = i8_4.x;
ssbo.i8[1] = i8_4.y;
ssbo.i8[2] = i8_4.z;
ssbo.i8[3] = i8_4.w;
}
void packing_uint8(device SSBO& ssbo)
{
ushort u16 = 10u;
uint u32 = 20u;
uchar2 u8_2 = as_type<uchar2>(u16);
uchar4 u8_4 = as_type<uchar4>(u32);
u16 = as_type<ushort>(u8_2);
u32 = as_type<uint>(u8_4);
ssbo.u8[0] = u8_4.x;
ssbo.u8[1] = u8_4.y;
ssbo.u8[2] = u8_4.z;
ssbo.u8[3] = u8_4.w;
}
void compute_int8(device SSBO& ssbo, thread int4& vColor, constant Push& registers, constant UBO& ubo, thread int4& FragColorInt)
{
char4 tmp = char4(vColor);
tmp += char4(registers.i8);
tmp += char4(char(-40));
tmp += char4(-50);
tmp += char4(char(10), char(20), char(30), char(40));
tmp += char4(ssbo.i8[4]);
tmp += char4(ubo.i8);
FragColorInt = int4(tmp);
}
void compute_uint8(device SSBO& ssbo, thread int4& vColor, constant Push& registers, constant UBO& ubo, thread uint4& FragColorUint)
{
uchar4 tmp = uchar4(char4(vColor));
tmp += uchar4(registers.u8);
tmp += uchar4(uchar(216));
tmp += uchar4(206);
tmp += uchar4(uchar(10), uchar(20), uchar(30), uchar(40));
tmp += uchar4(ssbo.u8[4]);
tmp += uchar4(ubo.u8);
FragColorUint = uint4(tmp);
}
fragment main0_out main0(main0_in in [[stage_in]], device SSBO& ssbo [[buffer(0)]], constant Push& registers [[buffer(1)]], constant UBO& ubo [[buffer(2)]])
{
main0_out out = {};
packing_int8(ssbo);
packing_uint8(ssbo);
compute_int8(ssbo, in.vColor, registers, ubo, out.FragColorInt);
compute_uint8(ssbo, in.vColor, registers, ubo, out.FragColorUint);
return out;
}