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:
175 const std::shared_ptr<fml::Mapping>& payload,
176 const std::string& library_id) {
178 if (payload ==
nullptr || !payload->GetMapping()) {
181 if (!impeller::fb::shaderbundle::ShaderBundleBufferHasIdentifier(
182 payload->GetMapping())) {
186 impeller::fb::shaderbundle::GetShaderBundle(payload->GetMapping());
191 const auto version = bundle->format_version();
192 const auto expected =
static_cast<uint32_t
>(
193 impeller::fb::shaderbundle::ShaderBundleFormatVersion::kVersion);
194 if (version != expected) {
195 VALIDATION_LOG <<
"Unsupported shader bundle format version: " << version
196 <<
", expected: " << expected
197 <<
". This shader bundle was compiled with an incompatible "
198 "version of impellerc. Please rebuild the shader bundle "
199 "with the version of impellerc that ships with the "
200 "current Flutter SDK.";
204 for (
const auto* bundled_shader : *bundle->shaders()) {
205 const impeller::fb::shaderbundle::BackendShader* backend_shader =
207 if (!backend_shader) {
209 << bundled_shader->name()->c_str() <<
"\" from bundle.";
213 auto code_mapping = std::make_shared<fml::NonOwnedMapping>(
214 backend_shader->shader()->data(),
215 backend_shader->shader()->size(),
216 [payload = payload](
auto,
auto) {}
219 std::vector<impeller::DescriptorSetLayout> descriptor_set_layouts;
221 std::unordered_map<std::string, Shader::UniformBinding> uniform_structs;
222 if (backend_shader->uniform_structs() !=
nullptr) {
223 for (
const auto& uniform : *backend_shader->uniform_structs()) {
224 std::vector<impeller::ShaderStructMemberMetadata> members;
225 if (uniform->fields() !=
nullptr) {
226 for (
const auto& struct_member : *uniform->fields()) {
231 .name = struct_member->name()->c_str(),
232 .offset =
static_cast<size_t>(struct_member->offset_in_bytes()),
234 static_cast<size_t>(struct_member->element_size_in_bytes()),
236 static_cast<size_t>(struct_member->total_size_in_bytes()),
238 struct_member->array_elements() == 0
239 ? std::optional<size_t>(std::nullopt)
240 :
static_cast<size_t>(struct_member->array_elements()),
242 type,
static_cast<size_t>(struct_member->vec_size()),
243 static_cast<size_t>(struct_member->columns())),
251 .
name = uniform->name()->c_str(),
252 .ext_res_0 =
static_cast<size_t>(uniform->ext_res_0()),
253 .
set =
static_cast<size_t>(uniform->set()),
254 .binding =
static_cast<size_t>(uniform->binding()),
258 .
name = uniform->name()->c_str(),
261 .size_in_bytes =
static_cast<size_t>(uniform->size_in_bytes()),
265 static_cast<uint32_t
>(uniform->binding()),
272 std::unordered_map<std::string, Shader::TextureBinding> uniform_textures;
273 if (backend_shader->uniform_textures() !=
nullptr) {
274 for (
const auto& uniform : *backend_shader->uniform_textures()) {
277 .
name = uniform->name()->c_str(),
278 .texture_index =
static_cast<size_t>(uniform->ext_res_0()),
279 .
set =
static_cast<size_t>(uniform->set()),
280 .binding =
static_cast<size_t>(uniform->binding()),
283 .
name = uniform->name()->c_str(),
287 uniform_textures[uniform->name()->str()] = texture_binding;
290 static_cast<uint32_t
>(uniform->binding()),
297 std::vector<impeller::ShaderStageIOSlot> inputs;
298 std::vector<impeller::ShaderStageBufferLayout> layouts;
299 if (backend_shader->stage() ==
300 impeller::fb::shaderbundle::ShaderStage::kVertex) {
301 auto inputs_fb = backend_shader->inputs();
303 inputs.reserve(inputs_fb->size());
304 size_t default_stride = 0;
305 for (
const auto&
input : *inputs_fb) {
316 inputs.emplace_back(slot);
328 library_id, backend_shader->entrypoint()->str(),
329 ToShaderStage(backend_shader->stage()), std::move(code_mapping),
330 std::move(inputs), std::move(layouts), std::move(uniform_structs),
331 std::move(uniform_textures), std::move(descriptor_set_layouts));
332 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