| // 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_H_ | |
| #define FLUTTER_LIB_GPU_SHADER_H_ | |
| #include <algorithm> | |
| #include <memory> | |
| #include <string> | |
| #include "flutter/lib/gpu/context.h" | |
| #include "flutter/lib/ui/dart_wrapper.h" | |
| #include "fml/memory/ref_ptr.h" | |
| #include "impeller/core/shader_types.h" | |
| #include "impeller/renderer/shader_function.h" | |
| #include "impeller/renderer/vertex_descriptor.h" | |
| namespace flutter { | |
| namespace gpu { | |
| /// An immutable collection of shaders loaded from a shader bundle asset. | |
| class Shader : public RefCountedDartWrappable<Shader> { | |
| DEFINE_WRAPPERTYPEINFO(); | |
| FML_FRIEND_MAKE_REF_COUNTED(Shader); | |
| public: | |
| struct UniformBinding { | |
| impeller::ShaderUniformSlot slot; | |
| impeller::ShaderMetadata metadata; | |
| size_t size_in_bytes = 0; | |
| const impeller::ShaderStructMemberMetadata* GetMemberMetadata( | |
| const std::string& name) const; | |
| }; | |
| ~Shader() override; | |
| 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); | |
| std::shared_ptr<const impeller::ShaderFunction> GetFunctionFromLibrary( | |
| impeller::ShaderLibrary& library); | |
| bool IsRegistered(Context& context); | |
| bool RegisterSync(Context& context); | |
| std::shared_ptr<impeller::VertexDescriptor> GetVertexDescriptor() const; | |
| impeller::ShaderStage GetShaderStage() const; | |
| const Shader::UniformBinding* GetUniformStruct(const std::string& name) const; | |
| const impeller::SampledImageSlot* GetUniformTexture( | |
| const std::string& name) const; | |
| private: | |
| Shader(); | |
| 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_; | |
| FML_DISALLOW_COPY_AND_ASSIGN(Shader); | |
| }; | |
| } // namespace gpu | |
| } // namespace flutter | |
| //---------------------------------------------------------------------------- | |
| /// Exports | |
| /// | |
| extern "C" { | |
| FLUTTER_GPU_EXPORT | |
| extern int InternalFlutterGpu_Shader_GetUniformStructSize( | |
| flutter::gpu::Shader* wrapper, | |
| Dart_Handle struct_name_handle); | |
| FLUTTER_GPU_EXPORT | |
| extern int InternalFlutterGpu_Shader_GetUniformMemberOffset( | |
| flutter::gpu::Shader* wrapper, | |
| Dart_Handle struct_name_handle, | |
| Dart_Handle member_name_handle); | |
| } // extern "C" | |
| #endif // FLUTTER_LIB_GPU_SHADER_H_ |