

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

#include "src/core/SkUtils.h"
#include "src/gpu/GrTexture.h"
#include "src/gpu/glsl/GrGLSLFragmentProcessor.h"
#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
#include "src/gpu/glsl/GrGLSLProgramBuilder.h"
#include "src/sksl/SkSLCPP.h"
#include "src/sksl/SkSLUtil.h"
class GrGLSLUniformArrays : public GrGLSLFragmentProcessor {
public:
    GrGLSLUniformArrays() {}
    void emitCode(EmitArgs& args) override {
        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
        const GrUniformArrays& _outer = args.fFp.cast<GrUniformArrays>();
        (void) _outer;
        scalarArrayVar = args.fUniformHandler->addUniformArray(&_outer, kFragment_GrShaderFlag, kHalf_GrSLType, "scalarArray", 4);
        pointArrayVar = args.fUniformHandler->addUniformArray(&_outer, kFragment_GrShaderFlag, kHalf2_GrSLType, "pointArray", 2);
        fragBuilder->codeAppendf(
R"SkSL(return half4(((%s[0] * %s[0].x + %s[1] * %s[0].y) + %s[2] * %s[1].x) + %s[3] * %s[1].y);
)SkSL"
, args.fUniformHandler->getUniformCStr(scalarArrayVar), args.fUniformHandler->getUniformCStr(pointArrayVar), args.fUniformHandler->getUniformCStr(scalarArrayVar), args.fUniformHandler->getUniformCStr(pointArrayVar), args.fUniformHandler->getUniformCStr(scalarArrayVar), args.fUniformHandler->getUniformCStr(pointArrayVar), args.fUniformHandler->getUniformCStr(scalarArrayVar), args.fUniformHandler->getUniformCStr(pointArrayVar));
    }
private:
    void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override {
    }
    UniformHandle scalarArrayVar;
    UniformHandle pointArrayVar;
};
std::unique_ptr<GrGLSLFragmentProcessor> GrUniformArrays::onMakeProgramImpl() const {
    return std::make_unique<GrGLSLUniformArrays>();
}
void GrUniformArrays::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
}
bool GrUniformArrays::onIsEqual(const GrFragmentProcessor& other) const {
    const GrUniformArrays& that = other.cast<GrUniformArrays>();
    (void) that;
    return true;
}
GrUniformArrays::GrUniformArrays(const GrUniformArrays& src)
: INHERITED(kGrUniformArrays_ClassID, src.optimizationFlags()) {
        this->cloneAndRegisterAllChildProcessors(src);
}
std::unique_ptr<GrFragmentProcessor> GrUniformArrays::clone() const {
    return std::make_unique<GrUniformArrays>(*this);
}
#if GR_TEST_UTILS
SkString GrUniformArrays::onDumpInfo() const {
    return SkString();
}
#endif
