diff options
Diffstat (limited to 'gfx/skia/skia/src/sksl/SkSLModuleLoader.h')
-rw-r--r-- | gfx/skia/skia/src/sksl/SkSLModuleLoader.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/sksl/SkSLModuleLoader.h b/gfx/skia/skia/src/sksl/SkSLModuleLoader.h new file mode 100644 index 0000000000..bb300e2f7a --- /dev/null +++ b/gfx/skia/skia/src/sksl/SkSLModuleLoader.h @@ -0,0 +1,67 @@ +/* + * Copyright 2022 Google LLC + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SKSL_MODULELOADER +#define SKSL_MODULELOADER + +#include "src/sksl/SkSLBuiltinTypes.h" +#include <memory> + +namespace SkSL { + +class Compiler; +class ModifiersPool; +struct Module; +class Type; + +using BuiltinTypePtr = const std::unique_ptr<Type> BuiltinTypes::*; + +class ModuleLoader { +private: + struct Impl; + Impl& fModuleLoader; + +public: + ModuleLoader(ModuleLoader::Impl&); + ~ModuleLoader(); + + // Acquires a mutex-locked reference to the singleton ModuleLoader. When the ModuleLoader is + // allowed to fall out of scope, the mutex will be released. + static ModuleLoader Get(); + + // The built-in types and root module are universal, immutable, and shared by every Compiler. + // They are created when the ModuleLoader is instantiated and never change. + const BuiltinTypes& builtinTypes(); + const Module* rootModule(); + + // This ModifiersPool is shared by every built-in module. + ModifiersPool& coreModifiers(); + + // These modules are loaded on demand; once loaded, they are kept for the lifetime of the + // process. + const Module* loadSharedModule(SkSL::Compiler* compiler); + const Module* loadGPUModule(SkSL::Compiler* compiler); + const Module* loadVertexModule(SkSL::Compiler* compiler); + const Module* loadFragmentModule(SkSL::Compiler* compiler); + const Module* loadComputeModule(SkSL::Compiler* compiler); + const Module* loadGraphiteVertexModule(SkSL::Compiler* compiler); + const Module* loadGraphiteFragmentModule(SkSL::Compiler* compiler); + + const Module* loadPublicModule(SkSL::Compiler* compiler); + const Module* loadPrivateRTShaderModule(SkSL::Compiler* compiler); + + // This updates an existing Module's symbol table to match Runtime Effect rules. GLSL types like + // `vec4` are added; SkSL private types like `sampler2D` are replaced with an invalid type. + void addPublicTypeAliases(const SkSL::Module* module); + + // This unloads every module. It's useful primarily for benchmarking purposes. + void unloadModules(); +}; + +} // namespace SkSL + +#endif // SKSL_MODULELOADER |