30 {
31 if (!payload || payload->GetMapping() == nullptr) {
32 return absl::InvalidArgumentError("Shader mapping was absent.");
33 }
34
35 if (!fb::ShaderArchiveBufferHasIdentifier(payload->GetMapping())) {
36 return absl::InvalidArgumentError("Invalid shader magic.");
37 }
38
39 flatbuffers::Verifier verifier(payload->GetMapping(), payload->GetSize());
40 if (!fb::VerifyShaderArchiveBuffer(verifier)) {
41 return absl::InvalidArgumentError(
42 "Shader archive buffer failed verification.");
43 }
44
45 auto shader_archive = fb::GetShaderArchive(payload->GetMapping());
46 if (!shader_archive) {
47 return absl::InvalidArgumentError("Could not read shader archive.");
48 }
49
50 const auto version = shader_archive->format_version();
51 const auto expected =
52 static_cast<uint32_t>(fb::ShaderArchiveFormatVersion::kVersion);
53 if (version != expected) {
54 std::stringstream stream;
55 stream << "Unsupported shader archive format version. Expected: "
56 << expected << ", Got: " << version;
57 return absl::InvalidArgumentError(stream.str());
58 }
59
60 Shaders shaders;
61 if (auto items = shader_archive->items()) {
62 for (
auto i = items->begin(),
end = items->end();
i !=
end;
i++) {
64 key.name =
i->name()->str();
66 shaders[
key] = std::make_shared<fml::NonOwnedMapping>(
67 i->mapping()->Data(),
i->mapping()->size(), [payload](
auto,
auto) {
68
69
70 });
71 }
72 }
73
75}
ShaderArchive(ShaderArchive &&)
constexpr ArchiveShaderType ToShaderType(fb::Stage stage)