#include <metal_stdlib>
using namespace metal;
struct tint_module_vars_struct {
  texture1d<uint, access::sample> arg_0;
  device uint4* prevent_dce;
};
struct VertexOutput {
  float4 pos;
  uint4 prevent_dce;
};
struct vertex_main_outputs {
  float4 VertexOutput_pos [[position]];
  uint4 VertexOutput_prevent_dce [[user(locn0)]] [[flat]];
};

uint4 textureLoad_216c37(tint_module_vars_struct tint_module_vars) {
  uint4 res = tint_module_vars.arg_0.read(1u);
  return res;
}
fragment void fragment_main(texture1d<uint, access::sample> arg_0 [[texture(0)]], device uint4* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = textureLoad_216c37(tint_module_vars);
}
kernel void compute_main(texture1d<uint, access::sample> arg_0 [[texture(0)]], device uint4* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = textureLoad_216c37(tint_module_vars);
}
VertexOutput vertex_main_inner(tint_module_vars_struct tint_module_vars) {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = textureLoad_216c37(tint_module_vars);
  return out;
}
vertex vertex_main_outputs vertex_main(texture1d<uint, access::sample> arg_0 [[texture(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0};
  VertexOutput const v = vertex_main_inner(tint_module_vars);
  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
}
