/* * 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/SkSLGraphiteModules.h" #include "src/sksl/SkSLModule.h" #include // We include minified SkSL module code and pass it directly to the compiler. #if defined(SK_ENABLE_OPTIMIZE_SIZE) || !defined(SK_DEBUG) #include "src/sksl/generated/sksl_compute.minified.sksl" #include "src/sksl/generated/sksl_frag.minified.sksl" #include "src/sksl/generated/sksl_gpu.minified.sksl" #include "src/sksl/generated/sksl_public.minified.sksl" #include "src/sksl/generated/sksl_rt_shader.minified.sksl" #include "src/sksl/generated/sksl_shared.minified.sksl" #include "src/sksl/generated/sksl_vert.minified.sksl" #else #include "src/sksl/generated/sksl_compute.unoptimized.sksl" #include "src/sksl/generated/sksl_frag.unoptimized.sksl" #include "src/sksl/generated/sksl_gpu.unoptimized.sksl" #include "src/sksl/generated/sksl_public.unoptimized.sksl" #include "src/sksl/generated/sksl_rt_shader.unoptimized.sksl" #include "src/sksl/generated/sksl_shared.unoptimized.sksl" #include "src/sksl/generated/sksl_vert.unoptimized.sksl" #endif // We don't load the graphite modules by default because we don't want to bloat the Ganesh-only // build with Graphite's modules. These will be filled in during initialization of the // Graphite backend. static const char* sdata_sksl_graphite_frag = ""; static const char* sdata_sksl_graphite_frag_es2 = ""; static const char* sdata_sksl_graphite_vert = ""; static const char* sdata_sksl_graphite_vert_es2 = ""; namespace SkSL { std::string GetModuleData(ModuleType type, const char* /*filename*/) { #define M(name) case ModuleType::name: return std::string(SKSL_MINIFIED_##name); // Creating a std::string with a nullptr is UB #define G(name) \ case ModuleType::name: \ if (sdata_##name) { \ return std::string(sdata_##name); \ } else { \ return ""; \ } switch (type) { M(sksl_shared) M(sksl_compute) M(sksl_frag) M(sksl_gpu) M(sksl_public) M(sksl_rt_shader) M(sksl_vert) G(sksl_graphite_frag) G(sksl_graphite_frag_es2) G(sksl_graphite_vert) G(sksl_graphite_vert_es2) default: SkUNREACHABLE; } #undef M } namespace Loader { void SetGraphiteModuleData(const GraphiteModules& modules) { SkASSERTF(sdata_sksl_graphite_frag[0] == '\0', "We should only initialize this once"); sdata_sksl_graphite_frag = modules.fFragmentShader; sdata_sksl_graphite_frag_es2 = modules.fFragmentShaderES2; sdata_sksl_graphite_vert = modules.fVertexShader; sdata_sksl_graphite_vert_es2 = modules.fVertexShaderES2; SkASSERT(sdata_sksl_graphite_frag[0] != '\0'); SkASSERT(sdata_sksl_graphite_vert[0] != '\0'); // TODO(jamesgk, kjlubick) Add check when ES2 code is included } } // namespace Loader } // namespace SkSL