#include <metal_stdlib>
using namespace metal;
struct tint_module_vars_struct {
  depth2d_ms<float, access::read> arg_0;
  device float* prevent_dce;
};
struct vertex_main_outputs {
  float4 tint_symbol [[position]];
};

void textureLoad_6925bc(tint_module_vars_struct tint_module_vars) {
  int2 arg_1 = int2(1);
  uint arg_2 = 1u;
  uint const v = arg_2;
  float res = tint_module_vars.arg_0.read(uint2(arg_1), v);
  (*tint_module_vars.prevent_dce) = res;
}
float4 vertex_main_inner(tint_module_vars_struct tint_module_vars) {
  textureLoad_6925bc(tint_module_vars);
  return float4(0.0f);
}
fragment void fragment_main(depth2d_ms<float, access::read> arg_0 [[texture(0)]], device float* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .prevent_dce=prevent_dce};
  textureLoad_6925bc(tint_module_vars);
}
kernel void compute_main(depth2d_ms<float, access::read> arg_0 [[texture(0)]], device float* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .prevent_dce=prevent_dce};
  textureLoad_6925bc(tint_module_vars);
}
vertex vertex_main_outputs vertex_main(depth2d_ms<float, access::read> arg_0 [[texture(0)]], device float* 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)};
}
