9 #include "flutter/fml/closure.h"
31 std::stringstream stream;
35 stream <<
"_unknown_";
41 stream <<
"_fragment_";
44 stream <<
"_compute_";
51 ShaderLibraryGLES::ShaderLibraryGLES(
52 const std::vector<std::shared_ptr<fml::Mapping>>& shader_libraries) {
54 auto iterator = [&functions, library_id = library_id_](
auto type,
60 functions[ShaderKey{key_name, stage}] = std::shared_ptr<ShaderFunctionGLES>{
61 new ShaderFunctionGLES(library_id,
69 for (
auto library : shader_libraries) {
70 auto blob_library = ShaderArchive{std::move(library)};
71 if (!blob_library.IsValid()) {
75 blob_library.IterateAllShaders(iterator);
78 functions_ = functions;
91 std::shared_ptr<const ShaderFunction> ShaderLibraryGLES::GetFunction(
92 std::string_view name,
96 if (
auto found = functions_.find(key); found != functions_.end()) {
103 void ShaderLibraryGLES::RegisterFunction(std::string name,
105 std::shared_ptr<fml::Mapping> code,
106 RegistrationCallback callback) {
108 callback = [](
auto) {};
110 fml::ScopedCleanupClosure auto_fail([callback]() { callback(
false); });
112 code->GetMapping() ==
nullptr) {
116 const auto key = ShaderKey{name, stage};
117 WriterLock lock(functions_mutex_);
118 if (functions_.count(key) != 0) {
120 <<
" has already been registered.";
123 functions_[key] = std::shared_ptr<ShaderFunctionGLES>(
new ShaderFunctionGLES(
134 void ShaderLibraryGLES::UnregisterFunction(std::string name,
136 ReaderLock lock(functions_mutex_);
138 const auto key = ShaderKey{name, stage};
140 auto found = functions_.find(key);
141 if (found == functions_.end()) {
143 <<
" was not found, so it couldn't be unregistered.";
147 functions_.erase(found);
~ShaderLibraryGLES() override
bool IsValid() const override
static std::string GLESShaderNameToShaderKeyName(const std::string &name, ShaderStage stage)
constexpr ShaderStage ToShaderStage(RuntimeShaderStage stage)
std::unordered_map< ShaderKey, std::shared_ptr< const ShaderFunction >, ShaderKey::Hash, ShaderKey::Equal > ShaderFunctionMap