// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

precision mediump float;

#include <impeller/color.glsl>
#include <impeller/texture.glsl>
#include <impeller/types.glsl>

uniform f16sampler2D y_texture;
uniform f16sampler2D uv_texture;

// These values must correspond to the order of the items in the
// 'YUVColorSpace' enum class.
const float16_t kBT601LimitedRange = 0.0hf;
const float16_t kBT601FullRange = 1.0hf;

uniform FragInfo {
  mat4 matrix;
  float16_t yuv_color_space;
}
frag_info;

in highp vec2 v_texture_coords;

out f16vec4 frag_color;

void main() {
  f16vec3 yuv;
  f16vec3 yuv_offset = f16vec3(0.0hf, 0.5hf, 0.5hf);
  if (frag_info.yuv_color_space == kBT601LimitedRange) {
    yuv_offset.x = 16.0hf / 255.0hf;
  }

  yuv.x = texture(y_texture, v_texture_coords).r;
  yuv.yz = texture(uv_texture, v_texture_coords).rg;
  frag_color = f16mat4(frag_info.matrix) * f16vec4(yuv - yuv_offset, 1.0hf);
}
