#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

float3 computePoint_(constant buf0& x_7) {
  float const x_48 = x_7.injectionSwitch.x;
  float const x_50 = x_7.injectionSwitch.y;
  if ((x_48 > x_50)) {
    discard_fragment();
  }
  return float3(0.0f, 0.0f, 0.0f);
}

void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  bool x_34 = false;
  while (true) {
    float3 const x_36 = computePoint_(x_7);
    float const x_41 = (*(tint_symbol_5)).x;
    if ((x_41 < 0.0f)) {
      x_34 = true;
      break;
    }
    float3 const x_45 = computePoint_(x_7);
    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
    x_34 = true;
    break;
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

