skia2/tests/sksl/errors/golden/GrRecursion.cpp
John Stiles 890363ae34 Prototype helper functions from FP files before use.
GLSL requires that functions are declared before first use. In most
cases, we avoid the requirement for explicit prototypes by this by
strategically ordering our functions within the emitted code, but an FP
file might reference its helper functions in any order or have helper
functions that cross-invoke each other, so prototypes should be emitted.

Change-Id: I3b9e9c9ec4bd5be90b4f71f8165af45364facf30
Bug: skia:10872
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/329781
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
2020-10-27 14:33:00 +00:00

69 lines
2.4 KiB
C++

/**************************************************************************************************
*** This file was autogenerated from GrRecursion.fp; do not modify.
**************************************************************************************************/
#include "GrRecursion.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 GrGLSLRecursion : public GrGLSLFragmentProcessor {
public:
GrGLSLRecursion() {}
void emitCode(EmitArgs& args) override {
GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
const GrRecursion& _outer = args.fFp.cast<GrRecursion>();
(void) _outer;
SkString factorial_name = fragBuilder->getMangledFunctionName("factorial");
const GrShaderVar factorial_args[] = { GrShaderVar("x", kInt_GrSLType) };
fragBuilder->emitFunctionPrototype(kInt_GrSLType, factorial_name.c_str(), 1, factorial_args);
const String factorial_impl = String::printf(R"SkSL(return x <= 1 ? 1 : x * %s(x - 1);
)SkSL"
, factorial_name.c_str());
fragBuilder->emitFunction(kInt_GrSLType, factorial_name.c_str(), 1, factorial_args, factorial_impl.c_str());
fragBuilder->codeAppendf(
R"SkSL(int _0_factorial;
{
_0_factorial = 7 * %s(6);
}
%s = half4(half(_0_factorial));
)SkSL"
, factorial_name.c_str(), args.fOutputColor);
}
private:
void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override {
}
};
GrGLSLFragmentProcessor* GrRecursion::onCreateGLSLInstance() const {
return new GrGLSLRecursion();
}
void GrRecursion::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const {
}
bool GrRecursion::onIsEqual(const GrFragmentProcessor& other) const {
const GrRecursion& that = other.cast<GrRecursion>();
(void) that;
return true;
}
bool GrRecursion::usesExplicitReturn() const {
return false;
}
GrRecursion::GrRecursion(const GrRecursion& src)
: INHERITED(kGrRecursion_ClassID, src.optimizationFlags()) {
this->cloneAndRegisterAllChildProcessors(src);
}
std::unique_ptr<GrFragmentProcessor> GrRecursion::clone() const {
return std::make_unique<GrRecursion>(*this);
}
#if GR_TEST_UTILS
SkString GrRecursion::onDumpInfo() const {
return SkString();
}
#endif