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 std::shared_ptr<fml::Mapping> payload,
176 std::string library_id) {
177 if (payload ==
nullptr || !payload->GetMapping()) {
180 if (library_id.empty()) {
183 if (!impeller::fb::shaderbundle::ShaderBundleBufferHasIdentifier(
184 payload->GetMapping())) {
188 impeller::fb::shaderbundle::GetShaderBundle(payload->GetMapping());
193 const auto version = bundle->format_version();
194 const auto expected =
static_cast<uint32_t
>(
195 impeller::fb::shaderbundle::ShaderBundleFormatVersion::kVersion);
196 if (version != expected) {
197 VALIDATION_LOG <<
"Unsupported shader bundle format version: " << version
198 <<
", expected: " << expected
199 <<
". This shader bundle was compiled with an incompatible "
200 "version of impellerc. Please rebuild the shader bundle "
201 "with the version of impellerc that ships with the "
202 "current Flutter SDK.";
208 for (
const auto* bundled_shader : *bundle->shaders()) {
209 const impeller::fb::shaderbundle::BackendShader* backend_shader =
211 if (!backend_shader) {
213 << bundled_shader->name()->c_str() <<
"\" from bundle.";
217 auto code_mapping = std::make_shared<fml::NonOwnedMapping>(
218 backend_shader->shader()->data(),
219 backend_shader->shader()->size(),
220 [payload = payload](
auto,
auto) {}
223 std::vector<impeller::DescriptorSetLayout> descriptor_set_layouts;
225 std::unordered_map<std::string, Shader::UniformBinding> uniform_structs;
226 if (backend_shader->uniform_structs() !=
nullptr) {
227 for (
const auto& uniform : *backend_shader->uniform_structs()) {
228 std::vector<impeller::ShaderStructMemberMetadata> members;
229 if (uniform->fields() !=
nullptr) {
230 for (
const auto& struct_member : *uniform->fields()) {
235 .name = struct_member->name()->c_str(),
236 .offset =
static_cast<size_t>(struct_member->offset_in_bytes()),
238 static_cast<size_t>(struct_member->element_size_in_bytes()),
240 static_cast<size_t>(struct_member->total_size_in_bytes()),
242 struct_member->array_elements() == 0
243 ? std::optional<size_t>(std::nullopt)
244 :
static_cast<size_t>(struct_member->array_elements()),
246 type,
static_cast<size_t>(struct_member->vec_size()),
247 static_cast<size_t>(struct_member->columns())),
255 .
name = uniform->name()->c_str(),
256 .ext_res_0 =
static_cast<size_t>(uniform->ext_res_0()),
257 .
set =
static_cast<size_t>(uniform->set()),
258 .binding =
static_cast<size_t>(uniform->binding()),
262 .
name = uniform->name()->c_str(),
265 .size_in_bytes =
static_cast<size_t>(uniform->size_in_bytes()),
269 static_cast<uint32_t
>(uniform->binding()),
276 std::unordered_map<std::string, Shader::TextureBinding> uniform_textures;
277 if (backend_shader->uniform_textures() !=
nullptr) {
278 for (
const auto& uniform : *backend_shader->uniform_textures()) {
281 .
name = uniform->name()->c_str(),
282 .texture_index =
static_cast<size_t>(uniform->ext_res_0()),
283 .
set =
static_cast<size_t>(uniform->set()),
284 .binding =
static_cast<size_t>(uniform->binding()),
287 .
name = uniform->name()->c_str(),
291 uniform_textures[uniform->name()->str()] = texture_binding;
294 static_cast<uint32_t
>(uniform->binding()),
301 std::vector<impeller::ShaderStageIOSlot> inputs;
302 std::vector<impeller::ShaderStageBufferLayout> layouts;
303 if (backend_shader->stage() ==
304 impeller::fb::shaderbundle::ShaderStage::kVertex) {
305 auto inputs_fb = backend_shader->inputs();
307 inputs.reserve(inputs_fb->size());
308 size_t default_stride = 0;
309 for (
const auto&
input : *inputs_fb) {
320 inputs.emplace_back(slot);
332 library_id, backend_shader->entrypoint()->str(),
333 ToShaderStage(backend_shader->stage()), std::move(code_mapping),
334 std::move(inputs), std::move(layouts), std::move(uniform_structs),
335 std::move(uniform_textures), std::move(descriptor_set_layouts));
336 shader_map[bundled_shader->name()->str()] = std::move(shader);
339 return fml::MakeRefCounted<flutter::gpu::ShaderLibrary>(
340 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 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