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

using namespace metal;
int4 textureLoad_0cb698(texture1d<int, access::sample> tint_symbol) {
  uint const level_idx = min(1u, (tint_symbol.get_num_mip_levels() - 1u));
  int4 res = tint_symbol.read(uint(min(1u, (tint_symbol.get_width(0) - 1u))), 0);
  return res;
}

struct VertexOutput {
  float4 pos;
  int4 prevent_dce;
};

fragment void fragment_main(device int4* tint_symbol_1 [[buffer(0)]], texture1d<int, access::sample> tint_symbol_2 [[texture(0)]]) {
  *(tint_symbol_1) = textureLoad_0cb698(tint_symbol_2);
  return;
}

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

using namespace metal;
int4 textureLoad_0cb698(texture1d<int, access::sample> tint_symbol) {
  uint const level_idx = min(1u, (tint_symbol.get_num_mip_levels() - 1u));
  int4 res = tint_symbol.read(uint(min(1u, (tint_symbol.get_width(0) - 1u))), 0);
  return res;
}

struct VertexOutput {
  float4 pos;
  int4 prevent_dce;
};

kernel void compute_main(device int4* tint_symbol_1 [[buffer(0)]], texture1d<int, access::sample> tint_symbol_2 [[texture(0)]]) {
  *(tint_symbol_1) = textureLoad_0cb698(tint_symbol_2);
  return;
}

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

using namespace metal;
int4 textureLoad_0cb698(texture1d<int, access::sample> tint_symbol_1) {
  uint const level_idx = min(1u, (tint_symbol_1.get_num_mip_levels() - 1u));
  int4 res = tint_symbol_1.read(uint(min(1u, (tint_symbol_1.get_width(0) - 1u))), 0);
  return res;
}

struct VertexOutput {
  float4 pos;
  int4 prevent_dce;
};

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

VertexOutput vertex_main_inner(texture1d<int, access::sample> tint_symbol_2) {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = textureLoad_0cb698(tint_symbol_2);
  return out;
}

vertex tint_symbol vertex_main(texture1d<int, access::sample> tint_symbol_3 [[texture(0)]]) {
  VertexOutput const inner_result = vertex_main_inner(tint_symbol_3);
  tint_symbol wrapper_result = {};
  wrapper_result.pos = inner_result.pos;
  wrapper_result.prevent_dce = inner_result.prevent_dce;
  return wrapper_result;
}

