18#include "impeller/runtime_stage/runtime_stage_flatbuffers.h"
19#include "runtime_stage_types_flatbuffers.h"
29std::string MakeFallbackLibraryId() {
30 static std::atomic<uint64_t> counter{0};
32 std::to_string(counter.fetch_add(1, std::memory_order_relaxed));
38 case fb::UniformDataType::kFloat:
40 case fb::UniformDataType::kSampledImage:
42 case fb::UniformDataType::kStruct:
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()) {
105 case fb::PaddingType::kPadding:
108 case fb::PaddingType::kFloat:
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),
166std::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 auto raw_stages = fb::GetRuntimeStages(payload->GetMapping());
188 return absl::InvalidArgumentError(
"Failed to get runtime stages.");
191 const uint32_t version = raw_stages->format_version();
192 const auto expected =
193 static_cast<uint32_t
>(fb::RuntimeStagesFormatVersion::kVersion);
194 if (version != expected) {
195 std::stringstream stream;
196 stream <<
"Unsupported runtime stages format version. Expected " << expected
197 <<
", got " << version <<
".";
198 return absl::InvalidArgumentError(stream.str());
203 RuntimeStageIfPresent(raw_stages->sksl(), payload)},
205 RuntimeStageIfPresent(raw_stages->metal(), payload)},
207 RuntimeStageIfPresent(raw_stages->opengles(), payload)},
209 RuntimeStageIfPresent(raw_stages->opengles3(), payload)},
211 RuntimeStageIfPresent(raw_stages->vulkan(), payload)},
216 : payload_(
std::move(payload)) {}
223 return code_mapping_;
232 const std::string&
name)
const {
233 for (
const auto& uniform : uniforms_) {
234 if (uniform.name ==
name) {
258 library_id_ = std::move(library_id);
267 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
#define FML_UNREACHABLE()
constexpr ShaderStage ToShaderStage(RuntimeShaderStage stage)
static RuntimeUniformType ToType(fb::UniformDataType type)
impeller::ShaderType type