#include <metal_stdlib>

using namespace metal;
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()), 1), 0.0f, 0.0f, 0.0f);
  res = x_17[0];
  return;
}

void tint_symbol_2(float4 tint_symbol, thread float4* const tint_symbol_6) {
  *(tint_symbol_6) = tint_symbol;
  return;
}

void vertex_main_1(depth2d_ms<float, access::read> tint_symbol_7, thread float4* const tint_symbol_8) {
  textureLoad_6273b1(tint_symbol_7);
  tint_symbol_2(float4(), tint_symbol_8);
  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(depth2d_ms<float, access::read> tint_symbol_9, thread float4* const tint_symbol_10) {
  vertex_main_1(tint_symbol_9, tint_symbol_10);
  vertex_main_out const tint_symbol_4 = {.tint_symbol_1_1=*(tint_symbol_10)};
  return tint_symbol_4;
}

vertex tint_symbol_3 vertex_main(depth2d_ms<float, access::read> tint_symbol_11 [[texture(0)]]) {
  thread float4 tint_symbol_12 = float4();
  vertex_main_out const inner_result = vertex_main_inner(tint_symbol_11, &(tint_symbol_12));
  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_13) {
  textureLoad_6273b1(tint_symbol_13);
  return;
}

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

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

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

