#include <metal_stdlib>

using namespace metal;
struct vertex_main_out {
  float4 tint_symbol_1_1;
};
struct tint_symbol_3 {
  float4 tint_symbol_1_1 [[position]];
};

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, 0)), 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(0.0f, 0.0f, 0.0f, 0.0f), tint_symbol_8);
  return;
}

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(0.0f, 0.0f, 0.0f, 0.0f);
  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;
}

