2955c26908
This CL doesn't actually allow the callbacks to be invoked from SkSL yet, but the callbacks now exist and are now threaded through the various callsites which will need them. Change-Id: I00f43ff94de9da8d93daf2e59885eea6f87c2e3e Bug: skia:12257 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/431696 Commit-Queue: John Stiles <johnstiles@google.com> Auto-Submit: John Stiles <johnstiles@google.com> Reviewed-by: Brian Osman <brianosman@google.com>
73 lines
2.5 KiB
C++
73 lines
2.5 KiB
C++
/*
|
|
* Copyright 2019 Google, LLC
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "src/gpu/GrShaderCaps.h"
|
|
#include "src/sksl/SkSLCompiler.h"
|
|
#include "src/sksl/codegen/SkSLPipelineStageCodeGenerator.h"
|
|
#include "src/sksl/ir/SkSLVarDeclarations.h"
|
|
#include "src/sksl/ir/SkSLVariable.h"
|
|
|
|
#include "fuzz/Fuzz.h"
|
|
|
|
bool FuzzSKSL2Pipeline(sk_sp<SkData> bytes) {
|
|
sk_sp<GrShaderCaps> caps = SkSL::ShaderCapsFactory::Default();
|
|
SkSL::Compiler compiler(caps.get());
|
|
SkSL::Program::Settings settings;
|
|
std::unique_ptr<SkSL::Program> program = compiler.convertProgram(
|
|
SkSL::ProgramKind::kRuntimeShader,
|
|
SkSL::String((const char*) bytes->data(),
|
|
bytes->size()),
|
|
settings);
|
|
if (!program) {
|
|
return false;
|
|
}
|
|
|
|
class Callbacks : public SkSL::PipelineStage::Callbacks {
|
|
using String = SkSL::String;
|
|
|
|
String declareUniform(const SkSL::VarDeclaration* decl) override {
|
|
return String(decl->var().name());
|
|
}
|
|
|
|
void defineFunction(const char* /*decl*/, const char* /*body*/, bool /*isMain*/) override {}
|
|
void defineStruct(const char* /*definition*/) override {}
|
|
void declareGlobal(const char* /*declaration*/) override {}
|
|
|
|
String sampleShader(int index, String coords) override {
|
|
return "sample(" + SkSL::to_string(index) + ", " + coords + ")";
|
|
}
|
|
|
|
String sampleColorFilter(int index, String color) override {
|
|
String result = "sample(" + SkSL::to_string(index);
|
|
if (!color.empty()) {
|
|
result += ", " + color;
|
|
}
|
|
result += ")";
|
|
return result;
|
|
}
|
|
|
|
String sampleBlender(int index, String src, String dst) override {
|
|
return "sample(" + SkSL::to_string(index) + ", " + src + ", " + dst + ")";
|
|
}
|
|
};
|
|
|
|
Callbacks callbacks;
|
|
SkSL::PipelineStage::ConvertProgram(*program, "coords", "inColor", "half4(1)", &callbacks);
|
|
return true;
|
|
}
|
|
|
|
#if defined(SK_BUILD_FOR_LIBFUZZER)
|
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
|
if (size > 3000) {
|
|
return 0;
|
|
}
|
|
auto bytes = SkData::MakeWithoutCopy(data, size);
|
|
FuzzSKSL2Pipeline(bytes);
|
|
return 0;
|
|
}
|
|
#endif
|