//
// fragment_main
//
#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  device float4* prevent_dce;
  texture2d<float, access::sample> arg_0;
  sampler arg_1;
};

float4 textureSampleBaseClampToEdge_9ca02c(tint_module_vars_struct tint_module_vars) {
  float2 arg_2 = float2(1.0f);
  float2 const v = arg_2;
  float2 const v_1 = (float2(0.5f) / float2(uint2(tint_module_vars.arg_0.get_width(0u), tint_module_vars.arg_0.get_height(0u))));
  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, clamp(v, v_1, (float2(1.0f) - v_1)), level(0.0f));
  return res;
}

fragment void fragment_main(device float4* prevent_dce [[buffer(0)]], 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{.prevent_dce=prevent_dce, .arg_0=arg_0, .arg_1=arg_1};
  (*tint_module_vars.prevent_dce) = textureSampleBaseClampToEdge_9ca02c(tint_module_vars);
}
//
// compute_main
//
#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  device float4* prevent_dce;
  texture2d<float, access::sample> arg_0;
  sampler arg_1;
};

float4 textureSampleBaseClampToEdge_9ca02c(tint_module_vars_struct tint_module_vars) {
  float2 arg_2 = float2(1.0f);
  float2 const v = arg_2;
  float2 const v_1 = (float2(0.5f) / float2(uint2(tint_module_vars.arg_0.get_width(0u), tint_module_vars.arg_0.get_height(0u))));
  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, clamp(v, v_1, (float2(1.0f) - v_1)), level(0.0f));
  return res;
}

[[max_total_threads_per_threadgroup(1)]]
kernel void compute_main(device float4* prevent_dce [[buffer(0)]], 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{.prevent_dce=prevent_dce, .arg_0=arg_0, .arg_1=arg_1};
  (*tint_module_vars.prevent_dce) = textureSampleBaseClampToEdge_9ca02c(tint_module_vars);
}
//
// vertex_main
//
#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  texture2d<float, access::sample> arg_0;
  sampler arg_1;
};

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) {
  float2 arg_2 = float2(1.0f);
  float2 const v = arg_2;
  float2 const v_1 = (float2(0.5f) / float2(uint2(tint_module_vars.arg_0.get_width(0u), tint_module_vars.arg_0.get_height(0u))));
  float4 res = tint_module_vars.arg_0.sample(tint_module_vars.arg_1, clamp(v, v_1, (float2(1.0f) - v_1)), level(0.0f));
  return res;
}

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_2 = vertex_main_inner(tint_module_vars);
  vertex_main_outputs tint_wrapper_result = {};
  tint_wrapper_result.VertexOutput_pos = v_2.pos;
  tint_wrapper_result.VertexOutput_prevent_dce = v_2.prevent_dce;
  return tint_wrapper_result;
}
