#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct tint_array_wrapper {
  float arr[2];
};
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_4) {
  tint_array_wrapper data = {};
  float x_32 = 0.0f;
  x_32 = x_6.injectionSwitch.x;
  data.arr[0] = x_32;
  data.arr[1] = x_32;
  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  float const x_35 = data.arr[1];
  if ((x_35 > 1.0f)) {
    float x_43_phi = 0.0f;
    int const x_39 = int(x_32);
    x_43_phi = 0.0f;
    switch(x_39) {
      case 0: {
        x_43_phi = 1.0f;
        /* fallthrough */
      }
      case 1: {
        float const x_43 = x_43_phi;
        data.arr[x_39] = x_43;
        *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
        break;
      }
      default: {
        break;
      }
    }
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

