#include <metal_stdlib>

using namespace metal;
struct FragmentOutputs {
  int loc0;
  float frag_depth;
  uint loc1;
  float loc2;
  uint sample_mask;
  float4 loc3;
  half loc4;
  half3 loc5;
};

struct tint_symbol_1 {
  int loc0 [[color(0)]];
  uint loc1 [[color(1)]];
  float loc2 [[color(2)]];
  float4 loc3 [[color(3)]];
  half loc4 [[color(4)]];
  half3 loc5 [[color(5)]];
  float frag_depth [[depth(any)]];
  uint sample_mask [[sample_mask]];
};

FragmentOutputs tint_symbol_inner() {
  FragmentOutputs const tint_symbol_2 = FragmentOutputs{.loc0=1, .frag_depth=2.0f, .loc1=1u, .loc2=1.0f, .sample_mask=2u, .loc3=float4(1.0f, 2.0f, 3.0f, 4.0f), .loc4=2.25h, .loc5=half3(3.0h, 5.0h, 8.0h)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol() {
  FragmentOutputs const inner_result = tint_symbol_inner();
  tint_symbol_1 wrapper_result = {};
  wrapper_result.loc0 = inner_result.loc0;
  wrapper_result.frag_depth = inner_result.frag_depth;
  wrapper_result.loc1 = inner_result.loc1;
  wrapper_result.loc2 = inner_result.loc2;
  wrapper_result.sample_mask = inner_result.sample_mask;
  wrapper_result.loc3 = inner_result.loc3;
  wrapper_result.loc4 = inner_result.loc4;
  wrapper_result.loc5 = inner_result.loc5;
  return wrapper_result;
}

