//
// fragment_main
//
#include <metal_stdlib>

using namespace metal;
int2 tint_clamp(int2 e, int2 low, int2 high) {
  return min(max(e, low), high);
}

float4 textureLoad_4e2c5c(texture2d_array<float, access::read_write> tint_symbol) {
  float4 res = tint_symbol.read(uint2(tint_clamp(int2(1), int2(0), int2((uint2(tint_symbol.get_width(), tint_symbol.get_height()) - uint2(1u))))), min(1u, (tint_symbol.get_array_size() - 1u)));
  return res;
}

fragment void fragment_main(device float4* tint_symbol_1 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_2 [[texture(0)]]) {
  *(tint_symbol_1) = textureLoad_4e2c5c(tint_symbol_2);
  return;
}

//
// compute_main
//
#include <metal_stdlib>

using namespace metal;
int2 tint_clamp(int2 e, int2 low, int2 high) {
  return min(max(e, low), high);
}

float4 textureLoad_4e2c5c(texture2d_array<float, access::read_write> tint_symbol) {
  float4 res = tint_symbol.read(uint2(tint_clamp(int2(1), int2(0), int2((uint2(tint_symbol.get_width(), tint_symbol.get_height()) - uint2(1u))))), min(1u, (tint_symbol.get_array_size() - 1u)));
  return res;
}

kernel void compute_main(device float4* tint_symbol_1 [[buffer(0)]], texture2d_array<float, access::read_write> tint_symbol_2 [[texture(0)]]) {
  *(tint_symbol_1) = textureLoad_4e2c5c(tint_symbol_2);
  return;
}

