#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)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  while (true) {
    bool x_46_phi = false;
    while (true) {
      float const x_37 = (*(tint_symbol_5)).x;
      if ((x_37 < 0.0f)) {
        float const x_42 = x_6.injectionSwitch.y;
        if ((1.0f > x_42)) {
          discard_fragment();
        } else {
          {
            x_46_phi = false;
            if (false) {
            } else {
              break;
            }
          }
          continue;
        }
        {
          x_46_phi = false;
          if (false) {
          } else {
            break;
          }
        }
        continue;
      }
      x_46_phi = true;
      break;
      {
        x_46_phi = false;
        if (false) {
        } else {
          break;
        }
      }
    }
    bool const x_46 = x_46_phi;
    if (x_46) {
      break;
    }
    break;
  }
  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[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_6, &(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;
}

