Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | List of all members
flutter::gpu::ShaderLibrary Class Reference

An immutable collection of shaders loaded from a shader bundle asset. More...

#include <shader_library.h>

Inheritance diagram for flutter::gpu::ShaderLibrary:
flutter::RefCountedDartWrappable< ShaderLibrary > fml::RefCountedThreadSafe< T > tonic::DartWrappable fml::internal::RefCountedThreadSafeBase

Public Types

using ShaderMap = std::unordered_map< std::string, fml::RefPtr< Shader > >
 
- Public Types inherited from tonic::DartWrappable
enum  DartNativeFields { kPeerIndex , kNumberOfNativeFields }
 

Public Member Functions

fml::RefPtr< ShaderGetShader (const std::string &shader_name, Dart_Handle shader_wrapper) const
 
 ~ShaderLibrary () override
 
- Public Member Functions inherited from flutter::RefCountedDartWrappable< ShaderLibrary >
virtual void RetainDartWrappableReference () const override
 
virtual void ReleaseDartWrappableReference () const override
 
- Public Member Functions inherited from fml::RefCountedThreadSafe< T >
void Release () const
 
- Public Member Functions inherited from fml::internal::RefCountedThreadSafeBase
void AddRef () const
 
bool HasOneRef () const
 
void AssertHasOneRef () const
 
- Public Member Functions inherited from tonic::DartWrappable
 DartWrappable ()
 
virtual const DartWrapperInfoGetDartWrapperInfo () const =0
 
Dart_Handle CreateDartWrapper (DartState *dart_state)
 
void AssociateWithDartWrapper (Dart_Handle wrappable)
 
void ClearDartWrapper ()
 
Dart_WeakPersistentHandle dart_wrapper () const
 

Static Public Member Functions

static fml::RefPtr< ShaderLibraryMakeFromAsset (impeller::Context::BackendType backend_type, const std::string &name, std::string &out_error)
 
static fml::RefPtr< ShaderLibraryMakeFromShaders (ShaderMap shaders)
 
static fml::RefPtr< ShaderLibraryMakeFromFlatbuffer (impeller::Context::BackendType backend_type, std::shared_ptr< fml::Mapping > payload)
 
static void SetOverride (fml::RefPtr< ShaderLibrary > override_shader_library)
 Sets a return override for MakeFromAsset for testing purposes.
 

Additional Inherited Members

- Protected Member Functions inherited from fml::RefCountedThreadSafe< T >
 RefCountedThreadSafe ()
 
 ~RefCountedThreadSafe ()
 
- Protected Member Functions inherited from fml::internal::RefCountedThreadSafeBase
 RefCountedThreadSafeBase ()
 
 ~RefCountedThreadSafeBase ()
 
bool Release () const
 
void Adopt ()
 
- Protected Member Functions inherited from tonic::DartWrappable
virtual ~DartWrappable ()
 
- Static Protected Member Functions inherited from tonic::DartWrappable
static Dart_PersistentHandle GetTypeForWrapper (tonic::DartState *dart_state, const tonic::DartWrapperInfo &wrapper_info)
 

Detailed Description

An immutable collection of shaders loaded from a shader bundle asset.

Definition at line 21 of file shader_library.h.

Member Typedef Documentation

◆ ShaderMap

using flutter::gpu::ShaderLibrary::ShaderMap = std::unordered_map<std::string, fml::RefPtr<Shader> >

Definition at line 26 of file shader_library.h.

Constructor & Destructor Documentation

◆ ~ShaderLibrary()

flutter::gpu::ShaderLibrary::~ShaderLibrary ( )
overridedefault

Member Function Documentation

◆ GetShader()

fml::RefPtr< Shader > flutter::gpu::ShaderLibrary::GetShader ( const std::string &  shader_name,
Dart_Handle  shader_wrapper 
) const

Definition at line 314 of file shader_library.cc.

315 {
316 auto it = shaders_.find(shader_name);
317 if (it == shaders_.end()) {
318 return nullptr; // No matching shaders.
319 }
320 auto shader = it->second;
321
322 if (shader->dart_wrapper() == nullptr) {
323 shader->AssociateWithDartWrapper(shader_wrapper);
324 }
325 return shader;
326}

◆ MakeFromAsset()

fml::RefPtr< ShaderLibrary > flutter::gpu::ShaderLibrary::MakeFromAsset ( impeller::Context::BackendType  backend_type,
const std::string &  name,
std::string &  out_error 
)
static

Definition at line 29 of file shader_library.cc.

32 {
33 if (override_shader_library_) {
34 return override_shader_library_;
35 }
36
37 auto dart_state = UIDartState::Current();
38 std::shared_ptr<AssetManager> asset_manager =
39 dart_state->platform_configuration()->client()->GetAssetManager();
40
41 std::unique_ptr<fml::Mapping> data = asset_manager->GetAsMapping(name);
42 if (data == nullptr) {
43 out_error = std::string("Asset '") + name + std::string("' not found.");
44 return nullptr;
45 }
46
47 return MakeFromFlatbuffer(backend_type, std::move(data));
48}
static UIDartState * Current()
static fml::RefPtr< ShaderLibrary > MakeFromFlatbuffer(impeller::Context::BackendType backend_type, std::shared_ptr< fml::Mapping > payload)
DEF_SWITCHES_START aot vmservice shared library name
Definition switches.h:32
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switches.h:41

◆ MakeFromFlatbuffer()

fml::RefPtr< ShaderLibrary > flutter::gpu::ShaderLibrary::MakeFromFlatbuffer ( impeller::Context::BackendType  backend_type,
std::shared_ptr< fml::Mapping payload 
)
static

Definition at line 177 of file shader_library.cc.

179 {
180 if (payload == nullptr || !payload->GetMapping()) {
181 return nullptr;
182 }
183 if (!impeller::fb::shaderbundle::ShaderBundleBufferHasIdentifier(
184 payload->GetMapping())) {
185 return nullptr;
186 }
187 auto* bundle =
188 impeller::fb::shaderbundle::GetShaderBundle(payload->GetMapping());
189 if (!bundle) {
190 return nullptr;
191 }
192
193 ShaderLibrary::ShaderMap shader_map;
194
195 for (const auto* bundled_shader : *bundle->shaders()) {
196 const impeller::fb::shaderbundle::BackendShader* backend_shader =
197 GetShaderBackend(backend_type, bundled_shader);
198 if (!backend_shader) {
199 VALIDATION_LOG << "Failed to unpack shader \""
200 << bundled_shader->name()->c_str() << "\" from bundle.";
201 continue;
202 }
203
204 auto code_mapping = std::make_shared<fml::NonOwnedMapping>(
205 backend_shader->shader()->data(), //
206 backend_shader->shader()->size(), //
207 [payload = payload](auto, auto) {} //
208 );
209
210 std::unordered_map<std::string, Shader::UniformBinding> uniform_structs;
211 if (backend_shader->uniform_structs() != nullptr) {
212 for (const auto& uniform : *backend_shader->uniform_structs()) {
213 std::vector<impeller::ShaderStructMemberMetadata> members;
214 if (uniform->fields() != nullptr) {
215 for (const auto& struct_member : *uniform->fields()) {
216 members.push_back(impeller::ShaderStructMemberMetadata{
217 .type = FromUniformType(struct_member->type()),
218 .name = struct_member->name()->c_str(),
219 .offset = static_cast<size_t>(struct_member->offset_in_bytes()),
220 .size =
221 static_cast<size_t>(struct_member->element_size_in_bytes()),
222 .byte_length =
223 static_cast<size_t>(struct_member->total_size_in_bytes()),
224 .array_elements =
225 struct_member->array_elements() != 0
226 ? std::optional<size_t>(std::nullopt)
227 : static_cast<size_t>(struct_member->array_elements()),
228 });
229 }
230 }
231
232 uniform_structs[uniform->name()->str()] = Shader::UniformBinding{
233 .slot =
235 .name = uniform->name()->c_str(),
236 .ext_res_0 = static_cast<size_t>(uniform->ext_res_0()),
237 .set = static_cast<size_t>(uniform->set()),
238 .binding = static_cast<size_t>(uniform->binding()),
239 },
240 .metadata =
242 .name = uniform->name()->c_str(),
243 .members = members,
244 },
245 .size_in_bytes = static_cast<size_t>(uniform->size_in_bytes()),
246 };
247 }
248 }
249
250 std::unordered_map<std::string, impeller::SampledImageSlot>
251 uniform_textures;
252 if (backend_shader->uniform_textures() != nullptr) {
253 for (const auto& uniform : *backend_shader->uniform_textures()) {
254 uniform_textures[uniform->name()->str()] = impeller::SampledImageSlot{
255 .name = uniform->name()->c_str(),
256 .texture_index = static_cast<size_t>(uniform->ext_res_0()),
257 .set = static_cast<size_t>(uniform->set()),
258 .binding = static_cast<size_t>(uniform->binding()),
259 };
260 }
261 }
262
263 std::shared_ptr<impeller::VertexDescriptor> vertex_descriptor = nullptr;
264 if (backend_shader->stage() ==
265 impeller::fb::shaderbundle::ShaderStage::kVertex) {
266 vertex_descriptor = std::make_shared<impeller::VertexDescriptor>();
267 auto inputs_fb = backend_shader->inputs();
268
269 std::vector<impeller::ShaderStageIOSlot> inputs;
270 inputs.reserve(inputs_fb->size());
271 size_t default_stride = 0;
272 for (const auto& input : *inputs_fb) {
274 slot.name = input->name()->c_str();
275 slot.location = input->location();
276 slot.set = input->set();
277 slot.binding = input->binding();
278 slot.type = FromInputType(input->type());
279 slot.bit_width = input->bit_width();
280 slot.vec_size = input->vec_size();
281 slot.columns = input->columns();
282 slot.offset = input->offset();
283 inputs.emplace_back(slot);
284
285 default_stride +=
286 SizeOfInputType(input->type()) * slot.vec_size * slot.columns;
287 }
288 std::vector<impeller::ShaderStageBufferLayout> layouts = {
290 .stride = default_stride,
291 .binding = 0u,
292 }};
293
294 vertex_descriptor->SetStageInputs(inputs, layouts);
295 }
296
297 auto shader = flutter::gpu::Shader::Make(
298 backend_shader->entrypoint()->str(),
299 ToShaderStage(backend_shader->stage()), std::move(code_mapping),
300 std::move(vertex_descriptor), std::move(uniform_structs),
301 std::move(uniform_textures));
302 shader_map[bundled_shader->name()->str()] = std::move(shader);
303 }
304
305 return fml::MakeRefCounted<flutter::gpu::ShaderLibrary>(
306 std::move(payload), std::move(shader_map));
307}
std::unordered_map< std::string, fml::RefPtr< Shader > > ShaderMap
static fml::RefPtr< Shader > Make(std::string entrypoint, impeller::ShaderStage stage, std::shared_ptr< fml::Mapping > code_mapping, std::shared_ptr< impeller::VertexDescriptor > vertex_desc, std::unordered_map< std::string, UniformBinding > uniform_structs, std::unordered_map< std::string, impeller::SampledImageSlot > uniform_textures)
Definition shader.cc:38
static const impeller::fb::shaderbundle::BackendShader * GetShaderBackend(impeller::Context::BackendType backend_type, const impeller::fb::shaderbundle::Shader *shader)
static impeller::ShaderType FromUniformType(impeller::fb::shaderbundle::UniformDataType uniform_type)
static impeller::ShaderType FromInputType(impeller::fb::shaderbundle::InputDataType input_type)
static impeller::ShaderStage ToShaderStage(impeller::fb::shaderbundle::ShaderStage stage)
static size_t SizeOfInputType(impeller::fb::shaderbundle::InputDataType input_type)
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition switches.h:259
Metadata required to bind a combined texture and sampler.
const char * name
The name of the uniform slot.
Metadata required to bind a buffer.
const char * name
The name of the uniform slot.
#define VALIDATION_LOG
Definition validation.h:73

◆ MakeFromShaders()

fml::RefPtr< ShaderLibrary > flutter::gpu::ShaderLibrary::MakeFromShaders ( ShaderMap  shaders)
static

Definition at line 50 of file shader_library.cc.

50 {
51 return fml::MakeRefCounted<flutter::gpu::ShaderLibrary>(nullptr,
52 std::move(shaders));
53}

◆ SetOverride()

void flutter::gpu::ShaderLibrary::SetOverride ( fml::RefPtr< ShaderLibrary override_shader_library)
static

Sets a return override for MakeFromAsset for testing purposes.

Definition at line 309 of file shader_library.cc.

310 {
311 override_shader_library_ = std::move(override_shader_library);
312}

The documentation for this class was generated from the following files: