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

uint3 textureDimensions_ef2e58(tint_module_vars_struct tint_module_vars) {
  uint const v = tint_module_vars.arg_0.get_width(0u);
  uint const v_1 = tint_module_vars.arg_0.get_height(0u);
  uint3 res = uint3(v, v_1, tint_module_vars.arg_0.get_depth(0u));
  return res;
}
fragment void fragment_main(texture3d<int, access::write> arg_0 [[texture(0)]], device uint3* 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) = textureDimensions_ef2e58(tint_module_vars);
}
kernel void compute_main(texture3d<int, access::write> arg_0 [[texture(0)]], device uint3* 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) = textureDimensions_ef2e58(tint_module_vars);
}
VertexOutput vertex_main_inner(tint_module_vars_struct tint_module_vars) {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = textureDimensions_ef2e58(tint_module_vars);
  return out;
}
vertex vertex_main_outputs vertex_main(texture3d<int, access::write> arg_0 [[texture(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0};
  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
}
