blob: fbd8d0da3d666c3138d3d6ef5b2f7431a845a85b [file] [log] [blame]
/*
* Copyright 2024 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkTypes.h"
#include "src/sksl/SkSLCompiler.h"
#include "src/sksl/SkSLProgramKind.h"
#include "src/sksl/SkSLProgramSettings.h"
#include "src/sksl/SkSLUtil.h"
#include "src/sksl/codegen/SkSLPipelineStageCodeGenerator.h"
#include "src/sksl/ir/SkSLProgram.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
#include "tests/Test.h"
#include <memory>
#include <string>
static void test(skiatest::Reporter* r,
const char* src,
SkSL::ProgramKind kind = SkSL::ProgramKind::kPrivateRuntimeShader) {
// These callbacks match the behavior of skslc when given a .stage file.
class Callbacks : public SkSL::PipelineStage::Callbacks {
public:
std::string getMangledName(const char* name) override {
return std::string(name) + "_0";
}
std::string declareUniform(const SkSL::VarDeclaration* decl) override {
fOutput += decl->description();
return std::string(decl->var()->name());
}
void defineFunction(const char* decl, const char* body, bool /*isMain*/) override {
fOutput += std::string(decl) + '{' + body + '}';
}
void declareFunction(const char* decl) override { fOutput += decl; }
void defineStruct(const char* definition) override { fOutput += definition; }
void declareGlobal(const char* declaration) override { fOutput += declaration; }
std::string sampleShader(int index, std::string coords) override {
return "child_" + std::to_string(index) + ".eval(" + coords + ')';
}
std::string sampleColorFilter(int index, std::string color) override {
return "child_" + std::to_string(index) + ".eval(" + color + ')';
}
std::string sampleBlender(int index, std::string src, std::string dst) override {
return "child_" + std::to_string(index) + ".eval(" + src + ", " + dst + ')';
}
std::string toLinearSrgb(std::string color) override {
return "toLinearSrgb(" + color + ')';
}
std::string fromLinearSrgb(std::string color) override {
return "fromLinearSrgb(" + color + ')';
}
std::string fOutput;
};
SkSL::Compiler compiler;
SkSL::ProgramSettings settings;
std::unique_ptr<SkSL::Program> program = compiler.convertProgram(kind, std::string(src),
settings);
if (!program) {
SkDebugf("Unexpected error compiling %s\n%s", src, compiler.errorText().c_str());
REPORTER_ASSERT(r, program);
} else {
Callbacks callbacks;
SkSL::PipelineStage::ConvertProgram(*program, "_coords", "_inColor",
"_canvasColor", &callbacks);
REPORTER_ASSERT(r, !callbacks.fOutput.empty());
// SkDebugf("Pipeline stage output:\n\n%s", callbacks.fOutput.c_str());
}
}
DEF_TEST(SkSLPipelineStageTestbed, r) {
// Add in your SkSL here.
test(r,
R"__SkSL__(
half4 main(float2) {
return half4(0);
}
)__SkSL__");
}