69 impeller::fb::shaderbundle::InputDataType input_type) {
71 case impeller::fb::shaderbundle::InputDataType::kBoolean:
73 case impeller::fb::shaderbundle::InputDataType::kSignedByte:
75 case impeller::fb::shaderbundle::InputDataType::kUnsignedByte:
77 case impeller::fb::shaderbundle::InputDataType::kSignedShort:
79 case impeller::fb::shaderbundle::InputDataType::kUnsignedShort:
81 case impeller::fb::shaderbundle::InputDataType::kSignedInt:
83 case impeller::fb::shaderbundle::InputDataType::kUnsignedInt:
85 case impeller::fb::shaderbundle::InputDataType::kSignedInt64:
87 case impeller::fb::shaderbundle::InputDataType::kUnsignedInt64:
89 case impeller::fb::shaderbundle::InputDataType::kFloat:
91 case impeller::fb::shaderbundle::InputDataType::kDouble:
97 impeller::fb::shaderbundle::UniformDataType uniform_type) {
98 switch (uniform_type) {
99 case impeller::fb::shaderbundle::UniformDataType::kBoolean:
101 case impeller::fb::shaderbundle::UniformDataType::kSignedByte:
103 case impeller::fb::shaderbundle::UniformDataType::kUnsignedByte:
105 case impeller::fb::shaderbundle::UniformDataType::kSignedShort:
107 case impeller::fb::shaderbundle::UniformDataType::kUnsignedShort:
109 case impeller::fb::shaderbundle::UniformDataType::kSignedInt:
111 case impeller::fb::shaderbundle::UniformDataType::kUnsignedInt:
113 case impeller::fb::shaderbundle::UniformDataType::kSignedInt64:
115 case impeller::fb::shaderbundle::UniformDataType::kUnsignedInt64:
117 case impeller::fb::shaderbundle::UniformDataType::kFloat:
119 case impeller::fb::shaderbundle::UniformDataType::kDouble:
121 case impeller::fb::shaderbundle::UniformDataType::kHalfFloat:
123 case impeller::fb::shaderbundle::UniformDataType::kSampledImage:
129 impeller::fb::shaderbundle::InputDataType input_type) {
130 switch (input_type) {
131 case impeller::fb::shaderbundle::InputDataType::kBoolean:
133 case impeller::fb::shaderbundle::InputDataType::kSignedByte:
135 case impeller::fb::shaderbundle::InputDataType::kUnsignedByte:
137 case impeller::fb::shaderbundle::InputDataType::kSignedShort:
139 case impeller::fb::shaderbundle::InputDataType::kUnsignedShort:
141 case impeller::fb::shaderbundle::InputDataType::kSignedInt:
143 case impeller::fb::shaderbundle::InputDataType::kUnsignedInt:
145 case impeller::fb::shaderbundle::InputDataType::kSignedInt64:
147 case impeller::fb::shaderbundle::InputDataType::kUnsignedInt64:
149 case impeller::fb::shaderbundle::InputDataType::kFloat:
151 case impeller::fb::shaderbundle::InputDataType::kDouble:
179 std::shared_ptr<fml::Mapping> payload) {
180 if (payload ==
nullptr || !payload->GetMapping()) {
183 if (!impeller::fb::shaderbundle::ShaderBundleBufferHasIdentifier(
184 payload->GetMapping())) {
188 impeller::fb::shaderbundle::GetShaderBundle(payload->GetMapping());
195 for (
const auto* bundled_shader : *bundle->shaders()) {
196 const impeller::fb::shaderbundle::BackendShader* backend_shader =
198 if (!backend_shader) {
200 << bundled_shader->name()->c_str() <<
"\" from bundle.";
204 auto code_mapping = std::make_shared<fml::NonOwnedMapping>(
205 backend_shader->shader()->data(),
206 backend_shader->shader()->size(),
207 [payload = payload](
auto,
auto) {}
210 std::unordered_map<std::string, Shader::UniformBinding> uniform_structs;
211 if (backend_shader->uniform_structs() !=
nullptr) {
212 for (
const auto& uniform : *backend_shader->uniform_structs()) {
213 std::vector<impeller::ShaderStructMemberMetadata> members;
214 if (uniform->fields() !=
nullptr) {
215 for (
const auto& struct_member : *uniform->fields()) {
218 .name = struct_member->name()->c_str(),
219 .offset =
static_cast<size_t>(struct_member->offset_in_bytes()),
221 static_cast<size_t>(struct_member->element_size_in_bytes()),
223 static_cast<size_t>(struct_member->total_size_in_bytes()),
225 struct_member->array_elements() != 0
226 ? std::optional<size_t>(std::nullopt)
227 :
static_cast<size_t>(struct_member->array_elements()),
235 .
name = uniform->name()->c_str(),
236 .ext_res_0 =
static_cast<size_t>(uniform->ext_res_0()),
237 .
set =
static_cast<size_t>(uniform->set()),
238 .binding =
static_cast<size_t>(uniform->binding()),
242 .
name = uniform->name()->c_str(),
245 .size_in_bytes =
static_cast<size_t>(uniform->size_in_bytes()),
250 std::unordered_map<std::string, impeller::SampledImageSlot>
252 if (backend_shader->uniform_textures() !=
nullptr) {
253 for (
const auto& uniform : *backend_shader->uniform_textures()) {
255 .
name = uniform->name()->c_str(),
256 .texture_index =
static_cast<size_t>(uniform->ext_res_0()),
257 .
set =
static_cast<size_t>(uniform->set()),
258 .binding =
static_cast<size_t>(uniform->binding()),
263 std::shared_ptr<impeller::VertexDescriptor> vertex_descriptor =
nullptr;
264 if (backend_shader->stage() ==
265 impeller::fb::shaderbundle::ShaderStage::kVertex) {
266 vertex_descriptor = std::make_shared<impeller::VertexDescriptor>();
267 auto inputs_fb = backend_shader->inputs();
269 std::vector<impeller::ShaderStageIOSlot> inputs;
270 inputs.reserve(inputs_fb->size());
271 size_t default_stride = 0;
272 for (
const auto& input : *inputs_fb) {
274 slot.
name = input->name()->c_str();
276 slot.
set = input->set();
277 slot.
binding = input->binding();
281 slot.
columns = input->columns();
282 slot.
offset = input->offset();
283 inputs.emplace_back(slot);
288 std::vector<impeller::ShaderStageBufferLayout> layouts = {
294 vertex_descriptor->SetStageInputs(inputs, layouts);
298 backend_shader->entrypoint()->str(),
299 ToShaderStage(backend_shader->stage()), std::move(code_mapping),
300 std::move(vertex_descriptor), std::move(uniform_structs),
301 std::move(uniform_textures));
302 shader_map[bundled_shader->name()->str()] = std::move(shader);
305 return fml::MakeRefCounted<flutter::gpu::ShaderLibrary>(
306 std::move(payload), std::move(shader_map));
static std::shared_ptr< impeller::Context > GetDefaultContext(std::optional< std::string > &out_error)
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)
const uint8_t uint32_t uint32_t GError ** error