#include <metal_stdlib>

using namespace metal;
struct main_out {
  int x_4_1;
  float4 gl_Position;
};
struct tint_symbol_2 {
  float3 x_2_param [[attribute(0)]];
  int x_3_param [[attribute(1)]];
};
struct tint_symbol_3 {
  int x_4_1 [[user(locn0)]];
  float4 gl_Position [[position]];
};

void main_1(thread float3* const tint_symbol_5, thread float4* const tint_symbol_6, thread int* const tint_symbol_7, thread int* const tint_symbol_8) {
  float3 const x_22 = *(tint_symbol_5);
  *(tint_symbol_6) = float4(x_22, 1.0f);
  *(tint_symbol_7) = *(tint_symbol_8);
  return;
}

main_out tint_symbol_inner(float3 x_2_param, int x_3_param, thread float3* const tint_symbol_9, thread int* const tint_symbol_10, thread float4* const tint_symbol_11, thread int* const tint_symbol_12) {
  *(tint_symbol_9) = x_2_param;
  *(tint_symbol_10) = x_3_param;
  main_1(tint_symbol_9, tint_symbol_11, tint_symbol_12, tint_symbol_10);
  main_out const tint_symbol_4 = {.x_4_1=*(tint_symbol_12), .gl_Position=*(tint_symbol_11)};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread float3 tint_symbol_13 = 0.0f;
  thread int tint_symbol_14 = 0;
  thread float4 tint_symbol_15 = 0.0f;
  thread int tint_symbol_16 = 0;
  main_out const inner_result = tint_symbol_inner(tint_symbol_1.x_2_param, tint_symbol_1.x_3_param, &(tint_symbol_13), &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_16));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.x_4_1 = inner_result.x_4_1;
  wrapper_result.gl_Position = inner_result.gl_Position;
  return wrapper_result;
}

