Flutter Engine
 
Loading...
Searching...
No Matches
shader.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <utility>
8
10#include "fml/make_copyable.h"
15
16namespace flutter {
17namespace gpu {
18
21 auto result =
22 std::find_if(metadata.members.begin(), metadata.members.end(),
24 return member.name == name;
25 });
26 if (result == metadata.members.end()) {
27 return nullptr;
28 }
29 return &(*result);
30}
31
33
34Shader::Shader() = default;
35
36Shader::~Shader() = default;
37
39 std::string entrypoint,
41 std::shared_ptr<fml::Mapping> code_mapping,
42 std::vector<impeller::ShaderStageIOSlot> inputs,
43 std::vector<impeller::ShaderStageBufferLayout> layouts,
44 std::unordered_map<std::string, UniformBinding> uniform_structs,
45 std::unordered_map<std::string, TextureBinding> uniform_textures,
46 std::vector<impeller::DescriptorSetLayout> descriptor_set_layouts) {
47 auto shader = fml::MakeRefCounted<Shader>();
48 shader->entrypoint_ = std::move(entrypoint);
49 shader->stage_ = stage;
50 shader->code_mapping_ = std::move(code_mapping);
51 shader->inputs_ = std::move(inputs);
52 shader->layouts_ = std::move(layouts);
53 shader->uniform_structs_ = std::move(uniform_structs);
54 shader->uniform_textures_ = std::move(uniform_textures);
55 shader->descriptor_set_layouts_ = std::move(descriptor_set_layouts);
56 return shader;
57}
58
59std::shared_ptr<const impeller::ShaderFunction> Shader::GetFunctionFromLibrary(
60 impeller::ShaderLibrary& library) {
61 return library.GetFunction(entrypoint_, stage_);
62}
63
65 auto& lib = *context.GetContext().GetShaderLibrary();
66 return GetFunctionFromLibrary(lib) != nullptr;
67}
68
70 if (IsRegistered(context)) {
71 return true; // Already registered.
72 }
73
74 auto& lib = *context.GetContext().GetShaderLibrary();
75
76 std::promise<bool> promise;
77 auto future = promise.get_future();
78 lib.RegisterFunction(
79 entrypoint_, stage_, code_mapping_,
80 fml::MakeCopyable([promise = std::move(promise)](bool result) mutable {
81 promise.set_value(result);
82 }));
83 if (!future.get()) {
84 return false; // Registration failed.
85 }
86 return true;
87}
88
89std::shared_ptr<impeller::VertexDescriptor> Shader::CreateVertexDescriptor()
90 const {
91 auto vertex_descriptor = std::make_shared<impeller::VertexDescriptor>();
92 vertex_descriptor->SetStageInputs(inputs_, layouts_);
93 return vertex_descriptor;
94}
95
97 return stage_;
98}
99
100const std::vector<impeller::DescriptorSetLayout>&
102 return descriptor_set_layouts_;
103}
104
106 const std::string& name) const {
107 auto uniform = uniform_structs_.find(name);
108 if (uniform == uniform_structs_.end()) {
109 return nullptr;
110 }
111 return &uniform->second;
112}
113
115 const std::string& name) const {
116 auto uniform = uniform_textures_.find(name);
117 if (uniform == uniform_textures_.end()) {
118 return nullptr;
119 }
120 return &uniform->second;
121}
122
123} // namespace gpu
124} // namespace flutter
125
126//----------------------------------------------------------------------------
127/// Exports
128///
129
131 flutter::gpu::Shader* wrapper,
132 Dart_Handle struct_name_handle) {
133 auto name = tonic::StdStringFromDart(struct_name_handle);
134 const auto* uniform = wrapper->GetUniformStruct(name);
135 if (uniform == nullptr) {
136 return -1;
137 }
138
139 return uniform->size_in_bytes;
140}
141
143 flutter::gpu::Shader* wrapper,
144 Dart_Handle struct_name_handle,
145 Dart_Handle member_name_handle) {
146 auto struct_name = tonic::StdStringFromDart(struct_name_handle);
147 const auto* uniform = wrapper->GetUniformStruct(struct_name);
148 if (uniform == nullptr) {
149 return -1;
150 }
151
152 auto member_name = tonic::StdStringFromDart(member_name_handle);
153 const auto* member = uniform->GetMemberMetadata(member_name);
154 if (member == nullptr) {
155 return -1;
156 }
157
158 return member->offset;
159}
impeller::Context & GetContext()
Definition context.cc:77
An immutable collection of shaders loaded from a shader bundle asset.
Definition shader.h:23
const Shader::UniformBinding * GetUniformStruct(const std::string &name) const
Definition shader.cc:105
impeller::ShaderStage GetShaderStage() const
Definition shader.cc:96
static fml::RefPtr< Shader > Make(std::string entrypoint, impeller::ShaderStage stage, std::shared_ptr< fml::Mapping > code_mapping, std::vector< impeller::ShaderStageIOSlot > inputs, std::vector< impeller::ShaderStageBufferLayout > layouts, std::unordered_map< std::string, UniformBinding > uniform_structs, std::unordered_map< std::string, TextureBinding > uniform_textures, std::vector< impeller::DescriptorSetLayout > descriptor_set_layouts)
Definition shader.cc:38
bool IsRegistered(Context &context)
Definition shader.cc:64
bool RegisterSync(Context &context)
Definition shader.cc:69
std::shared_ptr< impeller::VertexDescriptor > CreateVertexDescriptor() const
Definition shader.cc:89
const std::vector< impeller::DescriptorSetLayout > & GetDescriptorSetLayouts() const
Definition shader.cc:101
const Shader::TextureBinding * GetUniformTexture(const std::string &name) const
Definition shader.cc:114
std::shared_ptr< const impeller::ShaderFunction > GetFunctionFromLibrary(impeller::ShaderLibrary &library)
Definition shader.cc:59
virtual std::shared_ptr< ShaderLibrary > GetShaderLibrary() const =0
Returns the library of shaders used to specify the programmable stages of a pipeline.
virtual std::shared_ptr< const ShaderFunction > GetFunction(std::string_view name, ShaderStage stage)=0
#define IMPLEMENT_WRAPPERTYPEINFO(LibraryName, ClassName)
int InternalFlutterGpu_Shader_GetUniformStructSize(flutter::gpu::Shader *wrapper, Dart_Handle struct_name_handle)
Definition shader.cc:130
int InternalFlutterGpu_Shader_GetUniformMemberOffset(flutter::gpu::Shader *wrapper, Dart_Handle struct_name_handle, Dart_Handle member_name_handle)
Definition shader.cc:142
DEF_SWITCHES_START aot vmservice shared library name
Definition switch_defs.h:27
internal::CopyableLambda< T > MakeCopyable(T lambda)
std::string StdStringFromDart(Dart_Handle handle)
impeller::ShaderMetadata metadata
Definition shader.h:30
const impeller::ShaderStructMemberMetadata * GetMemberMetadata(const std::string &name) const
Definition shader.cc:20
std::vector< ShaderStructMemberMetadata > members