1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 Google, LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLCompiler.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramKind.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramSettings.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/codegen/SkSLPipelineStageCodeGenerator.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLProgram.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLVarDeclarations.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLVariable.h"
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker #include "fuzz/Fuzz.h"
17*c8dee2aaSAndroid Build Coastguard Worker
FuzzSKSL2Pipeline(const uint8_t * data,size_t size)18*c8dee2aaSAndroid Build Coastguard Worker bool FuzzSKSL2Pipeline(const uint8_t *data, size_t size) {
19*c8dee2aaSAndroid Build Coastguard Worker SkSL::Compiler compiler;
20*c8dee2aaSAndroid Build Coastguard Worker SkSL::ProgramSettings settings;
21*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkSL::Program> program =
22*c8dee2aaSAndroid Build Coastguard Worker compiler.convertProgram(SkSL::ProgramKind::kRuntimeShader,
23*c8dee2aaSAndroid Build Coastguard Worker std::string(reinterpret_cast<const char*>(data), size),
24*c8dee2aaSAndroid Build Coastguard Worker settings);
25*c8dee2aaSAndroid Build Coastguard Worker if (!program) {
26*c8dee2aaSAndroid Build Coastguard Worker return false;
27*c8dee2aaSAndroid Build Coastguard Worker }
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker class Callbacks : public SkSL::PipelineStage::Callbacks {
30*c8dee2aaSAndroid Build Coastguard Worker std::string declareUniform(const SkSL::VarDeclaration* decl) override {
31*c8dee2aaSAndroid Build Coastguard Worker return std::string(decl->var()->name());
32*c8dee2aaSAndroid Build Coastguard Worker }
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Worker void defineFunction(const char* /*decl*/, const char* /*body*/, bool /*isMain*/) override {}
35*c8dee2aaSAndroid Build Coastguard Worker void declareFunction(const char* /*decl*/) override {}
36*c8dee2aaSAndroid Build Coastguard Worker void defineStruct(const char* /*definition*/) override {}
37*c8dee2aaSAndroid Build Coastguard Worker void declareGlobal(const char* /*declaration*/) override {}
38*c8dee2aaSAndroid Build Coastguard Worker
39*c8dee2aaSAndroid Build Coastguard Worker std::string sampleShader(int index, std::string coords) override {
40*c8dee2aaSAndroid Build Coastguard Worker return "child_" + std::to_string(index) + ".eval(" + coords + ")";
41*c8dee2aaSAndroid Build Coastguard Worker }
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Worker std::string sampleColorFilter(int index, std::string color) override {
44*c8dee2aaSAndroid Build Coastguard Worker return "child_" + std::to_string(index) + ".eval(" + color + ")";
45*c8dee2aaSAndroid Build Coastguard Worker }
46*c8dee2aaSAndroid Build Coastguard Worker
47*c8dee2aaSAndroid Build Coastguard Worker std::string sampleBlender(int index, std::string src, std::string dst) override {
48*c8dee2aaSAndroid Build Coastguard Worker return "child_" + std::to_string(index) + ".eval(" + src + ", " + dst + ")";
49*c8dee2aaSAndroid Build Coastguard Worker }
50*c8dee2aaSAndroid Build Coastguard Worker
51*c8dee2aaSAndroid Build Coastguard Worker std::string toLinearSrgb(std::string color) override { return color; }
52*c8dee2aaSAndroid Build Coastguard Worker std::string fromLinearSrgb(std::string color) override { return color; }
53*c8dee2aaSAndroid Build Coastguard Worker };
54*c8dee2aaSAndroid Build Coastguard Worker
55*c8dee2aaSAndroid Build Coastguard Worker Callbacks callbacks;
56*c8dee2aaSAndroid Build Coastguard Worker SkSL::PipelineStage::ConvertProgram(*program, "coords", "inColor", "half4(1)", &callbacks);
57*c8dee2aaSAndroid Build Coastguard Worker return true;
58*c8dee2aaSAndroid Build Coastguard Worker }
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_LIBFUZZER)
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)61*c8dee2aaSAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
62*c8dee2aaSAndroid Build Coastguard Worker if (size > 3000) {
63*c8dee2aaSAndroid Build Coastguard Worker return 0;
64*c8dee2aaSAndroid Build Coastguard Worker }
65*c8dee2aaSAndroid Build Coastguard Worker FuzzSKSL2Pipeline(data, size);
66*c8dee2aaSAndroid Build Coastguard Worker return 0;
67*c8dee2aaSAndroid Build Coastguard Worker }
68*c8dee2aaSAndroid Build Coastguard Worker #endif
69