100 impeller::fb::shaderbundle::UniformDataType uniform_type) {
101 switch (uniform_type) {
102 case impeller::fb::shaderbundle::UniformDataType::kBoolean:
104 case impeller::fb::shaderbundle::UniformDataType::kSignedByte:
106 case impeller::fb::shaderbundle::UniformDataType::kUnsignedByte:
108 case impeller::fb::shaderbundle::UniformDataType::kSignedShort:
110 case impeller::fb::shaderbundle::UniformDataType::kUnsignedShort:
112 case impeller::fb::shaderbundle::UniformDataType::kSignedInt:
114 case impeller::fb::shaderbundle::UniformDataType::kUnsignedInt:
116 case impeller::fb::shaderbundle::UniformDataType::kSignedInt64:
118 case impeller::fb::shaderbundle::UniformDataType::kUnsignedInt64:
120 case impeller::fb::shaderbundle::UniformDataType::kFloat:
122 case impeller::fb::shaderbundle::UniformDataType::kDouble:
124 case impeller::fb::shaderbundle::UniformDataType::kHalfFloat:
126 case impeller::fb::shaderbundle::UniformDataType::kSampledImage:
132 impeller::fb::shaderbundle::InputDataType input_type) {
133 switch (input_type) {
134 case impeller::fb::shaderbundle::InputDataType::kBoolean:
136 case impeller::fb::shaderbundle::InputDataType::kSignedByte:
138 case impeller::fb::shaderbundle::InputDataType::kUnsignedByte:
140 case impeller::fb::shaderbundle::InputDataType::kSignedShort:
142 case impeller::fb::shaderbundle::InputDataType::kUnsignedShort:
144 case impeller::fb::shaderbundle::InputDataType::kSignedInt:
146 case impeller::fb::shaderbundle::InputDataType::kUnsignedInt:
148 case impeller::fb::shaderbundle::InputDataType::kSignedInt64:
150 case impeller::fb::shaderbundle::InputDataType::kUnsignedInt64:
152 case impeller::fb::shaderbundle::InputDataType::kFloat:
154 case impeller::fb::shaderbundle::InputDataType::kDouble:
178 const std::shared_ptr<fml::Mapping>& payload,
179 const std::string& library_id) {
181 if (payload ==
nullptr || !payload->GetMapping()) {
188 if (payload->GetSize() <
189 sizeof(flatbuffers::uoffset_t) + flatbuffers::kFileIdentifierLength) {
192 if (!impeller::fb::shaderbundle::ShaderBundleBufferHasIdentifier(
193 payload->GetMapping())) {
200 flatbuffers::Verifier verifier(
201 reinterpret_cast<const uint8_t*
>(payload->GetMapping()),
203 if (!impeller::fb::shaderbundle::VerifyShaderBundleBuffer(verifier)) {
207 impeller::fb::shaderbundle::GetShaderBundle(payload->GetMapping());
212 const auto version = bundle->format_version();
213 const auto expected =
static_cast<uint32_t
>(
214 impeller::fb::shaderbundle::ShaderBundleFormatVersion::kVersion);
215 if (version != expected) {
216 VALIDATION_LOG <<
"Unsupported shader bundle format version: " << version
217 <<
", expected: " << expected
218 <<
". This shader bundle was compiled with an incompatible "
219 "version of impellerc. Please rebuild the shader bundle "
220 "with the version of impellerc that ships with the "
221 "current Flutter SDK.";
225 for (
const auto* bundled_shader : *bundle->shaders()) {
226 const impeller::fb::shaderbundle::BackendShader* backend_shader =
228 if (!backend_shader) {
230 << bundled_shader->name()->c_str() <<
"\" from bundle.";
234 auto code_mapping = std::make_shared<fml::NonOwnedMapping>(
235 backend_shader->shader()->data(),
236 backend_shader->shader()->size(),
237 [payload = payload](
auto,
auto) {}
240 std::vector<impeller::DescriptorSetLayout> descriptor_set_layouts;
242 std::unordered_map<std::string, Shader::UniformBinding> uniform_structs;
243 if (backend_shader->uniform_structs() !=
nullptr) {
244 for (
const auto& uniform : *backend_shader->uniform_structs()) {
245 std::vector<impeller::ShaderStructMemberMetadata> members;
246 if (uniform->fields() !=
nullptr) {
247 for (
const auto& struct_member : *uniform->fields()) {
252 .name = struct_member->name()->c_str(),
253 .offset =
static_cast<size_t>(struct_member->offset_in_bytes()),
255 static_cast<size_t>(struct_member->element_size_in_bytes()),
257 static_cast<size_t>(struct_member->total_size_in_bytes()),
259 struct_member->array_elements() == 0
260 ? std::optional<size_t>(std::nullopt)
261 :
static_cast<size_t>(struct_member->array_elements()),
263 type,
static_cast<size_t>(struct_member->vec_size()),
264 static_cast<size_t>(struct_member->columns())),
272 .
name = uniform->name()->c_str(),
273 .ext_res_0 =
static_cast<size_t>(uniform->ext_res_0()),
274 .
set =
static_cast<size_t>(uniform->set()),
275 .binding =
static_cast<size_t>(uniform->binding()),
279 .
name = uniform->name()->c_str(),
282 .size_in_bytes =
static_cast<size_t>(uniform->size_in_bytes()),
286 static_cast<uint32_t
>(uniform->binding()),
293 std::unordered_map<std::string, Shader::TextureBinding> uniform_textures;
294 if (backend_shader->uniform_textures() !=
nullptr) {
295 for (
const auto& uniform : *backend_shader->uniform_textures()) {
298 .
name = uniform->name()->c_str(),
299 .texture_index =
static_cast<size_t>(uniform->ext_res_0()),
300 .
set =
static_cast<size_t>(uniform->set()),
301 .binding =
static_cast<size_t>(uniform->binding()),
304 .
name = uniform->name()->c_str(),
308 uniform_textures[uniform->name()->str()] = texture_binding;
311 static_cast<uint32_t
>(uniform->binding()),
318 std::vector<impeller::ShaderStageIOSlot> inputs;
319 std::vector<impeller::ShaderStageBufferLayout> layouts;
320 if (backend_shader->stage() ==
321 impeller::fb::shaderbundle::ShaderStage::kVertex) {
322 auto inputs_fb = backend_shader->inputs();
324 inputs.reserve(inputs_fb->size());
325 size_t default_stride = 0;
326 for (
const auto&
input : *inputs_fb) {
337 inputs.emplace_back(slot);
349 library_id, backend_shader->entrypoint()->str(),
350 ToShaderStage(backend_shader->stage()), std::move(code_mapping),
351 std::move(inputs), std::move(layouts), std::move(uniform_structs),
352 std::move(uniform_textures), std::move(descriptor_set_layouts));
353 shader_map[bundled_shader->name()->str()] = std::move(shader);
static std::shared_ptr< impeller::Context > GetDefaultContext(std::optional< std::string > &out_error)
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)
const uint8_t uint32_t uint32_t GError ** error