void set_float3(inout float3 vec, int idx, float val) {
  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}

cbuffer cbuffer_x_10 : register(b0, space0) {
  uint4 x_10[1];
};
static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);

float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
  float x_91 = 0.0f;
  float x_91_phi = 0.0f;
  int x_94_phi = 0;
  x_91_phi = -0.5f;
  x_94_phi = 1;
  while (true) {
    float x_104 = 0.0f;
    float x_113 = 0.0f;
    int x_95 = 0;
    float x_92_phi = 0.0f;
    x_91 = x_91_phi;
    const int x_94 = x_94_phi;
    if ((x_94 < 800)) {
    } else {
      break;
    }
    float x_112 = 0.0f;
    float x_113_phi = 0.0f;
    if (((x_94 % 32) == 0)) {
      x_104 = (x_91 + 0.400000006f);
      x_92_phi = x_104;
    } else {
      const float x_106 = thirty_two;
      x_113_phi = x_91;
      if (((float(x_94) - (round(x_106) * floor((float(x_94) / round(x_106))))) <= 0.01f)) {
        x_112 = (x_91 + 100.0f);
        x_113_phi = x_112;
      }
      x_113 = x_113_phi;
      x_92_phi = x_113;
    }
    float x_92 = 0.0f;
    x_92 = x_92_phi;
    const float x_115 = limit;
    if ((float(x_94) >= x_115)) {
      return x_92;
    }
    {
      x_95 = (x_94 + 1);
      x_91_phi = x_92;
      x_94_phi = x_95;
    }
  }
  return x_91;
}

void main_1() {
  float3 c = float3(0.0f, 0.0f, 0.0f);
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  int x_68_phi = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  const float x_52 = asfloat(x_10[0].x);
  const float x_54 = round((x_52 * 0.125f));
  const float x_56 = gl_FragCoord.x;
  param = x_56;
  param_1 = x_54;
  const float x_57 = compute_value_f1_f1_(param, param_1);
  c.x = x_57;
  const float x_60 = gl_FragCoord.y;
  param_2 = x_60;
  param_3 = x_54;
  const float x_61 = compute_value_f1_f1_(param_2, param_3);
  c.y = x_61;
  const float x_63 = c.x;
  const float x_64 = c.y;
  c.z = (x_63 + x_64);
  x_68_phi = 0;
  while (true) {
    int x_69 = 0;
    const int x_68 = x_68_phi;
    if ((x_68 < 3)) {
    } else {
      break;
    }
    const int x_74_save = x_68;
    const float x_75 = c[x_74_save];
    if ((x_75 >= 1.0f)) {
      const float x_79 = c[x_74_save];
      const float x_80 = c[x_74_save];
      set_float3(c, x_74_save, (x_79 * x_80));
    }
    {
      x_69 = (x_68 + 1);
      x_68_phi = x_69;
    }
  }
  const float3 x_84 = normalize(abs(c));
  x_GLF_color = float4(x_84.x, x_84.y, x_84.z, 1.0f);
  return;
}

struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 gl_FragCoord_param : SV_Position;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 : SV_Target0;
};

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  const main_out tint_symbol_3 = {x_GLF_color};
  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
  return tint_symbol_5;
}
