Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
shader_library_gles.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <sstream>
8
9#include "flutter/fml/closure.h"
15
16namespace impeller {
17
29
30static std::string GLESShaderNameToShaderKeyName(const std::string& name,
31 ShaderStage stage) {
32 std::stringstream stream;
33 stream << name;
34 switch (stage) {
36 stream << "_unknown_";
37 break;
39 stream << "_vertex_";
40 break;
42 stream << "_fragment_";
43 break;
45 stream << "_compute_";
46 break;
47 }
48 stream << "main";
49 return stream.str();
50}
51
52ShaderLibraryGLES::ShaderLibraryGLES(
53 const std::vector<std::shared_ptr<fml::Mapping>>& shader_libraries) {
54 ShaderFunctionMap functions;
55 auto iterator = [&functions, library_id = library_id_](auto type, //
56 const auto& name, //
57 const auto& mapping //
58 ) -> bool {
59 const auto stage = ToShaderStage(type);
60 const auto key_name = GLESShaderNameToShaderKeyName(name, stage);
61
62 functions[ShaderKey{key_name, stage}] = std::shared_ptr<ShaderFunctionGLES>(
63 new ShaderFunctionGLES(library_id, //
64 stage, //
65 key_name, //
66 mapping //
67 ));
68
69 return true;
70 };
71 for (auto library : shader_libraries) {
73 std::move(library), ArchiveRenderingBackend::kOpenGLES);
74 if (!gles_archive || !gles_archive->IsValid()) {
75 VALIDATION_LOG << "Could not construct shader library.";
76 return;
77 }
78 gles_archive->IterateAllShaders(iterator);
79 }
80
81 functions_ = functions;
82 is_valid_ = true;
83}
84
85// |ShaderLibrary|
87
88// |ShaderLibrary|
90 return is_valid_;
91}
92
93// |ShaderLibrary|
94std::shared_ptr<const ShaderFunction> ShaderLibraryGLES::GetFunction(
95 std::string_view name,
96 ShaderStage stage) {
97 ReaderLock lock(functions_mutex_);
98 const auto key = ShaderKey{name, stage};
99 if (auto found = functions_.find(key); found != functions_.end()) {
100 return found->second;
101 }
102 return nullptr;
103}
104
105// |ShaderLibrary|
107 ShaderStage stage,
108 std::shared_ptr<fml::Mapping> code,
110 if (!callback) {
111 callback = [](auto) {};
112 }
113 fml::ScopedCleanupClosure auto_fail([callback]() { callback(false); });
114 if (name.empty() || stage == ShaderStage::kUnknown || code == nullptr ||
115 code->GetMapping() == nullptr) {
116 VALIDATION_LOG << "Invalid runtime stage registration.";
117 return;
118 }
119 const auto key = ShaderKey{name, stage};
120 WriterLock lock(functions_mutex_);
121 if (functions_.count(key) != 0) {
122 VALIDATION_LOG << "Runtime stage named " << name
123 << " has already been registered.";
124 return;
125 }
126 functions_[key] = std::shared_ptr<ShaderFunctionGLES>(new ShaderFunctionGLES(
127 library_id_, //
128 stage, //
130 code //
131 ));
132 auto_fail.Release();
133 callback(true);
134}
135
136// |ShaderLibrary|
138 ShaderStage stage) {
139 ReaderLock lock(functions_mutex_);
140
141 const auto key = ShaderKey{name, stage};
142
143 auto found = functions_.find(key);
144 if (found == functions_.end()) {
145 VALIDATION_LOG << "Library function named " << name
146 << " was not found, so it couldn't be unregistered.";
147 return;
148 }
149
150 functions_.erase(found);
151
152 return;
153}
154
155} // namespace impeller
Wraps a closure that is invoked in the destructor unless released by the caller.
Definition closure.h:32
static std::shared_ptr< ShaderArchive > CreateArchiveFromMapping(const std::shared_ptr< const fml::Mapping > &mapping, ArchiveRenderingBackend backend)
void RegisterFunction(std::string name, ShaderStage stage, std::shared_ptr< fml::Mapping > code, RegistrationCallback callback) override
std::shared_ptr< const ShaderFunction > GetFunction(std::string_view name, ShaderStage stage) override
void UnregisterFunction(std::string name, ShaderStage stage) override
std::function< void(bool)> RegistrationCallback
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
#define FML_UNREACHABLE()
Definition logging.h:109
const char * name
Definition fuchsia.cc:50
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
Definition shader_key.h:44
#define VALIDATION_LOG
Definition validation.h:73