

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