#include <metal_stdlib>

using namespace metal;
float4 tint_textureSampleBaseClampToEdge(texture2d<float, access::sample> t, sampler s, float2 coord) {
  float2 const dims = float2(uint2(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(1.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;
}

