Flutter Engine
The 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
5#include "flutter/lib/gpu/shader.h"
6
7#include <utility>
8
9#include "flutter/lib/gpu/formats.h"
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::shared_ptr<impeller::VertexDescriptor> vertex_desc,
43 std::unordered_map<std::string, UniformBinding> uniform_structs,
44 std::unordered_map<std::string, impeller::SampledImageSlot>
45 uniform_textures) {
46 auto shader = fml::MakeRefCounted<Shader>();
47 shader->entrypoint_ = std::move(entrypoint);
48 shader->stage_ = stage;
49 shader->code_mapping_ = std::move(code_mapping);
50 shader->vertex_desc_ = std::move(vertex_desc);
51 shader->uniform_structs_ = std::move(uniform_structs);
52 shader->uniform_textures_ = std::move(uniform_textures);
53 return shader;
54}
55
56std::shared_ptr<const impeller::ShaderFunction> Shader::GetFunctionFromLibrary(
57 impeller::ShaderLibrary& library) {
58 return library.GetFunction(entrypoint_, stage_);
59}
60
62 auto& lib = *context.GetContext()->GetShaderLibrary();
63 return GetFunctionFromLibrary(lib) != nullptr;
64}
65
67 if (IsRegistered(context)) {
68 return true; // Already registered.
69 }
70
71 auto& lib = *context.GetContext()->GetShaderLibrary();
72
73 std::promise<bool> promise;
74 auto future = promise.get_future();
75 lib.RegisterFunction(
76 entrypoint_, stage_, code_mapping_,
77 fml::MakeCopyable([promise = std::move(promise)](bool result) mutable {
78 promise.set_value(result);
79 }));
80 if (!future.get()) {
81 return false; // Registration failed.
82 }
83 return true;
84}
85
86std::shared_ptr<impeller::VertexDescriptor> Shader::GetVertexDescriptor()
87 const {
88 return vertex_desc_;
89}
90
92 return stage_;
93}
94
96 const std::string& name) const {
97 auto uniform = uniform_structs_.find(name);
98 if (uniform == uniform_structs_.end()) {
99 return nullptr;
100 }
101 return &uniform->second;
102}
103
105 const std::string& name) const {
106 auto uniform = uniform_textures_.find(name);
107 if (uniform == uniform_textures_.end()) {
108 return nullptr;
109 }
110 return &uniform->second;
111}
112
113} // namespace gpu
114} // namespace flutter
115
116//----------------------------------------------------------------------------
117/// Exports
118///
119
121 flutter::gpu::Shader* wrapper,
122 Dart_Handle struct_name_handle) {
123 auto name = tonic::StdStringFromDart(struct_name_handle);
124 const auto* uniform = wrapper->GetUniformStruct(name);
125 if (uniform == nullptr) {
126 return -1;
127 }
128
129 return uniform->size_in_bytes;
130}
131
133 flutter::gpu::Shader* wrapper,
134 Dart_Handle struct_name_handle,
135 Dart_Handle member_name_handle) {
136 auto struct_name = tonic::StdStringFromDart(struct_name_handle);
137 const auto* uniform = wrapper->GetUniformStruct(struct_name);
138 if (uniform == nullptr) {
139 return -1;
140 }
141
142 auto member_name = tonic::StdStringFromDart(member_name_handle);
143 const auto* member = uniform->GetMemberMetadata(member_name);
144 if (member == nullptr) {
145 return -1;
146 }
147
148 return member->offset;
149}
std::shared_ptr< impeller::Context > GetContext()
Definition context.cc:65
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:95
impeller::ShaderStage GetShaderStage() const
Definition shader.cc:91
bool IsRegistered(Context &context)
Definition shader.cc:61
bool RegisterSync(Context &context)
Definition shader.cc:66
std::shared_ptr< impeller::VertexDescriptor > GetVertexDescriptor() const
Definition shader.cc:86
const impeller::SampledImageSlot * GetUniformTexture(const std::string &name) const
Definition shader.cc:104
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)
Definition shader.cc:38
std::shared_ptr< const impeller::ShaderFunction > GetFunctionFromLibrary(impeller::ShaderLibrary &library)
Definition shader.cc:56
virtual std::shared_ptr< const ShaderFunction > GetFunction(std::string_view name, ShaderStage stage)=0
struct _Dart_Handle * Dart_Handle
Definition dart_api.h:258
#define IMPLEMENT_WRAPPERTYPEINFO(LibraryName, ClassName)
GAsyncResult * result
int InternalFlutterGpu_Shader_GetUniformStructSize(flutter::gpu::Shader *wrapper, Dart_Handle struct_name_handle)
Definition shader.cc:120
int InternalFlutterGpu_Shader_GetUniformMemberOffset(flutter::gpu::Shader *wrapper, Dart_Handle struct_name_handle, Dart_Handle member_name_handle)
Definition shader.cc:132
DEF_SWITCHES_START aot vmservice shared library name
Definition switches.h:32
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
Metadata required to bind a combined texture and sampler.
std::vector< ShaderStructMemberMetadata > members