

/**************************************************************************************************
 *** This file was autogenerated from GrUniform.fp; do not modify.
 **************************************************************************************************/
#include "GrUniform.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 GrGLSLUniform : public GrGLSLFragmentProcessor {
public:
    GrGLSLUniform() {}
    void emitCode(EmitArgs& args) override {
        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
        const GrUniform& _outer = args.fFp.cast<GrUniform>();
        (void) _outer;
        colorVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag, kHalf4_GrSLType, "color");
        fragBuilder->codeAppendf(
R"SkSL(return %s;
)SkSL"
, args.fUniformHandler->getUniformCStr(colorVar));
    }
private:
    void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override {
    }
    UniformHandle colorVar;
};
std::unique_ptr<GrGLSLFragmentProcessor> GrUniform::onMakeProgramImpl() const {
    return std::make_unique<GrGLSLUniform>();
}
void GrUniform::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
}
bool GrUniform::onIsEqual(const GrFragmentProcessor& other) const {
    const GrUniform& that = other.cast<GrUniform>();
    (void) that;
    return true;
}
GrUniform::GrUniform(const GrUniform& src)
: INHERITED(kGrUniform_ClassID, src.optimizationFlags()) {
        this->cloneAndRegisterAllChildProcessors(src);
}
std::unique_ptr<GrFragmentProcessor> GrUniform::clone() const {
    return std::make_unique<GrUniform>(*this);
}
#if GR_TEST_UTILS
SkString GrUniform::onDumpInfo() const {
    return SkString();
}
#endif
