

/**************************************************************************************************
 *** This file was autogenerated from GrChildProcessorInlineFieldAccess.fp; do not modify.
 **************************************************************************************************/
#include "GrChildProcessorInlineFieldAccess.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 GrGLSLChildProcessorInlineFieldAccess : public GrGLSLFragmentProcessor {
public:
    GrGLSLChildProcessorInlineFieldAccess() {}
    void emitCode(EmitArgs& args) override {
        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
        const GrChildProcessorInlineFieldAccess& _outer = args.fFp.cast<GrChildProcessorInlineFieldAccess>();
        (void) _outer;
        fragBuilder->codeAppendf(
R"SkSL(if (%s) {)SkSL"
, (_outer.childProcessor(0)->preservesOpaqueInput() ? "true" : "false"));
        SkString _sample0 = this->invokeChild(0, args);
        fragBuilder->codeAppendf(
R"SkSL(
    return %s;
} else {
    return half4(1.0);
}
)SkSL"
, _sample0.c_str());
    }
private:
    void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override {
    }
};
GrGLSLFragmentProcessor* GrChildProcessorInlineFieldAccess::onCreateGLSLInstance() const {
    return new GrGLSLChildProcessorInlineFieldAccess();
}
void GrChildProcessorInlineFieldAccess::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
}
bool GrChildProcessorInlineFieldAccess::onIsEqual(const GrFragmentProcessor& other) const {
    const GrChildProcessorInlineFieldAccess& that = other.cast<GrChildProcessorInlineFieldAccess>();
    (void) that;
    return true;
}
GrChildProcessorInlineFieldAccess::GrChildProcessorInlineFieldAccess(const GrChildProcessorInlineFieldAccess& src)
: INHERITED(kGrChildProcessorInlineFieldAccess_ClassID, src.optimizationFlags()) {
        this->cloneAndRegisterAllChildProcessors(src);
}
std::unique_ptr<GrFragmentProcessor> GrChildProcessorInlineFieldAccess::clone() const {
    return std::make_unique<GrChildProcessorInlineFieldAccess>(*this);
}
#if GR_TEST_UTILS
SkString GrChildProcessorInlineFieldAccess::onDumpInfo() const {
    return SkString();
}
#endif
