struct tint_GammaTransferParams {
  float G;
  float A;
  float B;
  float C;
  float D;
  float E;
  float F;
  uint padding;
};

struct tint_ExternalTextureParams {
  uint numPlanes;
  uint doYuvToRgbConversionOnly;
  float3x4 yuvToRgbConversionMatrix;
  tint_GammaTransferParams gammaDecodeParams;
  tint_GammaTransferParams gammaEncodeParams;
  float3x3 gamutConversionMatrix;
  float3x2 sampleTransform;
  float3x2 loadTransform;
  float2 samplePlane0RectMin;
  float2 samplePlane0RectMax;
  float2 samplePlane1RectMin;
  float2 samplePlane1RectMax;
  uint2 visibleSize;
  float2 plane1CoordFactor;
};


Texture2D<float4> t_plane0 : register(t0);
Texture2D<float4> t_plane1 : register(t2);
cbuffer cbuffer_t_params : register(b3) {
  uint4 t_params[17];
};
RWTexture2D<float4> outImage : register(u1);
uint2 tint_v2f32_to_v2u32(float2 value) {
  return (((value <= (4294967040.0f).xx)) ? ((((value >= (0.0f).xx)) ? (uint2(value)) : ((0u).xx))) : ((4294967295u).xx));
}

float3 tint_GammaCorrection(float3 v, tint_GammaTransferParams params) {
  float3 v_1 = float3((params.G).xxx);
  float3 v_2 = float3((params.D).xxx);
  float3 v_3 = abs(v);
  float3 v_4 = float3(sign(v));
  return (((v_3 < v_2)) ? ((v_4 * ((params.C * v_3) + params.F))) : ((v_4 * (pow(((params.A * v_3) + params.B), v_1) + params.E))));
}

float4 tint_TextureLoadExternal(Texture2D<float4> plane_0, Texture2D<float4> plane_1, tint_ExternalTextureParams params, uint2 coords) {
  float2 v_5 = round(mul(float3(float2(min(coords, params.visibleSize)), 1.0f), params.loadTransform));
  uint2 v_6 = tint_v2f32_to_v2u32(v_5);
  float3 v_7 = (0.0f).xxx;
  float v_8 = 0.0f;
  if ((params.numPlanes == 1u)) {
    uint2 v_9 = (0u).xx;
    plane_0.GetDimensions(v_9[0u], v_9[1u]);
    uint2 v_10 = min(v_6, (v_9 - (1u).xx));
    uint3 v_11 = (0u).xxx;
    plane_0.GetDimensions(0u, v_11[0u], v_11[1u], v_11[2u]);
    uint v_12 = min(0u, (v_11.z - 1u));
    int2 v_13 = int2(v_10);
    float4 v_14 = float4(plane_0.Load(int3(v_13, int(v_12))));
    v_7 = v_14.xyz;
    v_8 = v_14[3u];
  } else {
    uint2 v_15 = (0u).xx;
    plane_0.GetDimensions(v_15[0u], v_15[1u]);
    uint2 v_16 = min(v_6, (v_15 - (1u).xx));
    uint3 v_17 = (0u).xxx;
    plane_0.GetDimensions(0u, v_17[0u], v_17[1u], v_17[2u]);
    uint v_18 = min(0u, (v_17.z - 1u));
    int2 v_19 = int2(v_16);
    float v_20 = float4(plane_0.Load(int3(v_19, int(v_18))))[0u];
    uint2 v_21 = tint_v2f32_to_v2u32((v_5 * params.plane1CoordFactor));
    uint2 v_22 = (0u).xx;
    plane_1.GetDimensions(v_22[0u], v_22[1u]);
    uint2 v_23 = min(v_21, (v_22 - (1u).xx));
    uint3 v_24 = (0u).xxx;
    plane_1.GetDimensions(0u, v_24[0u], v_24[1u], v_24[2u]);
    uint v_25 = min(0u, (v_24.z - 1u));
    int2 v_26 = int2(v_23);
    v_7 = mul(params.yuvToRgbConversionMatrix, float4(v_20, float4(plane_1.Load(int3(v_26, int(v_25)))).xy, 1.0f));
    v_8 = 1.0f;
  }
  float3 v_27 = v_7;
  float3 v_28 = (0.0f).xxx;
  if ((params.doYuvToRgbConversionOnly == 0u)) {
    tint_GammaTransferParams v_29 = params.gammaDecodeParams;
    tint_GammaTransferParams v_30 = params.gammaEncodeParams;
    v_28 = tint_GammaCorrection(mul(tint_GammaCorrection(v_27, v_29), params.gamutConversionMatrix), v_30);
  } else {
    v_28 = v_27;
  }
  return float4(v_28, v_8);
}

float3x2 v_31(uint start_byte_offset) {
  uint4 v_32 = t_params[(start_byte_offset / 16u)];
  float2 v_33 = asfloat((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_32.zw) : (v_32.xy)));
  uint4 v_34 = t_params[((8u + start_byte_offset) / 16u)];
  float2 v_35 = asfloat(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_34.zw) : (v_34.xy)));
  uint4 v_36 = t_params[((16u + start_byte_offset) / 16u)];
  return float3x2(v_33, v_35, asfloat(((((((16u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_36.zw) : (v_36.xy))));
}

float3x3 v_37(uint start_byte_offset) {
  float3 v_38 = asfloat(t_params[(start_byte_offset / 16u)].xyz);
  float3 v_39 = asfloat(t_params[((16u + start_byte_offset) / 16u)].xyz);
  return float3x3(v_38, v_39, asfloat(t_params[((32u + start_byte_offset) / 16u)].xyz));
}

tint_GammaTransferParams v_40(uint start_byte_offset) {
  float v_41 = asfloat(t_params[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)]);
  float v_42 = asfloat(t_params[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)]);
  float v_43 = asfloat(t_params[((8u + start_byte_offset) / 16u)][(((8u + start_byte_offset) % 16u) / 4u)]);
  float v_44 = asfloat(t_params[((12u + start_byte_offset) / 16u)][(((12u + start_byte_offset) % 16u) / 4u)]);
  float v_45 = asfloat(t_params[((16u + start_byte_offset) / 16u)][(((16u + start_byte_offset) % 16u) / 4u)]);
  float v_46 = asfloat(t_params[((20u + start_byte_offset) / 16u)][(((20u + start_byte_offset) % 16u) / 4u)]);
  float v_47 = asfloat(t_params[((24u + start_byte_offset) / 16u)][(((24u + start_byte_offset) % 16u) / 4u)]);
  tint_GammaTransferParams v_48 = {v_41, v_42, v_43, v_44, v_45, v_46, v_47, t_params[((28u + start_byte_offset) / 16u)][(((28u + start_byte_offset) % 16u) / 4u)]};
  return v_48;
}

float3x4 v_49(uint start_byte_offset) {
  float4 v_50 = asfloat(t_params[(start_byte_offset / 16u)]);
  float4 v_51 = asfloat(t_params[((16u + start_byte_offset) / 16u)]);
  return float3x4(v_50, v_51, asfloat(t_params[((32u + start_byte_offset) / 16u)]));
}

tint_ExternalTextureParams v_52(uint start_byte_offset) {
  uint v_53 = t_params[(start_byte_offset / 16u)][((start_byte_offset % 16u) / 4u)];
  uint v_54 = t_params[((4u + start_byte_offset) / 16u)][(((4u + start_byte_offset) % 16u) / 4u)];
  float3x4 v_55 = v_49((16u + start_byte_offset));
  tint_GammaTransferParams v_56 = v_40((64u + start_byte_offset));
  tint_GammaTransferParams v_57 = v_40((96u + start_byte_offset));
  float3x3 v_58 = v_37((128u + start_byte_offset));
  float3x2 v_59 = v_31((176u + start_byte_offset));
  float3x2 v_60 = v_31((200u + start_byte_offset));
  uint4 v_61 = t_params[((224u + start_byte_offset) / 16u)];
  float2 v_62 = asfloat(((((((224u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_61.zw) : (v_61.xy)));
  uint4 v_63 = t_params[((232u + start_byte_offset) / 16u)];
  float2 v_64 = asfloat(((((((232u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_63.zw) : (v_63.xy)));
  uint4 v_65 = t_params[((240u + start_byte_offset) / 16u)];
  float2 v_66 = asfloat(((((((240u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_65.zw) : (v_65.xy)));
  uint4 v_67 = t_params[((248u + start_byte_offset) / 16u)];
  float2 v_68 = asfloat(((((((248u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_67.zw) : (v_67.xy)));
  uint4 v_69 = t_params[((256u + start_byte_offset) / 16u)];
  uint2 v_70 = ((((((256u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_69.zw) : (v_69.xy));
  uint4 v_71 = t_params[((264u + start_byte_offset) / 16u)];
  tint_ExternalTextureParams v_72 = {v_53, v_54, v_55, v_56, v_57, v_58, v_59, v_60, v_62, v_64, v_66, v_68, v_70, asfloat(((((((264u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_71.zw) : (v_71.xy)))};
  return v_72;
}

[numthreads(1, 1, 1)]
void main() {
  tint_ExternalTextureParams v_73 = v_52(0u);
  float4 red = tint_TextureLoadExternal(t_plane0, t_plane1, v_73, uint2((int(10)).xx));
  outImage[(int(0)).xx] = red;
  tint_ExternalTextureParams v_74 = v_52(0u);
  float4 green = tint_TextureLoadExternal(t_plane0, t_plane1, v_74, uint2(int2(int(70), int(118))));
  outImage[int2(int(1), int(0))] = green;
}

