blob: c879ebd1bb0c3410d2adc72e2e629167cc14e209 [file] [log] [blame]
/*
* 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 <string>
// 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