#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[2];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
struct buf2 {
  /* 0x0000 */ float zero;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[2];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

bool func_vf2_(constant buf1& x_8, constant buf2& x_10, thread float2* const pos) {
  float const x_62 = (*(pos)).x;
  float const x_64 = x_8.x_GLF_uniform_float_values.arr[0].el;
  if ((x_62 < x_64)) {
    return true;
  }
  float const x_69 = (*(pos)).y;
  float const x_71 = x_8.x_GLF_uniform_float_values.arr[0].el;
  if ((x_69 > x_71)) {
    return false;
  }
  float const x_76 = x_10.zero;
  float const x_78 = x_8.x_GLF_uniform_float_values.arr[1].el;
  if ((x_76 > x_78)) {
    return true;
  }
  return true;
}

void main_1(constant buf1& x_8, constant buf2& x_10, constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float2 param = 0.0f;
  float4 const x_42 = *(tint_symbol_5);
  param = float2(x_42.x, x_42.y);
  bool const x_44 = func_vf2_(x_8, x_10, &(param));
  if (x_44) {
    discard_fragment();
  }
  int const x_48 = x_13.x_GLF_uniform_int_values.arr[0].el;
  int const x_51 = x_13.x_GLF_uniform_int_values.arr[1].el;
  int const x_54 = x_13.x_GLF_uniform_int_values.arr[1].el;
  int const x_57 = x_13.x_GLF_uniform_int_values.arr[0].el;
  *(tint_symbol_6) = float4(float(x_48), float(x_51), float(x_54), float(x_57));
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf2& x_10 [[buffer(2)]], constant buf0& x_13 [[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_8, x_10, x_13, &(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;
}

