

/**************************************************************************************************
 *** This file was autogenerated from GrChildProcessorSampleWithColor.fp; do not modify.
 **************************************************************************************************/
#ifndef GrChildProcessorSampleWithColor_DEFINED
#define GrChildProcessorSampleWithColor_DEFINED

#include "include/core/SkM44.h"
#include "include/core/SkTypes.h"


#include "src/gpu/GrFragmentProcessor.h"

class GrChildProcessorSampleWithColor : public GrFragmentProcessor {
public:
    static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> passthrough, std::unique_ptr<GrFragmentProcessor> explicit) {
        return std::unique_ptr<GrFragmentProcessor>(new GrChildProcessorSampleWithColor(std::move(passthrough), std::move(explicit)));
    }
    GrChildProcessorSampleWithColor(const GrChildProcessorSampleWithColor& src);
    std::unique_ptr<GrFragmentProcessor> clone() const override;
    const char* name() const override { return "ChildProcessorSampleWithColor"; }
private:
    GrChildProcessorSampleWithColor(std::unique_ptr<GrFragmentProcessor> passthrough, std::unique_ptr<GrFragmentProcessor> explicit)
    : INHERITED(kGrChildProcessorSampleWithColor_ClassID, kNone_OptimizationFlags) {
        this->setUsesSampleCoordsDirectly();
        this->registerChild(std::move(passthrough), SkSL::SampleUsage::PassThrough());
        this->registerChild(std::move(explicit), SkSL::SampleUsage::Explicit());
    }
    std::unique_ptr<GrGLSLFragmentProcessor> onMakeProgramImpl() const override;
    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
    bool onIsEqual(const GrFragmentProcessor&) const override;
#if GR_TEST_UTILS
    SkString onDumpInfo() const override;
#endif
    GR_DECLARE_FRAGMENT_PROCESSOR_TEST
    using INHERITED = GrFragmentProcessor;
};
#endif
