52 const fb::RuntimeStage* runtime_stage,
53 const std::shared_ptr<fml::Mapping>& payload) {
55 return absl::InvalidArgumentError(
"Runtime stage is null.");
60 stage.entrypoint_ = runtime_stage->entrypoint()->str();
62 auto* uniforms = runtime_stage->uniforms();
68 std::optional<size_t> ubo_id;
70 for (
auto i = uniforms->begin(),
end = uniforms->end();
i !=
end;
i++) {
72 desc.
name =
i->name()->str();
81 static_cast<size_t>(
i->rows()),
static_cast<size_t>(
i->columns())};
84 if (
i->padding_layout()) {
85 for (
const auto& byte_type : *
i->padding_layout()) {
88 case fb::PaddingType::kPadding:
91 case fb::PaddingType::kFloat:
98 if (
i->struct_fields()) {
99 for (
const auto& elem : *
i->struct_fields()) {
102 .byte_size =
static_cast<size_t>(elem->byte_size())});
106 stage.uniforms_.push_back(std::move(desc));
110 stage.code_mapping_ = std::make_shared<fml::NonOwnedMapping>(
111 runtime_stage->shader()->data(),
112 runtime_stage->shader()->size(),
113 [payload = stage.payload_](
auto,
auto) {}
117 if (ubo_id.has_value() && ubo_id.value() == binding) {
120 for (
auto& uniform : stage.uniforms_) {
122 uniform.binding = binding;
124 if (ubo_id.has_value() && ubo_id.value() == binding) {
133 static_cast<uint32_t
>(uniform.location),
139 static_cast<uint32_t
>(uniform.binding),
160 const std::shared_ptr<fml::Mapping>& payload) {
161 if (payload ==
nullptr || !payload->GetMapping()) {
162 return absl::InvalidArgumentError(
"Payload is null or empty.");
164 if (!fb::RuntimeStagesBufferHasIdentifier(payload->GetMapping())) {
165 return absl::InvalidArgumentError(
166 "Payload does not have valid identifier.");
169 auto raw_stages = fb::GetRuntimeStages(payload->GetMapping());
171 return absl::InvalidArgumentError(
"Failed to get runtime stages.");
174 const uint32_t version = raw_stages->format_version();
175 const auto expected =
176 static_cast<uint32_t
>(fb::RuntimeStagesFormatVersion::kVersion);
177 if (version != expected) {
178 std::stringstream stream;
179 stream <<
"Unsupported runtime stages format version. Expected " << expected
180 <<
", got " << version <<
".";
181 return absl::InvalidArgumentError(stream.str());
186 RuntimeStageIfPresent(raw_stages->sksl(), payload)},
188 RuntimeStageIfPresent(raw_stages->metal(), payload)},
190 RuntimeStageIfPresent(raw_stages->opengles(), payload)},
192 RuntimeStageIfPresent(raw_stages->opengles3(), payload)},
194 RuntimeStageIfPresent(raw_stages->vulkan(), payload)},