#include <metal_stdlib>
using namespace metal;
struct tint_module_vars_struct {
  texture2d<float, access::sample> arg_0;
  sampler arg_1;
  device float4* prevent_dce;
};
struct VertexOutput {
  float4 pos;
  float4 prevent_dce;
};
struct vertex_main_outputs {
  float4 VertexOutput_pos [[position]];
  float4 VertexOutput_prevent_dce [[user(locn0)]] [[flat]];
};

float4 textureSampleBaseClampToEdge_9ca02c(tint_module_vars_struct tint_module_vars) {
  uint const v = tint_module_vars.arg_0.get_width(0u);
  float2 const v_1 = (float2(0.5f) / float2(uint2(v, tint_module_vars.arg_0.get_height(0u))));
  float2 const v_2 = clamp(float2(1.0f), v_1, (float2(1.0f) - v_1));
  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, v_2, level(0.0f));
  return res;
}
fragment void fragment_main(texture2d<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]], device float4* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1, .prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = textureSampleBaseClampToEdge_9ca02c(tint_module_vars);
}
kernel void compute_main(texture2d<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]], device float4* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1, .prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = textureSampleBaseClampToEdge_9ca02c(tint_module_vars);
}
VertexOutput vertex_main_inner(tint_module_vars_struct tint_module_vars) {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = textureSampleBaseClampToEdge_9ca02c(tint_module_vars);
  return out;
}
vertex vertex_main_outputs vertex_main(texture2d<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
  VertexOutput const v_3 = vertex_main_inner(tint_module_vars);
  return vertex_main_outputs{.VertexOutput_pos=v_3.pos, .VertexOutput_prevent_dce=v_3.prevent_dce};
}
