13 #include "impeller/shader_archive/shader_archive_flatbuffers.h"
19 case fb::Stage::kVertex:
21 case fb::Stage::kFragment:
23 case fb::Stage::kCompute:
30 std::shared_ptr<fml::Mapping> payload) {
31 if (!payload || payload->GetMapping() ==
nullptr) {
32 return absl::InvalidArgumentError(
"Shader mapping was absent.");
35 if (!fb::ShaderArchiveBufferHasIdentifier(payload->GetMapping())) {
36 return absl::InvalidArgumentError(
"Invalid shader magic.");
39 auto shader_archive = fb::GetShaderArchive(payload->GetMapping());
40 if (!shader_archive) {
41 return absl::InvalidArgumentError(
"Could not read shader archive.");
44 const auto version = shader_archive->format_version();
46 static_cast<uint32_t
>(fb::ShaderArchiveFormatVersion::kVersion);
47 if (version != expected) {
48 std::stringstream stream;
49 stream <<
"Unsupported shader archive format version. Expected: "
50 << expected <<
", Got: " << version;
51 return absl::InvalidArgumentError(stream.str());
55 if (
auto items = shader_archive->items()) {
56 for (
auto i = items->begin(),
end = items->end(); i !=
end; i++) {
58 key.name = i->name()->str();
60 shaders[key] = std::make_shared<fml::NonOwnedMapping>(
61 i->mapping()->Data(), i->mapping()->size(), [payload](
auto,
auto) {
73 : payload_(
std::move(payload)), shaders_(
std::move(shaders)) {}
80 return shaders_.size();
85 std::string name)
const {
88 key.name = std::move(name);
89 auto found = shaders_.find(key);
90 return found == shaders_.end() ? nullptr : found->second;
95 const std::string& name,
96 const std::shared_ptr<fml::Mapping>& mapping)>&
102 for (
const auto& shader : shaders_) {
104 if (!callback(shader.first.type, shader.first.name, shader.second)) {
ShaderArchive(ShaderArchive &&)
size_t IterateAllShaders(const std::function< bool(ArchiveShaderType type, const std::string &name, const std::shared_ptr< fml::Mapping > &mapping)> &) const
static absl::StatusOr< ShaderArchive > Create(std::shared_ptr< fml::Mapping > payload)
size_t GetShaderCount() const
std::shared_ptr< fml::Mapping > GetMapping(ArchiveShaderType type, std::string name) const
constexpr ArchiveShaderType ToShaderType(fb::Stage stage)