blob: 7d5a8b598f282d8d3b9c7c0338096a65275576ed [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <memory>
#include <type_traits>
#include <unordered_map>
#include "flutter/fml/hash_combine.h"
#include "flutter/fml/macros.h"
#include "flutter/fml/mapping.h"
#include "impeller/blobcat/blob_types.h"
namespace impeller {
class BlobLibrary {
public:
explicit BlobLibrary(std::shared_ptr<fml::Mapping> payload);
BlobLibrary(BlobLibrary&&);
~BlobLibrary();
bool IsValid() const;
size_t GetShaderCount() const;
std::shared_ptr<fml::Mapping> GetMapping(BlobShaderType type,
std::string name) const;
size_t IterateAllBlobs(
std::function<bool(BlobShaderType type,
const std::string& name,
const std::shared_ptr<fml::Mapping>& mapping)>) const;
private:
struct BlobKey {
BlobShaderType type = BlobShaderType::kFragment;
std::string name;
struct Hash {
size_t operator()(const BlobKey& key) const {
return fml::HashCombine(
static_cast<std::underlying_type_t<decltype(key.type)>>(key.type),
key.name);
}
};
struct Equal {
bool operator()(const BlobKey& lhs, const BlobKey& rhs) const {
return lhs.type == rhs.type && lhs.name == rhs.name;
}
};
};
using Blobs = std::unordered_map<BlobKey,
std::shared_ptr<fml::Mapping>,
BlobKey::Hash,
BlobKey::Equal>;
std::shared_ptr<fml::Mapping> payload_;
Blobs blobs_;
bool is_valid_ = false;
FML_DISALLOW_COPY_AND_ASSIGN(BlobLibrary);
};
} // namespace impeller