#include <metal_stdlib>
using namespace metal;
struct tint_module_vars_struct {
  texture3d<int, access::sample> arg_0;
  device uint3* prevent_dce;
};
struct vertex_main_outputs {
  float4 tint_symbol [[position]];
};

void textureDimensions_756031(tint_module_vars_struct tint_module_vars) {
  uint const v = uint(1);
  uint const v_1 = tint_module_vars.arg_0.get_width(v);
  uint const v_2 = tint_module_vars.arg_0.get_height(v);
  uint3 res = uint3(v_1, v_2, tint_module_vars.arg_0.get_depth(v));
  (*tint_module_vars.prevent_dce) = res;
}
float4 vertex_main_inner(tint_module_vars_struct tint_module_vars) {
  textureDimensions_756031(tint_module_vars);
  return float4(0.0f);
}
fragment void fragment_main(texture3d<int, access::sample> 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};
  textureDimensions_756031(tint_module_vars);
}
kernel void compute_main(texture3d<int, access::sample> 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};
  textureDimensions_756031(tint_module_vars);
}
vertex vertex_main_outputs vertex_main(texture3d<int, access::sample> 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};
  return vertex_main_outputs{.tint_symbol=vertex_main_inner(tint_module_vars)};
}
