//
// fragment_main
//
#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  device uint4* prevent_dce;
  texture3d<uint, access::read_write> arg_0;
};

uint4 textureLoad_622278(tint_module_vars_struct tint_module_vars) {
  uint3 const v = (uint3(tint_module_vars.arg_0.get_width(0u), tint_module_vars.arg_0.get_height(0u), tint_module_vars.arg_0.get_depth(0u)) - uint3(1u));
  uint4 res = tint_module_vars.arg_0.read(min(uint3(int3(1)), v));
  return res;
}

fragment void fragment_main(device uint4* prevent_dce [[buffer(0)]], texture3d<uint, access::read_write> 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_622278(tint_module_vars);
}
//
// compute_main
//
#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  device uint4* prevent_dce;
  texture3d<uint, access::read_write> arg_0;
};

uint4 textureLoad_622278(tint_module_vars_struct tint_module_vars) {
  uint3 const v = (uint3(tint_module_vars.arg_0.get_width(0u), tint_module_vars.arg_0.get_height(0u), tint_module_vars.arg_0.get_depth(0u)) - uint3(1u));
  uint4 res = tint_module_vars.arg_0.read(min(uint3(int3(1)), v));
  return res;
}

kernel void compute_main(device uint4* prevent_dce [[buffer(0)]], texture3d<uint, access::read_write> 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_622278(tint_module_vars);
}
