Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
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"
16
17namespace flutter {
18namespace gpu {
19
22 auto result =
23 std::find_if(metadata.members.begin(), metadata.members.end(),
25 return member.name == name;
26 });
27 if (result == metadata.members.end()) {
28 return nullptr;
29 }
30 return &(*result);
31}
32
34
35Shader::Shader() = default;
36
37Shader::~Shader() = default;
38
40 std::string library_id,
41 std::string entrypoint,
43 std::shared_ptr<fml::Mapping> code_mapping,
44 std::vector<impeller::ShaderStageIOSlot> inputs,
45 std::vector<impeller::ShaderStageBufferLayout> layouts,
46 std::unordered_map<std::string, UniformBinding> uniform_structs,
47 std::unordered_map<std::string, TextureBinding> uniform_textures,
48 std::vector<impeller::DescriptorSetLayout> descriptor_set_layouts) {
49 auto shader = fml::MakeRefCounted<Shader>();
50 shader->library_id_ = std::move(library_id);
51 shader->entrypoint_ = std::move(entrypoint);
52 shader->stage_ = stage;
53 shader->code_mapping_ = std::move(code_mapping);
54 shader->inputs_ = std::move(inputs);
55 shader->layouts_ = std::move(layouts);
56 shader->uniform_structs_ = std::move(uniform_structs);
57 shader->uniform_textures_ = std::move(uniform_textures);
58 shader->descriptor_set_layouts_ = std::move(descriptor_set_layouts);
59 return shader;
60}
61
62std::string Shader::GetScopedName() const {
64 impeller::ShaderKey::kScopeFlutterGPU, library_id_, entrypoint_);
65}
66
67std::shared_ptr<const impeller::ShaderFunction> Shader::GetFunctionFromLibrary(
68 impeller::ShaderLibrary& library) {
69 return library.GetFunction(GetScopedName(), stage_);
70}
71
73 auto& lib = *context.GetContext().GetShaderLibrary();
74 return GetFunctionFromLibrary(lib) != nullptr;
75}
76
78 if (IsRegistered(context)) {
79 return true; // Already registered.
80 }
81
82 auto& lib = *context.GetContext().GetShaderLibrary();
83
84 std::promise<bool> promise;
85 auto future = promise.get_future();
86 lib.RegisterFunction(
87 GetScopedName(), stage_, code_mapping_,
88 fml::MakeCopyable([promise = std::move(promise)](bool result) mutable {
89 promise.set_value(result);
90 }));
91 if (!future.get()) {
92 return false; // Registration failed.
93 }
94 return true;
95}
96
97std::shared_ptr<impeller::VertexDescriptor> Shader::CreateVertexDescriptor()
98 const {
99 auto vertex_descriptor = std::make_shared<impeller::VertexDescriptor>();
100 vertex_descriptor->SetStageInputs(inputs_, layouts_);
101 return vertex_descriptor;
102}
103
104const std::vector<impeller::ShaderStageIOSlot>& Shader::GetStageInputs() const {
105 return inputs_;
106}
107
108const std::vector<impeller::ShaderStageBufferLayout>&
110 return layouts_;
111}
112
114 return stage_;
115}
116
117const std::vector<impeller::DescriptorSetLayout>&
119 return descriptor_set_layouts_;
120}
121
123 const std::string& name) const {
124 auto uniform = uniform_structs_.find(name);
125 if (uniform == uniform_structs_.end()) {
126 return nullptr;
127 }
128 return &uniform->second;
129}
130
132 const std::string& name) const {
133 auto uniform = uniform_textures_.find(name);
134 if (uniform == uniform_textures_.end()) {
135 return nullptr;
136 }
137 return &uniform->second;
138}
139
140} // namespace gpu
141} // namespace flutter
142
143//----------------------------------------------------------------------------
144/// Exports
145///
146
148 flutter::gpu::Shader* wrapper,
149 Dart_Handle struct_name_handle) {
150 auto name = tonic::StdStringFromDart(struct_name_handle);
151 const auto* uniform = wrapper->GetUniformStruct(name);
152 if (uniform == nullptr) {
153 return -1;
154 }
155
156 return uniform->size_in_bytes;
157}
158
160 flutter::gpu::Shader* wrapper,
161 Dart_Handle struct_name_handle,
162 Dart_Handle member_name_handle) {
163 auto struct_name = tonic::StdStringFromDart(struct_name_handle);
164 const auto* uniform = wrapper->GetUniformStruct(struct_name);
165 if (uniform == nullptr) {
166 return -1;
167 }
168
169 auto member_name = tonic::StdStringFromDart(member_name_handle);
170 const auto* member = uniform->GetMemberMetadata(member_name);
171 if (member == nullptr) {
172 return -1;
173 }
174
175 return member->offset;
176}
impeller::Context & GetContext()
Definition context.cc:84
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:122
impeller::ShaderStage GetShaderStage() const
Definition shader.cc:113
bool IsRegistered(Context &context)
Definition shader.cc:72
bool RegisterSync(Context &context)
Definition shader.cc:77
const std::vector< impeller::ShaderStageIOSlot > & GetStageInputs() const
Definition shader.cc:104
std::shared_ptr< impeller::VertexDescriptor > CreateVertexDescriptor() const
Definition shader.cc:97
static fml::RefPtr< Shader > Make(std::string library_id, 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:39
const std::vector< impeller::ShaderStageBufferLayout > & GetStageBufferLayouts() const
Definition shader.cc:109
const std::vector< impeller::DescriptorSetLayout > & GetDescriptorSetLayouts() const
Definition shader.cc:118
const Shader::TextureBinding * GetUniformTexture(const std::string &name) const
Definition shader.cc:131
std::shared_ptr< const impeller::ShaderFunction > GetFunctionFromLibrary(impeller::ShaderLibrary &library)
Definition shader.cc:67
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:147
int InternalFlutterGpu_Shader_GetUniformMemberOffset(flutter::gpu::Shader *wrapper, Dart_Handle struct_name_handle, Dart_Handle member_name_handle)
Definition shader.cc:159
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:21
static constexpr std::string_view kScopeFlutterGPU
Scope tag for Flutter GPU user shader bundles.
Definition shader_key.h:59
static std::string MakeUserScopedName(std::string_view scope, std::string_view library_id, std::string_view entrypoint)
Definition shader_key.cc:19
std::vector< ShaderStructMemberMetadata > members