#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_6b77d4(tint_module_vars_struct tint_module_vars) {
  uint4 res = tint_module_vars.arg_0.read(uint(1));
  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_6b77d4(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_6b77d4(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_6b77d4(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};
}
