Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
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

std::string ReloadFromAsset (impeller::Context::BackendType backend_type, const std::string &name)
 
std::string ReloadFromFlatbuffer (impeller::Context::BackendType backend_type, std::shared_ptr< fml::Mapping > payload)
 
fml::RefPtr< ShaderGetShader (const std::string &shader_name, Dart_Handle shader_wrapper)
 
const std::string & GetLibraryId () 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, std::string library_id="")
 
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

◆ GetLibraryId()

const std::string & flutter::gpu::ShaderLibrary::GetLibraryId ( ) const
inline

Definition at line 65 of file shader_library.h.

65{ return library_id_; }

◆ GetShader()

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

Definition at line 406 of file shader_library.cc.

407 {
408 auto it = shaders_.find(shader_name);
409 if (it == shaders_.end()) {
410 return nullptr; // No matching shaders.
411 }
412 auto shader = it->second;
413
414 if (shader->dart_wrapper() == nullptr) {
415 shader->AssociateWithDartWrapper(shader_wrapper);
416 }
417 return shader;
418}

Referenced by InternalFlutterGpu_ShaderLibrary_GetShader().

◆ 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), name);
48}
static UIDartState * Current()
static fml::RefPtr< ShaderLibrary > MakeFromFlatbuffer(impeller::Context::BackendType backend_type, std::shared_ptr< fml::Mapping > payload, std::string library_id="")
DEF_SWITCHES_START aot vmservice shared library name
Definition switch_defs.h:27
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 switch_defs.h:36

References flutter::UIDartState::Current(), flutter::data, MakeFromFlatbuffer(), and flutter::name.

Referenced by InternalFlutterGpu_ShaderLibrary_InitializeWithAsset().

◆ MakeFromFlatbuffer()

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

library_id is a stable identifier (typically the asset path the bundle was loaded from) used to namespace the shaders' entrypoints in the shared shader registry, so they cannot collide with engine-internal shaders or with shaders from a different bundle. If empty, a process-unique fallback is generated.

Definition at line 338 of file shader_library.cc.

341 {
342 if (payload == nullptr || !payload->GetMapping()) {
343 return nullptr;
344 }
345 if (library_id.empty()) {
347 }
348 ShaderMap shader_map = ParseShaderBundle(backend_type, payload, library_id);
349 if (shader_map.empty()) {
350 return nullptr;
351 }
352 return fml::MakeRefCounted<flutter::gpu::ShaderLibrary>(
353 std::move(payload), std::move(shader_map), std::move(library_id));
354}
std::unordered_map< std::string, fml::RefPtr< Shader > > ShaderMap
static ShaderLibrary::ShaderMap ParseShaderBundle(impeller::Context::BackendType backend_type, const std::shared_ptr< fml::Mapping > &payload, const std::string &library_id)
static std::string MakeFallbackLibraryId()
Definition shader_key.cc:14

References impeller::ShaderKey::MakeFallbackLibraryId(), and flutter::gpu::ParseShaderBundle().

Referenced by impeller::testing::InstantiateTestShaderLibrary(), and MakeFromAsset().

◆ 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}

◆ ReloadFromAsset()

std::string flutter::gpu::ShaderLibrary::ReloadFromAsset ( impeller::Context::BackendType  backend_type,
const std::string &  name 
)

Re-fetches name from the AssetManager and reparses it into this library, preserving Dart object identity and the library_id so any already-handed-out Shader instances continue to work. Existing Shader entries whose names appear in the new bundle are mutated in place and marked dirty so the next pipeline build evicts and re-registers them. Returns the empty string on success.

Definition at line 356 of file shader_library.cc.

358 {
359 auto dart_state = UIDartState::Current();
360 std::shared_ptr<AssetManager> asset_manager =
361 dart_state->platform_configuration()->client()->GetAssetManager();
362
363 std::unique_ptr<fml::Mapping> data = asset_manager->GetAsMapping(name);
364 if (data == nullptr) {
365 return "Asset '" + name + "' not found.";
366 }
367 return ReloadFromFlatbuffer(backend_type, std::move(data));
368}
std::string ReloadFromFlatbuffer(impeller::Context::BackendType backend_type, std::shared_ptr< fml::Mapping > payload)

References flutter::UIDartState::Current(), flutter::data, flutter::name, and ReloadFromFlatbuffer().

Referenced by InternalFlutterGpu_ShaderLibrary_ReinitializeWithAsset().

◆ ReloadFromFlatbuffer()

std::string flutter::gpu::ShaderLibrary::ReloadFromFlatbuffer ( impeller::Context::BackendType  backend_type,
std::shared_ptr< fml::Mapping payload 
)

Reparses payload into this library, preserving Dart object identity and the library_id. Returns the empty string on success.

Definition at line 370 of file shader_library.cc.

372 {
373 if (payload == nullptr || !payload->GetMapping()) {
374 return "Empty shader bundle payload.";
375 }
376 ShaderMap new_shaders = ParseShaderBundle(backend_type, payload, library_id_);
377 if (new_shaders.empty()) {
378 return "Shader bundle could not be parsed.";
379 }
380
381 // Reuse the existing Shader instance for any name that survives the
382 // reload so user-held Dart wrappers stay attached to live data. Names
383 // that disappeared in the new bundle drop out of the map; names that
384 // are new get added. The eviction of old shader functions happens
385 // lazily in `Shader::RegisterSync` when the dirty bit is observed.
386 ShaderMap merged;
387 for (auto& [name, parsed] : new_shaders) {
388 auto it = shaders_.find(name);
389 if (it != shaders_.end()) {
390 it->second->ResetFrom(*parsed);
391 merged[name] = it->second;
392 } else {
393 merged[name] = std::move(parsed);
394 }
395 }
396 shaders_ = std::move(merged);
397 payload_ = std::move(payload);
398 return "";
399}

References flutter::name, and flutter::gpu::ParseShaderBundle().

Referenced by ReloadFromAsset().

◆ 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 401 of file shader_library.cc.

402 {
403 override_shader_library_ = std::move(override_shader_library);
404}

Referenced by impeller::testing::InstantiateTestShaderLibrary().


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