#include <metal_stdlib>
using namespace metal;
struct tint_module_vars_struct {
  texturecube_array<float, access::sample> arg_1;
  sampler arg_2;
  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 textureGather_751f8a(tint_module_vars_struct tint_module_vars) {
  float3 arg_3 = float3(1.0f);
  int arg_4 = 1;
  float4 res = tint_module_vars.arg_1.gather(tint_module_vars.arg_2, arg_3, arg_4, component::y);
  return res;
}
fragment void fragment_main(texturecube_array<float, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]], device float4* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2, .prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = textureGather_751f8a(tint_module_vars);
}
kernel void compute_main(texturecube_array<float, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]], device float4* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2, .prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = textureGather_751f8a(tint_module_vars);
}
VertexOutput vertex_main_inner(tint_module_vars_struct tint_module_vars) {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = textureGather_751f8a(tint_module_vars);
  return out;
}
vertex vertex_main_outputs vertex_main(texturecube_array<float, access::sample> arg_1 [[texture(0)]], sampler arg_2 [[sampler(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_1=arg_1, .arg_2=arg_2};
  VertexOutput const v = vertex_main_inner(tint_module_vars);
  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
}
