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 11cb93a386Sopenharmony_ci#include "fuzz/Fuzz.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_cibool FuzzSKSL2SPIRV(sk_sp<SkData> bytes) { 14cb93a386Sopenharmony_ci std::unique_ptr<GrShaderCaps> caps = SkSL::ShaderCapsFactory::Default(); 15cb93a386Sopenharmony_ci SkSL::Compiler compiler(caps.get()); 16cb93a386Sopenharmony_ci SkSL::String output; 17cb93a386Sopenharmony_ci SkSL::Program::Settings settings; 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci // This tells the compiler where the rt-flip uniform will live should it be required. For 20cb93a386Sopenharmony_ci // fuzzing purposes we don't care where that is, but the compiler will report an error if we 21cb93a386Sopenharmony_ci // leave them at their default invalid values, or if the offset overlaps another uniform. 22cb93a386Sopenharmony_ci settings.fRTFlipOffset = 16384; 23cb93a386Sopenharmony_ci settings.fRTFlipSet = 0; 24cb93a386Sopenharmony_ci settings.fRTFlipBinding = 0; 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci std::unique_ptr<SkSL::Program> program = compiler.convertProgram( 27cb93a386Sopenharmony_ci SkSL::ProgramKind::kFragment, 28cb93a386Sopenharmony_ci SkSL::String((const char*) bytes->data(), 29cb93a386Sopenharmony_ci bytes->size()), 30cb93a386Sopenharmony_ci settings); 31cb93a386Sopenharmony_ci if (!program || !compiler.toSPIRV(*program, &output)) { 32cb93a386Sopenharmony_ci return false; 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci return true; 35cb93a386Sopenharmony_ci} 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_LIBFUZZER) 38cb93a386Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { 39cb93a386Sopenharmony_ci if (size > 3000) { 40cb93a386Sopenharmony_ci return 0; 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci auto bytes = SkData::MakeWithoutCopy(data, size); 43cb93a386Sopenharmony_ci FuzzSKSL2SPIRV(bytes); 44cb93a386Sopenharmony_ci return 0; 45cb93a386Sopenharmony_ci} 46cb93a386Sopenharmony_ci#endif 47