#include <metal_stdlib>

using namespace metal;
struct ExternalTextureParams {
  /* 0x0000 */ uint numPlanes;
  /* 0x0004 */ float vr;
  /* 0x0008 */ float ug;
  /* 0x000c */ float vg;
  /* 0x0010 */ float ub;
};

float4 textureLoadExternal(texture2d<float, access::sample> plane0, texture2d<float, access::sample> plane1, int2 coord, ExternalTextureParams params) {
  if ((params.numPlanes == 1u)) {
    return plane0.read(uint2(coord), 0);
  }
  float const y = (plane0.read(uint2(coord), 0)[0] - 0.0625f);
  float2 const uv = (float4(plane1.read(uint2(coord), 0)).rg - 0.5f);
  float const u = uv[0];
  float const v = uv[1];
  float const r = ((1.164000034f * y) + (params.vr * v));
  float const g = (((1.164000034f * y) - (params.ug * u)) - (params.vg * v));
  float const b = ((1.164000034f * y) + (params.ub * u));
  return float4(r, g, b, 1.0f);
}

float4 textureLoad2d(texture2d<float, access::sample> tint_symbol, texture2d<float, access::sample> ext_tex_plane_1_1, ExternalTextureParams ext_tex_params_1, int2 coords) {
  return textureLoadExternal(tint_symbol, ext_tex_plane_1_1, coords, ext_tex_params_1);
}

void doTextureLoad(texture2d<float, access::sample> tint_symbol_2, texture2d<float, access::sample> tint_symbol_3, const constant ExternalTextureParams* const tint_symbol_4) {
  float4 res = textureLoad2d(tint_symbol_2, tint_symbol_3, *(tint_symbol_4), int2());
}

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

float4 vertex_main_inner(texture2d<float, access::sample> tint_symbol_5, texture2d<float, access::sample> tint_symbol_6, const constant ExternalTextureParams* const tint_symbol_7) {
  doTextureLoad(tint_symbol_5, tint_symbol_6, tint_symbol_7);
  return float4();
}

vertex tint_symbol_1 vertex_main(texture2d<float, access::sample> tint_symbol_8 [[texture(0)]], texture2d<float, access::sample> tint_symbol_9 [[texture(1)]], const constant ExternalTextureParams* tint_symbol_10 [[buffer(2)]]) {
  float4 const inner_result = vertex_main_inner(tint_symbol_8, tint_symbol_9, tint_symbol_10);
  tint_symbol_1 wrapper_result = {};
  wrapper_result.value = inner_result;
  return wrapper_result;
}

fragment void fragment_main(texture2d<float, access::sample> tint_symbol_11 [[texture(0)]], texture2d<float, access::sample> tint_symbol_12 [[texture(1)]], const constant ExternalTextureParams* tint_symbol_13 [[buffer(2)]]) {
  doTextureLoad(tint_symbol_11, tint_symbol_12, tint_symbol_13);
  return;
}

kernel void compute_main(texture2d<float, access::sample> tint_symbol_14 [[texture(0)]], texture2d<float, access::sample> tint_symbol_15 [[texture(1)]], const constant ExternalTextureParams* tint_symbol_16 [[buffer(2)]]) {
  doTextureLoad(tint_symbol_14, tint_symbol_15, tint_symbol_16);
  return;
}

