#include <metal_stdlib>

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

void textureNumSamples_a3c8a0(depth2d_ms<float, access::read> tint_symbol_5) {
  int res = 0;
  int const x_16 = int(tint_symbol_5.get_num_samples());
  res = x_16;
  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) {
  textureNumSamples_a3c8a0(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) {
  textureNumSamples_a3c8a0(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) {
  textureNumSamples_a3c8a0(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;
}

