| // 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_ |