#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;
  float4 const x_17 = float4(tint_symbol_5.read(uint2(int2(0)), 1), 0.0f, 0.0f, 0.0f);
  res = x_17[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;
}

