#include <metal_stdlib>

using namespace metal;
struct tint_private_vars_struct {
  float4 tint_symbol_1;
};

void textureLoad_6273b1(depth2d_ms<float, access::read> tint_symbol_5) {
  float res = 0.0f;
  res = float4(tint_symbol_5.read(uint2(int2(0)), 1), 0.0f, 0.0f, 0.0f)[0];
  return;
}

void tint_symbol_2(float4 tint_symbol, thread tint_private_vars_struct* const tint_private_vars) {
  (*(tint_private_vars)).tint_symbol_1 = tint_symbol;
  return;
}

void vertex_main_1(thread tint_private_vars_struct* const tint_private_vars, depth2d_ms<float, access::read> tint_symbol_6) {
  textureLoad_6273b1(tint_symbol_6);
  tint_symbol_2(float4(0.0f), tint_private_vars);
  return;
}

struct vertex_main_out {
  float4 tint_symbol_1_1;
};

struct tint_symbol_3 {
  float4 tint_symbol_1_1 [[position]];
};

vertex_main_out vertex_main_inner(thread tint_private_vars_struct* const tint_private_vars, depth2d_ms<float, access::read> tint_symbol_7) {
  vertex_main_1(tint_private_vars, tint_symbol_7);
  vertex_main_out const tint_symbol_4 = {.tint_symbol_1_1=(*(tint_private_vars)).tint_symbol_1};
  return tint_symbol_4;
}

vertex tint_symbol_3 vertex_main(depth2d_ms<float, access::read> tint_symbol_8 [[texture(0)]]) {
  thread tint_private_vars_struct tint_private_vars = {};
  tint_private_vars.tint_symbol_1 = float4(0.0f);
  vertex_main_out const inner_result = vertex_main_inner(&(tint_private_vars), tint_symbol_8);
  tint_symbol_3 wrapper_result = {};
  wrapper_result.tint_symbol_1_1 = inner_result.tint_symbol_1_1;
  return wrapper_result;
}

void fragment_main_1(depth2d_ms<float, access::read> tint_symbol_9) {
  textureLoad_6273b1(tint_symbol_9);
  return;
}

fragment void fragment_main(depth2d_ms<float, access::read> tint_symbol_10 [[texture(0)]]) {
  fragment_main_1(tint_symbol_10);
  return;
}

void compute_main_1(depth2d_ms<float, access::read> tint_symbol_11) {
  textureLoad_6273b1(tint_symbol_11);
  return;
}

kernel void compute_main(depth2d_ms<float, access::read> tint_symbol_12 [[texture(0)]]) {
  compute_main_1(tint_symbol_12);
  return;
}

