#include <metal_stdlib>

using namespace metal;

template<typename T>
T tint_dot4(vec<T,4> a, vec<T,4> b) {
  return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];
}
uint tint_pack_4xi8_clamp(int4 a) {
  int4 const a_clamp = clamp(a, int4(-128), int4(127));
  uint4 const a_u32 = as_type<uint4>(a_clamp);
  uint4 const a_u8 = ((a_u32 & uint4(255u)) << uint4(0u, 8u, 16u, 24u));
  return tint_dot4(a_u8, uint4(1u));
}

uint pack4xI8Clamp_e42b2a() {
  int4 arg_0 = int4(1);
  uint res = tint_pack_4xi8_clamp(arg_0);
  return res;
}

fragment void fragment_main(device uint* tint_symbol_1 [[buffer(0)]]) {
  *(tint_symbol_1) = pack4xI8Clamp_e42b2a();
  return;
}

kernel void compute_main(device uint* tint_symbol_2 [[buffer(0)]]) {
  *(tint_symbol_2) = pack4xI8Clamp_e42b2a();
  return;
}

struct VertexOutput {
  float4 pos;
  uint prevent_dce;
};

struct tint_symbol {
  uint prevent_dce [[user(locn0)]] [[flat]];
  float4 pos [[position]];
};

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = pack4xI8Clamp_e42b2a();
  return out;
}

vertex tint_symbol vertex_main() {
  VertexOutput const inner_result = vertex_main_inner();
  tint_symbol wrapper_result = {};
  wrapper_result.pos = inner_result.pos;
  wrapper_result.prevent_dce = inner_result.prevent_dce;
  return wrapper_result;
}

