//
// fragment_main
//
#include <metal_stdlib>

using namespace metal;
int3 tint_sign(int3 v) {
  return select(select(int3(-1), int3(1), (v > int3(0))), int3(0), (v == int3(0)));
}

int3 sign_9603b1() {
  int3 arg_0 = int3(1);
  int3 res = tint_sign(arg_0);
  return res;
}

struct VertexOutput {
  float4 pos;
  int3 prevent_dce;
};

fragment void fragment_main(device packed_int3* tint_symbol [[buffer(0)]]) {
  *(tint_symbol) = packed_int3(sign_9603b1());
  return;
}

//
// compute_main
//
#include <metal_stdlib>

using namespace metal;
int3 tint_sign(int3 v) {
  return select(select(int3(-1), int3(1), (v > int3(0))), int3(0), (v == int3(0)));
}

int3 sign_9603b1() {
  int3 arg_0 = int3(1);
  int3 res = tint_sign(arg_0);
  return res;
}

struct VertexOutput {
  float4 pos;
  int3 prevent_dce;
};

kernel void compute_main(device packed_int3* tint_symbol [[buffer(0)]]) {
  *(tint_symbol) = packed_int3(sign_9603b1());
  return;
}

//
// vertex_main
//
#include <metal_stdlib>

using namespace metal;
int3 tint_sign(int3 v) {
  return select(select(int3(-1), int3(1), (v > int3(0))), int3(0), (v == int3(0)));
}

int3 sign_9603b1() {
  int3 arg_0 = int3(1);
  int3 res = tint_sign(arg_0);
  return res;
}

struct VertexOutput {
  float4 pos;
  int3 prevent_dce;
};

struct tint_symbol {
  int3 prevent_dce [[user(locn0)]] [[flat]];
  float4 pos [[position]];
};

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = sign_9603b1();
  return out;
}

vertex tint_symbol vertex_main() {
  VertexOutput const inner_result = vertex_main_inner();
  tint_symbol wrapper_result = {};
  wrapper_result.pos = inner_result.pos;
  wrapper_result.prevent_dce = inner_result.prevent_dce;
  return wrapper_result;
}

