62 spirv_cross::SPIRType::BaseType
type) {
64 case spirv_cross::SPIRType::Float:
65 return fb::UniformDataType::kFloat;
66 case spirv_cross::SPIRType::SampledImage:
67 return fb::UniformDataType::kSampledImage;
68 case spirv_cross::SPIRType::Struct:
69 return fb::UniformDataType::kStruct;
70 case spirv_cross::SPIRType::Boolean:
71 case spirv_cross::SPIRType::SByte:
72 case spirv_cross::SPIRType::UByte:
73 case spirv_cross::SPIRType::Short:
74 case spirv_cross::SPIRType::UShort:
75 case spirv_cross::SPIRType::Int:
76 case spirv_cross::SPIRType::UInt:
77 case spirv_cross::SPIRType::Int64:
78 case spirv_cross::SPIRType::UInt64:
79 case spirv_cross::SPIRType::Half:
80 case spirv_cross::SPIRType::Double:
81 case spirv_cross::SPIRType::AccelerationStructure:
82 case spirv_cross::SPIRType::AtomicCounter:
83 case spirv_cross::SPIRType::Char:
84 case spirv_cross::SPIRType::ControlPointArray:
85 case spirv_cross::SPIRType::Image:
86 case spirv_cross::SPIRType::Interpolant:
87 case spirv_cross::SPIRType::RayQuery:
88 case spirv_cross::SPIRType::Sampler:
89 case spirv_cross::SPIRType::Unknown:
90 case spirv_cross::SPIRType::Void:
96 spirv_cross::SPIRType::BaseType
type) {
98 case spirv_cross::SPIRType::Boolean:
99 return fb::InputDataType::kBoolean;
100 case spirv_cross::SPIRType::SByte:
101 return fb::InputDataType::kSignedByte;
102 case spirv_cross::SPIRType::UByte:
103 return fb::InputDataType::kUnsignedByte;
104 case spirv_cross::SPIRType::Short:
105 return fb::InputDataType::kSignedShort;
106 case spirv_cross::SPIRType::UShort:
107 return fb::InputDataType::kUnsignedShort;
108 case spirv_cross::SPIRType::Int:
109 return fb::InputDataType::kSignedInt;
110 case spirv_cross::SPIRType::UInt:
111 return fb::InputDataType::kUnsignedInt;
112 case spirv_cross::SPIRType::Int64:
113 return fb::InputDataType::kSignedInt64;
114 case spirv_cross::SPIRType::UInt64:
115 return fb::InputDataType::kUnsignedInt64;
116 case spirv_cross::SPIRType::Float:
117 return fb::InputDataType::kFloat;
118 case spirv_cross::SPIRType::Double:
119 return fb::InputDataType::kDouble;
120 case spirv_cross::SPIRType::Unknown:
121 case spirv_cross::SPIRType::Void:
122 case spirv_cross::SPIRType::Half:
123 case spirv_cross::SPIRType::AtomicCounter:
124 case spirv_cross::SPIRType::Struct:
125 case spirv_cross::SPIRType::Image:
126 case spirv_cross::SPIRType::SampledImage:
127 case spirv_cross::SPIRType::Sampler:
128 case spirv_cross::SPIRType::AccelerationStructure:
129 case spirv_cross::SPIRType::RayQuery:
130 case spirv_cross::SPIRType::ControlPointArray:
131 case spirv_cross::SPIRType::Interpolant:
132 case spirv_cross::SPIRType::Char:
139 spirv_cross::SPIRType::BaseType
type) {
141 case spirv_cross::SPIRType::Boolean:
143 case spirv_cross::SPIRType::SByte:
145 case spirv_cross::SPIRType::UByte:
147 case spirv_cross::SPIRType::Short:
149 case spirv_cross::SPIRType::UShort:
151 case spirv_cross::SPIRType::Int:
153 case spirv_cross::SPIRType::UInt:
155 case spirv_cross::SPIRType::Int64:
157 case spirv_cross::SPIRType::UInt64:
159 case spirv_cross::SPIRType::Half:
161 case spirv_cross::SPIRType::Float:
163 case spirv_cross::SPIRType::Double:
165 case spirv_cross::SPIRType::SampledImage:
167 case spirv_cross::SPIRType::Struct:
169 case spirv_cross::SPIRType::AccelerationStructure:
170 case spirv_cross::SPIRType::AtomicCounter:
171 case spirv_cross::SPIRType::Char:
172 case spirv_cross::SPIRType::ControlPointArray:
173 case spirv_cross::SPIRType::Image:
174 case spirv_cross::SPIRType::Interpolant:
175 case spirv_cross::SPIRType::RayQuery:
176 case spirv_cross::SPIRType::Sampler:
177 case spirv_cross::SPIRType::Unknown:
178 case spirv_cross::SPIRType::Void:
239 static_cast<uint32_t
>(fb::RuntimeStagesFormatVersion::kVersion);
240 for (
const auto& kvp : data_) {
241 nlohmann::json platform_object;
244 if (!stage.has_value()) {
248 platform_object[
kStageKey] =
static_cast<uint32_t
>(stage.value());
251 if (kvp.second->shader->GetSize() > 0u) {
253 reinterpret_cast<const char*
>(kvp.second->shader->GetMapping()),
254 kvp.second->shader->GetSize());
258 auto& uniforms = platform_object[
kUniformsKey] = nlohmann::json::array_t{};
259 for (
const auto& uniform : kvp.second->uniforms) {
260 nlohmann::json uniform_object;
267 if (!uniform_type.has_value()) {
275 uniform.array_elements.value_or(0);
277 uniforms.push_back(uniform_object);
283 auto json_string = std::make_shared<std::string>(root.dump(2u));
285 return std::make_shared<fml::NonOwnedMapping>(
286 reinterpret_cast<const uint8_t*
>(json_string->data()),
287 json_string->size(), [json_string](
auto,
auto) {});
292 auto kvp = data_.find(backend);
293 if (kvp == data_.end()) {
297 auto runtime_stage = std::make_unique<fb::RuntimeStageT>();
298 runtime_stage->entrypoint = kvp->second->entrypoint;
299 const auto stage =
ToStage(kvp->second->stage);
300 if (!stage.has_value()) {
304 runtime_stage->stage = stage.value();
305 if (!kvp->second->shader) {
309 if (kvp->second->shader->GetSize() > 0u) {
310 runtime_stage->shader = {
311 kvp->second->shader->GetMapping(),
312 kvp->second->shader->GetMapping() + kvp->second->shader->GetSize()};
314 for (
const auto& uniform : kvp->second->uniforms) {
315 auto desc = std::make_unique<fb::UniformDescriptionT>();
317 desc->name = uniform.name;
318 if (desc->name.empty()) {
322 desc->location = uniform.location;
323 desc->rows = uniform.rows;
324 desc->columns = uniform.columns;
326 if (!uniform_type.has_value()) {
330 desc->type = uniform_type.value();
331 desc->bit_width = uniform.bit_width;
332 if (uniform.array_elements.has_value()) {
333 desc->array_elements = uniform.array_elements.value();
336 for (
const auto& byte_type : uniform.padding_layout) {
337 desc->padding_layout.push_back(
static_cast<fb::PaddingType
>(byte_type));
339 desc->struct_float_count = uniform.struct_float_count;
341 for (
const StructField& field : uniform.struct_fields) {
342 auto field_desc = std::make_unique<fb::StructFieldT>(fb::StructFieldT{});
343 field_desc->name = field.name;
344 field_desc->byte_size = field.byte_size;
345 desc->struct_fields.emplace_back(std::move(field_desc));
348 runtime_stage->uniforms.emplace_back(std::move(desc));
351 for (
const auto&
input : kvp->second->inputs) {
352 auto desc = std::make_unique<fb::StageInputT>();
354 desc->name =
input.name;
356 if (desc->name.empty()) {
360 desc->location =
input.location;
361 desc->set =
input.set;
362 desc->binding =
input.binding;
364 if (!input_type.has_value()) {
368 desc->type = input_type.value();
369 desc->bit_width =
input.bit_width;
370 desc->vec_size =
input.vec_size;
371 desc->columns =
input.columns;
372 desc->offset =
input.offset;
374 runtime_stage->inputs.emplace_back(std::move(desc));
377 return runtime_stage;
384 auto runtime_stages = std::make_unique<fb::RuntimeStagesT>();
385 runtime_stages->format_version =
386 static_cast<uint32_t
>(fb::RuntimeStagesFormatVersion::kVersion);
388 for (
const auto& kvp : data_) {
392 runtime_stages->sksl = std::move(runtime_stage);
395 runtime_stages->metal = std::move(runtime_stage);
398 runtime_stages->opengles = std::move(runtime_stage);
401 runtime_stages->vulkan = std::move(runtime_stage);
404 runtime_stages->opengles3 = std::move(runtime_stage);
408 return runtime_stages;
413 if (!runtime_stages) {
417 auto builder = std::make_shared<flatbuffers::FlatBufferBuilder>();
418 builder->Finish(fb::RuntimeStages::Pack(*builder.get(), runtime_stages.get()),
419 fb::RuntimeStagesIdentifier());
420 return std::make_shared<fml::NonOwnedMapping>(builder->GetBufferPointer(),
422 [builder](
auto,
auto) {});
std::shared_ptr< const fml::Mapping > data