#include <metal_stdlib>

using namespace metal;
void textureDimensions_f60bdb(depth2d_ms<float, access::read> tint_symbol_5) {
  int2 res = int2(0);
  int2 const x_16 = int2(uint2(tint_symbol_5.get_width(), tint_symbol_5.get_height()));
  res = x_16;
  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) {
  textureDimensions_f60bdb(tint_symbol_7);
  tint_symbol_2(float4(0.0f), 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(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) {
  textureDimensions_f60bdb(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) {
  textureDimensions_f60bdb(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;
}

