// Generated by SharpEmu Gen5MslTranslator. #include using namespace metal; struct SharpEmuUniforms { uint dispatch_limit_x; uint dispatch_limit_y; uint dispatch_limit_z; uint reserved; uint buffer_bytes[1]; }; static inline uint sharpemu_load_word(device uint* b, uint bytes, uint addr) { if ((addr & 3u) == 0u) { return addr + 4u <= bytes ? b[addr >> 2] : 0u; } uint value = 0u; device const uchar* p = (device const uchar*)b; for (uint i = 0u; i < 4u; i++) { if (addr + i < bytes) { value |= (uint)p[addr + i] << (i * 8u); } } return value; } static inline uint sharpemu_load_bytes(device uint* b, uint bytes, uint addr, uint count, bool signExtend) { uint value = 0u; device const uchar* p = (device const uchar*)b; for (uint i = 0u; i < count; i++) { if (addr + i < bytes) { value |= (uint)p[addr + i] << (i * 8u); } } if (signExtend && count < 4u) { uint shift = 32u - (count * 8u); value = (uint)(((int)(value << shift)) >> shift); } return value; } static inline void sharpemu_store_bytes(device uint* b, uint bytes, uint addr, uint value, uint count) { device uchar* p = (device uchar*)b; for (uint i = 0u; i < count; i++) { if (addr + i < bytes) { p[addr + i] = (uchar)((value >> (i * 8u)) & 0xFFu); } } } static inline uint sharpemu_ballot(bool value) { return value ? 1u : 0u; } static constant float sharpemu_off_i4_table[16] = { 0.0f, 0.0625f, 0.1250f, 0.1875f, 0.2500f, 0.3125f, 0.3750f, 0.4375f, -0.5000f, -0.4375f, -0.3750f, -0.3125f, -0.2500f, -0.1875f, -0.1250f, -0.0625f, }; struct Gen5PsIn { float4 sharpemu_frag_coord [[position]]; float4 attr0 [[user(locn0)]]; }; struct Gen5PsOut { float4 mrt0 [[color(0)]]; }; fragment Gen5PsOut gen5_ps( Gen5PsIn sharpemu_in [[stage_in]], constant SharpEmuUniforms& sharpemu_uniforms [[buffer(0)]]) { const uint sharpemu_lane = 0u; uint s[128] = {}; uint v[256] = {}; bool exec = true; bool vcc = false; bool scc = false; uint pc = 0u; bool active = true; uint steps = 0u; Gen5PsOut sharpemu_out = {}; uint bias[1] = {}; s[106] = 0u; s[107] = 0u; s[126] = sharpemu_ballot(true); s[127] = 0u; while (active) { switch (pc) { case 0u: { if (exec) { v[0] = as_type(sharpemu_in.attr0[0]); } if (exec) { v[1] = as_type(sharpemu_in.attr0[1]); } uint t0 = 0x3F800000u; if (exec) { v[2] = t0; } uint t1 = 0x3F000000u; if (exec) { v[3] = t1; } sharpemu_out.mrt0 = exec ? vec(as_type(v[0]), as_type(v[1]), as_type(v[2]), as_type(v[3])) : sharpemu_out.mrt0; active = false; } break; default: active = false; break; } if (++steps >= 100000u) { active = false; } } if (!exec) { discard_fragment(); } return sharpemu_out; }