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

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

float4 textureLoad_012e11(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));
  float4 res = tint_module_vars.arg_0.read(min(uint3(int3(1)), v));
  return res;
}

fragment void fragment_main(device float4* prevent_dce [[buffer(0)]], texture3d<float, 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_012e11(tint_module_vars);
}
//
// compute_main
//
#include <metal_stdlib>
using namespace metal;

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

float4 textureLoad_012e11(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));
  float4 res = tint_module_vars.arg_0.read(min(uint3(int3(1)), v));
  return res;
}

kernel void compute_main(device float4* prevent_dce [[buffer(0)]], texture3d<float, 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_012e11(tint_module_vars);
}
