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