#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  device int4* prevent_dce;
  texture2d<int, access::sample> arg_0;
};

struct VertexOutput {
  float4 pos;
  int4 prevent_dce;
};

struct vertex_main_outputs {
  float4 VertexOutput_pos [[position]];
  int4 VertexOutput_prevent_dce [[user(locn0)]] [[flat]];
};

int4 textureLoad_c2a480(tint_module_vars_struct tint_module_vars) {
  int2 arg_1 = int2(1);
  int arg_2 = 1;
  int const v = arg_2;
  int4 res = tint_module_vars.arg_0.read(uint2(arg_1), v);
  return res;
}

fragment void fragment_main(device int4* prevent_dce [[buffer(0)]], texture2d<int, access::sample> arg_0 [[texture(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce, .arg_0=arg_0};
  (*tint_module_vars.prevent_dce) = textureLoad_c2a480(tint_module_vars);
}

kernel void compute_main(device int4* prevent_dce [[buffer(0)]], texture2d<int, access::sample> arg_0 [[texture(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce, .arg_0=arg_0};
  (*tint_module_vars.prevent_dce) = textureLoad_c2a480(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_c2a480(tint_module_vars);
  return out;
}

vertex vertex_main_outputs vertex_main(texture2d<int, 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_1 = vertex_main_inner(tint_module_vars);
  vertex_main_outputs tint_wrapper_result = {};
  tint_wrapper_result.VertexOutput_pos = v_1.pos;
  tint_wrapper_result.VertexOutput_prevent_dce = v_1.prevent_dce;
  return tint_wrapper_result;
}
