14 #include "fml/mapping.h"
18 #include "impeller/runtime_stage/runtime_stage_flatbuffers.h"
19 #include "runtime_stage_types_flatbuffers.h"
29 std::string MakeFallbackLibraryId() {
30 static std::atomic<uint64_t> counter{0};
32 std::to_string(counter.fetch_add(1, std::memory_order_relaxed));
50 case fb::Stage::kVertex:
52 case fb::Stage::kFragment:
54 case fb::Stage::kCompute:
65 "_RESERVED_IDENTIFIER_FIXUP_gl_DefaultUniformBlock";
68 const fb::RuntimeStage* runtime_stage,
69 const std::shared_ptr<fml::Mapping>& payload) {
71 return absl::InvalidArgumentError(
"Runtime stage is null.");
76 stage.entrypoint_ = runtime_stage->entrypoint()->str();
77 stage.library_id_ = MakeFallbackLibraryId();
79 auto* uniforms = runtime_stage->uniforms();
85 std::optional<size_t> ubo_id;
87 for (
auto i = uniforms->begin(),
end = uniforms->end(); i !=
end; i++) {
89 desc.
name = i->name()->str();
98 static_cast<size_t>(i->rows()),
static_cast<size_t>(i->columns())};
101 if (i->padding_layout()) {
102 for (
const auto& byte_type : *i->padding_layout()) {
115 if (i->struct_fields()) {
116 for (
const auto& elem : *i->struct_fields()) {
119 .byte_size =
static_cast<size_t>(elem->byte_size())});
123 stage.uniforms_.push_back(std::move(desc));
127 stage.code_mapping_ = std::make_shared<fml::NonOwnedMapping>(
128 runtime_stage->shader()->data(),
129 runtime_stage->shader()->size(),
130 [payload = stage.payload_](
auto,
auto) {}
134 if (ubo_id.has_value() && ubo_id.value() == binding) {
137 for (
auto& uniform : stage.uniforms_) {
139 uniform.binding = binding;
141 if (ubo_id.has_value() && ubo_id.value() == binding) {
150 static_cast<uint32_t
>(uniform.location),
156 static_cast<uint32_t
>(uniform.binding),
166 std::unique_ptr<RuntimeStage> RuntimeStage::RuntimeStageIfPresent(
167 const fb::RuntimeStage* runtime_stage,
168 const std::shared_ptr<fml::Mapping>& payload) {
169 auto stage =
Create(runtime_stage, payload);
173 return std::make_unique<RuntimeStage>(std::move(*stage));
177 const std::shared_ptr<fml::Mapping>& payload) {
178 if (payload ==
nullptr || !payload->GetMapping()) {
179 return absl::InvalidArgumentError(
"Payload is null or empty.");
181 if (!fb::RuntimeStagesBufferHasIdentifier(payload->GetMapping())) {
182 return absl::InvalidArgumentError(
183 "Payload does not have valid identifier.");
186 flatbuffers::Verifier verifier(payload->GetMapping(), payload->GetSize());
187 if (!fb::VerifyRuntimeStagesBuffer(verifier)) {
188 return absl::InvalidArgumentError(
189 "Runtime stages buffer failed verification.");
192 auto raw_stages = fb::GetRuntimeStages(payload->GetMapping());
194 return absl::InvalidArgumentError(
"Failed to get runtime stages.");
197 const uint32_t version = raw_stages->format_version();
198 const auto expected =
199 static_cast<uint32_t
>(fb::RuntimeStagesFormatVersion::kVersion);
200 if (version != expected) {
201 std::stringstream stream;
202 stream <<
"Unsupported runtime stages format version. Expected " << expected
203 <<
", got " << version <<
".";
204 return absl::InvalidArgumentError(stream.str());
209 RuntimeStageIfPresent(raw_stages->sksl(), payload)},
211 RuntimeStageIfPresent(raw_stages->metal(), payload)},
213 RuntimeStageIfPresent(raw_stages->opengles(), payload)},
215 RuntimeStageIfPresent(raw_stages->opengles3(), payload)},
217 RuntimeStageIfPresent(raw_stages->vulkan(), payload)},
222 : payload_(
std::move(payload)) {}
229 return code_mapping_;
238 const std::string& name)
const {
239 for (
const auto& uniform : uniforms_) {
240 if (uniform.name == name) {
264 library_id_ = std::move(library_id);
273 return descriptor_set_layouts_;
RuntimeStage(RuntimeStage &&)
const std::string & GetEntrypoint() const
const std::string & GetLibraryId() const
RuntimeStage & operator=(RuntimeStage &&)
static absl::StatusOr< RuntimeStage > Create(const fb::RuntimeStage *runtime_stage, const std::shared_ptr< fml::Mapping > &payload)
const std::vector< RuntimeUniformDescription > & GetUniforms() const
void SetLibraryId(std::string library_id)
const RuntimeUniformDescription * GetUniform(const std::string &name) const
std::map< RuntimeStageBackend, std::shared_ptr< RuntimeStage > > Map
static const char * kVulkanUBOName
const std::shared_ptr< fml::Mapping > & GetCodeMapping() const
const std::vector< DescriptorSetLayout > & GetDescriptorSetLayouts() const
static absl::StatusOr< Map > DecodeRuntimeStages(const std::shared_ptr< fml::Mapping > &payload)
RuntimeShaderStage GetShaderStage() const
constexpr ShaderStage ToShaderStage(RuntimeShaderStage stage)
static RuntimeUniformType ToType(fb::UniformDataType type)