#pragma clang diagnostic ignored "-Wmissing-prototypes" #include #include using namespace metal; typedef packed_float3 packed_rm_float3x4[4]; struct SSBOCol { float3x4 col_major0; float3x4 col_major1; }; struct SSBORow { packed_rm_float3x4 row_major0; packed_rm_float3x4 row_major1; }; void load_store_to_variable_col_major(device SSBOCol& v_29) { float3x4 loaded = v_29.col_major0; v_29.col_major1 = loaded; } void load_store_to_variable_row_major(device SSBORow& v_41) { float3x4 loaded = transpose(float3x4(float3(v_41.row_major0[0]), float3(v_41.row_major0[1]), float3(v_41.row_major0[2]), float3(v_41.row_major0[3]))); v_41.row_major0[0] = float3(loaded[0][0], loaded[1][0], loaded[2][0]); v_41.row_major0[1] = float3(loaded[0][1], loaded[1][1], loaded[2][1]); v_41.row_major0[2] = float3(loaded[0][2], loaded[1][2], loaded[2][2]); v_41.row_major0[3] = float3(loaded[0][3], loaded[1][3], loaded[2][3]); } void copy_col_major_to_col_major(device SSBOCol& v_29) { v_29.col_major0 = v_29.col_major1; } void copy_col_major_to_row_major(device SSBOCol& v_29, device SSBORow& v_41) { v_41.row_major0[0] = float3(v_29.col_major0[0][0], v_29.col_major0[1][0], v_29.col_major0[2][0]); v_41.row_major0[1] = float3(v_29.col_major0[0][1], v_29.col_major0[1][1], v_29.col_major0[2][1]); v_41.row_major0[2] = float3(v_29.col_major0[0][2], v_29.col_major0[1][2], v_29.col_major0[2][2]); v_41.row_major0[3] = float3(v_29.col_major0[0][3], v_29.col_major0[1][3], v_29.col_major0[2][3]); } void copy_row_major_to_col_major(device SSBOCol& v_29, device SSBORow& v_41) { v_29.col_major0 = transpose(float3x4(float3(v_41.row_major0[0]), float3(v_41.row_major0[1]), float3(v_41.row_major0[2]), float3(v_41.row_major0[3]))); } void copy_row_major_to_row_major(device SSBORow& v_41) { v_41.row_major0[0] = float3x4(float4(v_41.row_major1[0]), float4(v_41.row_major1[1]), float4(v_41.row_major1[2]))[0]; v_41.row_major0[1] = float3x4(float4(v_41.row_major1[0]), float4(v_41.row_major1[1]), float4(v_41.row_major1[2]))[1]; v_41.row_major0[2] = float3x4(float4(v_41.row_major1[0]), float4(v_41.row_major1[1]), float4(v_41.row_major1[2]))[2]; v_41.row_major0[3] = float3x4(float4(v_41.row_major1[0]), float4(v_41.row_major1[1]), float4(v_41.row_major1[2]))[3]; } void copy_columns(device SSBOCol& v_29, device SSBORow& v_41) { v_29.col_major0[1] = float4(v_41.row_major0[0][1], v_41.row_major0[1][1], v_41.row_major0[2][1], v_41.row_major0[3][1]); v_41.row_major0[0][1] = v_29.col_major0[1].x; v_41.row_major0[1][1] = v_29.col_major0[1].y; v_41.row_major0[2][1] = v_29.col_major0[1].z; v_41.row_major0[3][1] = v_29.col_major0[1].w; } void copy_elements(device SSBOCol& v_29, device SSBORow& v_41) { v_29.col_major0[0].y = v_41.row_major0[1u][0]; v_41.row_major0[1u][0] = v_29.col_major0[0].y; } kernel void main0(device SSBOCol& v_29 [[buffer(0)]], device SSBORow& v_41 [[buffer(1)]]) { load_store_to_variable_col_major(v_29); load_store_to_variable_row_major(v_41); copy_col_major_to_col_major(v_29); copy_col_major_to_row_major(v_29, v_41); copy_row_major_to_col_major(v_29, v_41); copy_row_major_to_row_major(v_41); copy_columns(v_29, v_41); copy_elements(v_29, v_41); }