/*
 * Copyright 2018 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/**************************************************************************************************
 *** This file was autogenerated from GrYUVtoRGBEffect.fp; do not modify.
 **************************************************************************************************/
#include "GrYUVtoRGBEffect.h"

static const float kJPEGConversionMatrix[16] = {
        1.0f, 0.0f,   1.402f, -0.703749f, 1.0f, -0.344136f, -0.714136f, 0.531211f,
        1.0f, 1.772f, 0.0f,   -0.889475f, 0.0f, 0.0f,       0.0f,       1.0};

static const float kRec601ConversionMatrix[16] = {
        1.164f, 0.0f,   1.596f, -0.87075f, 1.164f, -0.391f, -0.813f, 0.52925f,
        1.164f, 2.018f, 0.0f,   -1.08175f, 0.0f,   0.0f,    0.0f,    1.0};

static const float kRec709ConversionMatrix[16] = {
        1.164f, 0.0f,   1.793f, -0.96925f, 1.164f, -0.213f, -0.533f, 0.30025f,
        1.164f, 2.112f, 0.0f,   -1.12875f, 0.0f,   0.0f,    0.0f,    1.0f};

std::unique_ptr<GrFragmentProcessor> GrYUVtoRGBEffect::Make(sk_sp<GrTextureProxy> yProxy,
                                                            sk_sp<GrTextureProxy>
                                                                    uProxy,
                                                            sk_sp<GrTextureProxy>
                                                                    vProxy,
                                                            const SkISize sizes[3],
                                                            SkYUVColorSpace colorSpace,
                                                            bool nv12) {
    SkScalar w[3], h[3];
    w[0] = SkIntToScalar(sizes[0].fWidth);
    h[0] = SkIntToScalar(sizes[0].fHeight);
    w[1] = SkIntToScalar(sizes[1].fWidth);
    h[1] = SkIntToScalar(sizes[1].fHeight);
    w[2] = SkIntToScalar(sizes[2].fWidth);
    h[2] = SkIntToScalar(sizes[2].fHeight);
    SkMatrix yTransform = SkMatrix::I();
    SkMatrix uTransform = SkMatrix::MakeScale(w[1] / w[0], h[1] / h[0]);
    SkMatrix vTransform = SkMatrix::MakeScale(w[2] / w[0], h[2] / h[0]);
    GrSamplerState::Filter uvFilterMode =
            ((sizes[1].fWidth != sizes[0].fWidth) || (sizes[1].fHeight != sizes[0].fHeight) ||
             (sizes[2].fWidth != sizes[0].fWidth) || (sizes[2].fHeight != sizes[0].fHeight))
                    ? GrSamplerState::Filter::kBilerp
                    : GrSamplerState::Filter::kNearest;
    SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor);
    switch (colorSpace) {
        case kJPEG_SkYUVColorSpace:
            mat.setColMajorf(kJPEGConversionMatrix);
            break;
        case kRec601_SkYUVColorSpace:
            mat.setColMajorf(kRec601ConversionMatrix);
            break;
        case kRec709_SkYUVColorSpace:
            mat.setColMajorf(kRec709ConversionMatrix);
            break;
    }
    return std::unique_ptr<GrFragmentProcessor>(new GrYUVtoRGBEffect(
            std::move(yProxy), yTransform, std::move(uProxy), uTransform, std::move(vProxy),
            vTransform, mat, nv12, GrSamplerState(GrSamplerState::WrapMode::kClamp, uvFilterMode)));
}
#include "glsl/GrGLSLFragmentProcessor.h"
#include "glsl/GrGLSLFragmentShaderBuilder.h"
#include "glsl/GrGLSLProgramBuilder.h"
#include "GrTexture.h"
#include "SkSLCPP.h"
#include "SkSLUtil.h"
class GrGLSLYUVtoRGBEffect : public GrGLSLFragmentProcessor {
public:
    GrGLSLYUVtoRGBEffect() {}
    void emitCode(EmitArgs& args) override {
        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
        const GrYUVtoRGBEffect& _outer = args.fFp.cast<GrYUVtoRGBEffect>();
        (void)_outer;
        auto ySamplerTransform = _outer.ySamplerTransform();
        (void)ySamplerTransform;
        auto uSamplerTransform = _outer.uSamplerTransform();
        (void)uSamplerTransform;
        auto vSamplerTransform = _outer.vSamplerTransform();
        (void)vSamplerTransform;
        auto colorSpaceMatrix = _outer.colorSpaceMatrix();
        (void)colorSpaceMatrix;
        auto nv12 = _outer.nv12();
        (void)nv12;
        fColorSpaceMatrixVar =
                args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4x4_GrSLType,
                                                 kDefault_GrSLPrecision, "colorSpaceMatrix");
        SkString sk_TransformedCoords2D_0 = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]);
        SkString sk_TransformedCoords2D_1 = fragBuilder->ensureCoords2D(args.fTransformedCoords[1]);
        SkString sk_TransformedCoords2D_2 = fragBuilder->ensureCoords2D(args.fTransformedCoords[2]);
        fragBuilder->codeAppendf(
                "@if (%s) {\n    %s = half4(texture(%s, %s).%s.x, texture(%s, %s).%s.xy, 1.0) * "
                "%s;\n} else {\n    %s = half4(texture(%s, %s).%s.x, texture(%s, %s).%s.x, "
                "texture(%s, %s).%s.x, 1.0) * %s;\n}\n",
                (_outer.nv12() ? "true" : "false"), args.fOutputColor,
                fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(),
                sk_TransformedCoords2D_0.c_str(),
                fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(),
                fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(),
                sk_TransformedCoords2D_1.c_str(),
                fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(),
                args.fUniformHandler->getUniformCStr(fColorSpaceMatrixVar), args.fOutputColor,
                fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(),
                sk_TransformedCoords2D_0.c_str(),
                fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(),
                fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(),
                sk_TransformedCoords2D_1.c_str(),
                fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(),
                fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[2]).c_str(),
                sk_TransformedCoords2D_2.c_str(),
                fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[2]).c_str(),
                args.fUniformHandler->getUniformCStr(fColorSpaceMatrixVar));
    }

private:
    void onSetData(const GrGLSLProgramDataManager& pdman,
                   const GrFragmentProcessor& _proc) override {
        const GrYUVtoRGBEffect& _outer = _proc.cast<GrYUVtoRGBEffect>();
        {
            float colorSpaceMatrixValue[16];
            _outer.colorSpaceMatrix().asColMajorf(colorSpaceMatrixValue);
            pdman.setMatrix4f(fColorSpaceMatrixVar, colorSpaceMatrixValue);
        }
    }
    UniformHandle fColorSpaceMatrixVar;
};
GrGLSLFragmentProcessor* GrYUVtoRGBEffect::onCreateGLSLInstance() const {
    return new GrGLSLYUVtoRGBEffect();
}
void GrYUVtoRGBEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
                                             GrProcessorKeyBuilder* b) const {
    b->add32((int32_t)fNv12);
}
bool GrYUVtoRGBEffect::onIsEqual(const GrFragmentProcessor& other) const {
    const GrYUVtoRGBEffect& that = other.cast<GrYUVtoRGBEffect>();
    (void)that;
    if (fYSampler != that.fYSampler) return false;
    if (fYSamplerTransform != that.fYSamplerTransform) return false;
    if (fUSampler != that.fUSampler) return false;
    if (fUSamplerTransform != that.fUSamplerTransform) return false;
    if (fVSampler != that.fVSampler) return false;
    if (fVSamplerTransform != that.fVSamplerTransform) return false;
    if (fColorSpaceMatrix != that.fColorSpaceMatrix) return false;
    if (fNv12 != that.fNv12) return false;
    return true;
}
GrYUVtoRGBEffect::GrYUVtoRGBEffect(const GrYUVtoRGBEffect& src)
        : INHERITED(kGrYUVtoRGBEffect_ClassID, src.optimizationFlags())
        , fYSampler(src.fYSampler)
        , fYSamplerTransform(src.fYSamplerTransform)
        , fUSampler(src.fUSampler)
        , fUSamplerTransform(src.fUSamplerTransform)
        , fVSampler(src.fVSampler)
        , fVSamplerTransform(src.fVSamplerTransform)
        , fColorSpaceMatrix(src.fColorSpaceMatrix)
        , fNv12(src.fNv12)
        , fYSamplerCoordTransform(src.fYSamplerCoordTransform)
        , fUSamplerCoordTransform(src.fUSamplerCoordTransform)
        , fVSamplerCoordTransform(src.fVSamplerCoordTransform) {
    this->addTextureSampler(&fYSampler);
    this->addTextureSampler(&fUSampler);
    this->addTextureSampler(&fVSampler);
    this->addCoordTransform(&fYSamplerCoordTransform);
    this->addCoordTransform(&fUSamplerCoordTransform);
    this->addCoordTransform(&fVSamplerCoordTransform);
}
std::unique_ptr<GrFragmentProcessor> GrYUVtoRGBEffect::clone() const {
    return std::unique_ptr<GrFragmentProcessor>(new GrYUVtoRGBEffect(*this));
}
