#include <metal_stdlib>

using namespace metal;
struct Uniforms {
  /* 0x0000 */ packed_float2 u_scale;
  /* 0x0008 */ packed_float2 u_offset;
};
struct VertexOutputs {
  float2 texcoords;
  float4 position;
};
struct tint_symbol {
  float2 texcoords [[user(locn0)]];
  float4 position [[position]];
};
struct tint_array_wrapper {
  float2 arr[3];
};
struct tint_symbol_2 {
  float2 texcoord [[user(locn0)]];
};
struct tint_symbol_3 {
  float4 value [[color(0)]];
};

VertexOutputs vs_main_inner(constant Uniforms& uniforms, uint VertexIndex) {
  tint_array_wrapper texcoord = {.arr={float2(-0.5f, 0.0f), float2(1.5f, 0.0f), float2(0.5f, 2.0f)}};
  VertexOutputs output = {};
  output.position = float4(((texcoord.arr[VertexIndex] * 2.0f) - float2(1.0f, 1.0f)), 0.0f, 1.0f);
  bool flipY = (uniforms.u_scale.y < 0.0f);
  if (flipY) {
    output.texcoords = ((((texcoord.arr[VertexIndex] * uniforms.u_scale) + uniforms.u_offset) * float2(1.0f, -1.0f)) + float2(0.0f, 1.0f));
  } else {
    output.texcoords = ((((texcoord.arr[VertexIndex] * float2(1.0f, -1.0f)) + float2(0.0f, 1.0f)) * uniforms.u_scale) + uniforms.u_offset);
  }
  return output;
}

vertex tint_symbol vs_main(uint VertexIndex [[vertex_id]], constant Uniforms& uniforms [[buffer(0)]]) {
  VertexOutputs const inner_result = vs_main_inner(uniforms, VertexIndex);
  tint_symbol wrapper_result = {};
  wrapper_result.texcoords = inner_result.texcoords;
  wrapper_result.position = inner_result.position;
  return wrapper_result;
}

float4 fs_main_inner(float2 texcoord, texture2d<float, access::sample> tint_symbol_4, sampler tint_symbol_5) {
  float2 clampedTexcoord = clamp(texcoord, float2(0.0f, 0.0f), float2(1.0f, 1.0f));
  if (!(all((clampedTexcoord == texcoord)))) {
    discard_fragment();
  }
  float4 srcColor = tint_symbol_4.sample(tint_symbol_5, texcoord);
  return srcColor;
}

fragment tint_symbol_3 fs_main(texture2d<float, access::sample> tint_symbol_6 [[texture(0)]], sampler tint_symbol_7 [[sampler(0)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  float4 const inner_result_1 = fs_main_inner(tint_symbol_1.texcoord, tint_symbol_6, tint_symbol_7);
  tint_symbol_3 wrapper_result_1 = {};
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}

