#include <metal_stdlib>

using namespace metal;
struct vertexUniformBuffer1 {
  /* 0x0000 */ float2x2 transform1;
};

struct vertexUniformBuffer2 {
  /* 0x0000 */ float2x2 transform2;
};

struct tint_symbol_1 {
  float4 value [[position]];
};

struct tint_array_wrapper {
  float2 arr[3];
};

float4 tint_symbol_inner(uint gl_VertexIndex, const constant vertexUniformBuffer1* const tint_symbol_3, const constant vertexUniformBuffer2* const tint_symbol_4) {
  tint_array_wrapper indexable = {};
  float2x2 const x_23 = (*(tint_symbol_3)).transform1;
  float2x2 const x_28 = (*(tint_symbol_4)).transform2;
  uint const x_46 = gl_VertexIndex;
  tint_array_wrapper const tint_symbol_2 = {.arr={float2(-1.0f, 1.0f), float2(1.0f), float2(-1.0f)}};
  indexable = tint_symbol_2;
  float2 const x_51 = indexable.arr[x_46];
  float2 const x_52 = (float2x2((x_23[0u] + x_28[0u]), (x_23[1u] + x_28[1u])) * x_51);
  return float4(x_52[0], x_52[1], 0.0f, 1.0f);
}

vertex tint_symbol_1 tint_symbol(const constant vertexUniformBuffer1* tint_symbol_5 [[buffer(0)]], const constant vertexUniformBuffer2* tint_symbol_6 [[buffer(1)]], uint gl_VertexIndex [[vertex_id]]) {
  float4 const inner_result = tint_symbol_inner(gl_VertexIndex, tint_symbol_5, tint_symbol_6);
  tint_symbol_1 wrapper_result = {};
  wrapper_result.value = inner_result;
  return wrapper_result;
}

