890363ae34
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>
69 lines
2.4 KiB
C++
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
|