#include <metal_stdlib>
using namespace metal;

struct S {
  float f;
  uint u;
  float4 v;
};

struct tint_module_vars_struct {
  device S* output;
};

struct frag_main_inputs {
  float S_f [[user(locn0)]];
  uint S_u [[user(locn1)]] [[flat]];
};

void tint_store_and_preserve_padding(device S* const target, S value_param) {
  (*target).f = value_param.f;
  (*target).u = value_param.u;
  (*target).v = value_param.v;
}

void frag_main_inner(S input, tint_module_vars_struct tint_module_vars) {
  float const f = input.f;
  uint const u = input.u;
  float4 const v = input.v;
  tint_store_and_preserve_padding(tint_module_vars.output, input);
}

fragment void frag_main(frag_main_inputs inputs [[stage_in]], float4 S_v [[position]], device S* output [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.output=output};
  frag_main_inner(S{.f=inputs.S_f, .u=inputs.S_u, .v=S_v}, tint_module_vars);
}
