

/**************************************************************************************************
 *** This file was autogenerated from GrChildProcessorSampleMatrixConstantAndCoords.fp; do not modify.
 **************************************************************************************************/
#include "GrChildProcessorSampleMatrixConstantAndCoords.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 GrGLSLChildProcessorSampleMatrixConstantAndCoords : public GrGLSLFragmentProcessor {
public:
    GrGLSLChildProcessorSampleMatrixConstantAndCoords() {}
    void emitCode(EmitArgs& args) override {
        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
        const GrChildProcessorSampleMatrixConstantAndCoords& _outer = args.fFp.cast<GrChildProcessorSampleMatrixConstantAndCoords>();
        (void) _outer;
        SkString _sample0 = this->invokeChildWithMatrix(0, args);
        SkString _coords1 = SkStringPrintf("%s / 2.0", args.fSampleCoord);
        SkString _sample1 = this->invokeChild(0, args, _coords1.c_str());
        fragBuilder->codeAppendf(
R"SkSL(return %s * %s;
)SkSL"
, _sample0.c_str(), _sample1.c_str());
    }
private:
    void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override {
    }
};
std::unique_ptr<GrGLSLFragmentProcessor> GrChildProcessorSampleMatrixConstantAndCoords::onMakeProgramImpl() const {
    return std::make_unique<GrGLSLChildProcessorSampleMatrixConstantAndCoords>();
}
void GrChildProcessorSampleMatrixConstantAndCoords::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
}
bool GrChildProcessorSampleMatrixConstantAndCoords::onIsEqual(const GrFragmentProcessor& other) const {
    const GrChildProcessorSampleMatrixConstantAndCoords& that = other.cast<GrChildProcessorSampleMatrixConstantAndCoords>();
    (void) that;
    return true;
}
GrChildProcessorSampleMatrixConstantAndCoords::GrChildProcessorSampleMatrixConstantAndCoords(const GrChildProcessorSampleMatrixConstantAndCoords& src)
: INHERITED(kGrChildProcessorSampleMatrixConstantAndCoords_ClassID, src.optimizationFlags()) {
        this->cloneAndRegisterAllChildProcessors(src);
    this->setUsesSampleCoordsDirectly();
}
std::unique_ptr<GrFragmentProcessor> GrChildProcessorSampleMatrixConstantAndCoords::clone() const {
    return std::make_unique<GrChildProcessorSampleMatrixConstantAndCoords>(*this);
}
#if GR_TEST_UTILS
SkString GrChildProcessorSampleMatrixConstantAndCoords::onDumpInfo() const {
    return SkString();
}
#endif
