#include <metal_stdlib>

using namespace metal;
float4 tint_textureSampleBaseClampToEdge(texture2d<float, access::sample> t, sampler s, float2 coord) {
  float2 const dims = float2(int2(t.get_width(0), t.get_height(0)));
  float2 const half_texel = (float2(0.5f) / dims);
  float2 const clamped = clamp(coord, half_texel, (1.0f - half_texel));
  return t.sample(s, clamped, level(0.0f));
}

void textureSampleBaseClampToEdge_9ca02c(texture2d<float, access::sample> tint_symbol_1, sampler tint_symbol_2) {
  float2 arg_2 = float2(0.0f);
  float4 res = tint_textureSampleBaseClampToEdge(tint_symbol_1, tint_symbol_2, arg_2);
}

struct tint_symbol {
  float4 value [[position]];
};

float4 vertex_main_inner(texture2d<float, access::sample> tint_symbol_3, sampler tint_symbol_4) {
  textureSampleBaseClampToEdge_9ca02c(tint_symbol_3, tint_symbol_4);
  return float4(0.0f);
}

vertex tint_symbol vertex_main(texture2d<float, access::sample> tint_symbol_5 [[texture(0)]], sampler tint_symbol_6 [[sampler(0)]]) {
  float4 const inner_result = vertex_main_inner(tint_symbol_5, tint_symbol_6);
  tint_symbol wrapper_result = {};
  wrapper_result.value = inner_result;
  return wrapper_result;
}

fragment void fragment_main(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]], sampler tint_symbol_8 [[sampler(0)]]) {
  textureSampleBaseClampToEdge_9ca02c(tint_symbol_7, tint_symbol_8);
  return;
}

kernel void compute_main(texture2d<float, access::sample> tint_symbol_9 [[texture(0)]], sampler tint_symbol_10 [[sampler(0)]]) {
  textureSampleBaseClampToEdge_9ca02c(tint_symbol_9, tint_symbol_10);
  return;
}

