blob: b94b9dafe25135ccf9be99916dab3b448e3f414c [file] [log] [blame]
/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SKSL_PIPELINESTAGECODEGENERATOR
#define SKSL_PIPELINESTAGECODEGENERATOR
#include "include/core/SkTypes.h"
#if defined(SKSL_STANDALONE) || SK_SUPPORT_GPU || SK_GRAPHITE_ENABLED
#include <string>
namespace SkSL {
struct Program;
class VarDeclaration;
namespace PipelineStage {
class Callbacks {
public:
virtual ~Callbacks() = default;
virtual std::string getMainName() { return "main"; }
virtual std::string getMangledName(const char* name) { return name; }
virtual void defineFunction(const char* declaration, const char* body, bool isMain) = 0;
virtual void declareFunction(const char* declaration) = 0;
virtual void defineStruct(const char* definition) = 0;
virtual void declareGlobal(const char* declaration) = 0;
virtual std::string declareUniform(const VarDeclaration*) = 0;
virtual std::string sampleShader(int index, std::string coords) = 0;
virtual std::string sampleColorFilter(int index, std::string color) = 0;
virtual std::string sampleBlender(int index, std::string src, std::string dst) = 0;
virtual std::string toLinearSrgb(std::string color) = 0;
virtual std::string fromLinearSrgb(std::string color) = 0;
};
/*
* Processes 'program' for use in a GrFragmentProcessor, or other context that wants SkSL-like
* code as input. To support fragment processor usage, there are callbacks that allow elements
* to be declared programmatically and to rename those elements (mangling to avoid collisions).
*
* - Any reference to the main coords builtin variable will be replaced with 'sampleCoords'.
* - Any reference to the input color builtin variable will be replaced with 'inputColor'.
* - Any reference to the dest color builtin variable will be replaced with 'destColor'.
* Dest-color is used in blend programs.
* - Each uniform variable declaration triggers a call to 'declareUniform', which should emit
* the declaration, and return the (possibly different) name to use for the variable.
* - Each function definition triggers a call to 'defineFunction', which should emit the
* definition, and return the (possibly different) name to use for calls to that function.
* - Each invocation of sample() triggers a call to 'sampleChild', which should return the full
* text of the call expression.
*/
void ConvertProgram(const Program& program,
const char* sampleCoords,
const char* inputColor,
const char* destColor,
Callbacks* callbacks);
} // namespace PipelineStage
} // namespace SkSL
#endif
#endif