

/**************************************************************************************************
 *** This file was autogenerated from GrInUniformCType.fp; do not modify.
 **************************************************************************************************/
#include "GrInUniformCType.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 GrGLSLInUniformCType : public GrGLSLFragmentProcessor {
public:
    GrGLSLInUniformCType() {}
    void emitCode(EmitArgs& args) override {
        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
        const GrInUniformCType& _outer = args.fFp.cast<GrInUniformCType>();
        (void) _outer;
        auto color = _outer.color;
        (void) color;
        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 {
        const GrInUniformCType& _outer = _proc.cast<GrInUniformCType>();
        {
        pdman.set4fv(colorVar, 1, (_outer.color).vec());
        }
    }
    UniformHandle colorVar;
};
std::unique_ptr<GrGLSLFragmentProcessor> GrInUniformCType::onMakeProgramImpl() const {
    return std::make_unique<GrGLSLInUniformCType>();
}
void GrInUniformCType::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
}
bool GrInUniformCType::onIsEqual(const GrFragmentProcessor& other) const {
    const GrInUniformCType& that = other.cast<GrInUniformCType>();
    (void) that;
    if (color != that.color) return false;
    return true;
}
GrInUniformCType::GrInUniformCType(const GrInUniformCType& src)
: INHERITED(kGrInUniformCType_ClassID, src.optimizationFlags())
, color(src.color) {
        this->cloneAndRegisterAllChildProcessors(src);
}
std::unique_ptr<GrFragmentProcessor> GrInUniformCType::clone() const {
    return std::make_unique<GrInUniformCType>(*this);
}
#if GR_TEST_UTILS
SkString GrInUniformCType::onDumpInfo() const {
    return SkStringPrintf("(color=half4(%f, %f, %f, %f))", color.fR, color.fG, color.fB, color.fA);
}
#endif
