#pragma clang diagnostic ignored "-Wmissing-prototypes" #include #include using namespace metal; template [[clang::optnone]] T spvFMul(T l, T r) { return fma(l, r, T(0)); } template [[clang::optnone]] vec spvFMulVectorMatrix(vec v, matrix m) { vec res = vec(0); for (uint i = Rows; i > 0; --i) { vec tmp(0); for (uint j = 0; j < Cols; ++j) { tmp[j] = m[j][i - 1]; } res = fma(tmp, vec(v[i - 1]), res); } return res; } template [[clang::optnone]] vec spvFMulMatrixVector(matrix m, vec v) { vec res = vec(0); for (uint i = Cols; i > 0; --i) { res = fma(m[i - 1], vec(v[i - 1]), res); } return res; } template [[clang::optnone]] matrix spvFMulMatrixMatrix(matrix l, matrix r) { matrix res; for (uint i = 0; i < RCols; i++) { vec tmp(0); for (uint j = 0; j < LCols; j++) { tmp = fma(vec(r[i][j]), l[j], tmp); } res[i] = tmp; } return res; } template [[clang::optnone]] T spvFAdd(T l, T r) { return fma(T(1), l, r); } template [[clang::optnone]] T spvFSub(T l, T r) { return fma(T(-1), r, l); } struct main0_out { float4 gl_Position [[position]]; }; struct main0_in { float4 vA [[attribute(0)]]; float4 vB [[attribute(1)]]; float4 vC [[attribute(2)]]; }; vertex main0_out main0(main0_in in [[stage_in]]) { main0_out out = {}; float4 _15 = spvFMul(in.vA, in.vB); out.gl_Position = spvFAdd(spvFAdd(spvFAdd(_15, spvFAdd(in.vA, in.vB)), spvFSub(in.vA, in.vB)), spvFAdd(_15, in.vC)); return out; }