96 impeller::fb::shaderbundle::UniformDataType uniform_type) {
97 switch (uniform_type) {
98 case impeller::fb::shaderbundle::UniformDataType::kBoolean:
100 case impeller::fb::shaderbundle::UniformDataType::kSignedByte:
102 case impeller::fb::shaderbundle::UniformDataType::kUnsignedByte:
104 case impeller::fb::shaderbundle::UniformDataType::kSignedShort:
106 case impeller::fb::shaderbundle::UniformDataType::kUnsignedShort:
108 case impeller::fb::shaderbundle::UniformDataType::kSignedInt:
110 case impeller::fb::shaderbundle::UniformDataType::kUnsignedInt:
112 case impeller::fb::shaderbundle::UniformDataType::kSignedInt64:
114 case impeller::fb::shaderbundle::UniformDataType::kUnsignedInt64:
116 case impeller::fb::shaderbundle::UniformDataType::kFloat:
118 case impeller::fb::shaderbundle::UniformDataType::kDouble:
120 case impeller::fb::shaderbundle::UniformDataType::kHalfFloat:
122 case impeller::fb::shaderbundle::UniformDataType::kSampledImage:
128 impeller::fb::shaderbundle::InputDataType input_type) {
129 switch (input_type) {
130 case impeller::fb::shaderbundle::InputDataType::kBoolean:
132 case impeller::fb::shaderbundle::InputDataType::kSignedByte:
134 case impeller::fb::shaderbundle::InputDataType::kUnsignedByte:
136 case impeller::fb::shaderbundle::InputDataType::kSignedShort:
138 case impeller::fb::shaderbundle::InputDataType::kUnsignedShort:
140 case impeller::fb::shaderbundle::InputDataType::kSignedInt:
142 case impeller::fb::shaderbundle::InputDataType::kUnsignedInt:
144 case impeller::fb::shaderbundle::InputDataType::kSignedInt64:
146 case impeller::fb::shaderbundle::InputDataType::kUnsignedInt64:
148 case impeller::fb::shaderbundle::InputDataType::kFloat:
150 case impeller::fb::shaderbundle::InputDataType::kDouble:
174 std::shared_ptr<fml::Mapping> payload) {
175 if (payload ==
nullptr || !payload->GetMapping()) {
178 if (!impeller::fb::shaderbundle::ShaderBundleBufferHasIdentifier(
179 payload->GetMapping())) {
183 impeller::fb::shaderbundle::GetShaderBundle(payload->GetMapping());
188 const auto version = bundle->format_version();
189 const auto expected =
static_cast<uint32_t
>(
190 impeller::fb::shaderbundle::ShaderBundleFormatVersion::kVersion);
191 if (version != expected) {
192 VALIDATION_LOG <<
"Unsupported shader bundle format version: " << version
193 <<
", expected: " << expected;
199 for (
const auto* bundled_shader : *bundle->shaders()) {
200 const impeller::fb::shaderbundle::BackendShader* backend_shader =
202 if (!backend_shader) {
204 << bundled_shader->name()->c_str() <<
"\" from bundle.";
208 auto code_mapping = std::make_shared<fml::NonOwnedMapping>(
209 backend_shader->shader()->data(),
210 backend_shader->shader()->size(),
211 [payload = payload](
auto,
auto) {}
214 std::vector<impeller::DescriptorSetLayout> descriptor_set_layouts;
216 std::unordered_map<std::string, Shader::UniformBinding> uniform_structs;
217 if (backend_shader->uniform_structs() !=
nullptr) {
218 for (
const auto& uniform : *backend_shader->uniform_structs()) {
219 std::vector<impeller::ShaderStructMemberMetadata> members;
220 if (uniform->fields() !=
nullptr) {
221 for (
const auto& struct_member : *uniform->fields()) {
224 .name = struct_member->name()->c_str(),
225 .offset =
static_cast<size_t>(struct_member->offset_in_bytes()),
227 static_cast<size_t>(struct_member->element_size_in_bytes()),
229 static_cast<size_t>(struct_member->total_size_in_bytes()),
231 struct_member->array_elements() == 0
232 ? std::optional<size_t>(std::nullopt)
233 :
static_cast<size_t>(struct_member->array_elements()),
241 .
name = uniform->name()->c_str(),
242 .ext_res_0 =
static_cast<size_t>(uniform->ext_res_0()),
243 .
set =
static_cast<size_t>(uniform->set()),
244 .binding =
static_cast<size_t>(uniform->binding()),
248 .
name = uniform->name()->c_str(),
251 .size_in_bytes =
static_cast<size_t>(uniform->size_in_bytes()),
255 static_cast<uint32_t
>(uniform->binding()),
262 std::unordered_map<std::string, Shader::TextureBinding> uniform_textures;
263 if (backend_shader->uniform_textures() !=
nullptr) {
264 for (
const auto& uniform : *backend_shader->uniform_textures()) {
267 .
name = uniform->name()->c_str(),
268 .texture_index =
static_cast<size_t>(uniform->ext_res_0()),
269 .
set =
static_cast<size_t>(uniform->set()),
270 .binding =
static_cast<size_t>(uniform->binding()),
273 .
name = uniform->name()->c_str(),
277 uniform_textures[uniform->name()->str()] = texture_binding;
280 static_cast<uint32_t
>(uniform->binding()),
287 std::vector<impeller::ShaderStageIOSlot> inputs;
288 std::vector<impeller::ShaderStageBufferLayout> layouts;
289 if (backend_shader->stage() ==
290 impeller::fb::shaderbundle::ShaderStage::kVertex) {
291 auto inputs_fb = backend_shader->inputs();
293 inputs.reserve(inputs_fb->size());
294 size_t default_stride = 0;
295 for (
const auto&
input : *inputs_fb) {
306 inputs.emplace_back(slot);
318 backend_shader->entrypoint()->str(),
319 ToShaderStage(backend_shader->stage()), std::move(code_mapping),
320 std::move(inputs), std::move(layouts), std::move(uniform_structs),
321 std::move(uniform_textures), std::move(descriptor_set_layouts));
322 shader_map[bundled_shader->name()->str()] = std::move(shader);
325 return fml::MakeRefCounted<flutter::gpu::ShaderLibrary>(
326 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::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