#include <metal_stdlib>

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

void main_1(constant buf0& x_6, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  while (true) {
    bool x_46_phi = false;
    while (true) {
      float const x_37 = (*(tint_symbol_3)).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_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_6, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_6, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 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;
  main_out const inner_result = tint_symbol_inner(x_6, gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

