|  | // Copyright 2013 The Flutter Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef FLUTTER_LIB_GPU_SHADER_LIBRARY_H_ | 
|  | #define FLUTTER_LIB_GPU_SHADER_LIBRARY_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <unordered_map> | 
|  |  | 
|  | #include "flutter/lib/gpu/export.h" | 
|  | #include "flutter/lib/gpu/shader.h" | 
|  | #include "flutter/lib/ui/dart_wrapper.h" | 
|  | #include "fml/memory/ref_ptr.h" | 
|  |  | 
|  | namespace flutter { | 
|  | namespace gpu { | 
|  |  | 
|  | /// An immutable collection of shaders loaded from a shader bundle asset. | 
|  | class ShaderLibrary : public RefCountedDartWrappable<ShaderLibrary> { | 
|  | DEFINE_WRAPPERTYPEINFO(); | 
|  | FML_FRIEND_MAKE_REF_COUNTED(ShaderLibrary); | 
|  |  | 
|  | public: | 
|  | using ShaderMap = std::unordered_map<std::string, fml::RefPtr<Shader>>; | 
|  |  | 
|  | static fml::RefPtr<ShaderLibrary> MakeFromAsset( | 
|  | impeller::Context::BackendType backend_type, | 
|  | const std::string& name, | 
|  | std::string& out_error); | 
|  |  | 
|  | static fml::RefPtr<ShaderLibrary> MakeFromShaders(ShaderMap shaders); | 
|  |  | 
|  | static fml::RefPtr<ShaderLibrary> MakeFromFlatbuffer( | 
|  | impeller::Context::BackendType backend_type, | 
|  | std::shared_ptr<fml::Mapping> payload); | 
|  |  | 
|  | /// Sets a return override for `MakeFromAsset` for testing purposes. | 
|  | static void SetOverride(fml::RefPtr<ShaderLibrary> override_shader_library); | 
|  |  | 
|  | fml::RefPtr<Shader> GetShader(const std::string& shader_name, | 
|  | Dart_Handle shader_wrapper) const; | 
|  |  | 
|  | ~ShaderLibrary() override; | 
|  |  | 
|  | private: | 
|  | /// A global override used to inject a ShaderLibrary when running with the | 
|  | /// Impeller playground. When set, `MakeFromAsset` will always just return | 
|  | /// this library. | 
|  | static fml::RefPtr<ShaderLibrary> override_shader_library_; | 
|  |  | 
|  | std::shared_ptr<fml::Mapping> payload_; | 
|  | ShaderMap shaders_; | 
|  |  | 
|  | explicit ShaderLibrary(std::shared_ptr<fml::Mapping> payload, | 
|  | ShaderMap shaders); | 
|  |  | 
|  | FML_DISALLOW_COPY_AND_ASSIGN(ShaderLibrary); | 
|  | }; | 
|  |  | 
|  | }  // namespace gpu | 
|  | }  // namespace flutter | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | /// Exports | 
|  | /// | 
|  |  | 
|  | extern "C" { | 
|  |  | 
|  | FLUTTER_GPU_EXPORT | 
|  | extern Dart_Handle InternalFlutterGpu_ShaderLibrary_InitializeWithAsset( | 
|  | Dart_Handle wrapper, | 
|  | Dart_Handle asset_name); | 
|  |  | 
|  | FLUTTER_GPU_EXPORT | 
|  | extern Dart_Handle InternalFlutterGpu_ShaderLibrary_GetShader( | 
|  | flutter::gpu::ShaderLibrary* wrapper, | 
|  | Dart_Handle shader_name, | 
|  | Dart_Handle shader_wrapper); | 
|  |  | 
|  | }  // extern "C" | 
|  |  | 
|  | #endif  // FLUTTER_LIB_GPU_SHADER_LIBRARY_H_ |