blob: 3cfddf621fa62da90fe2eabc18339100004f0724 [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 <optional>
#include <sstream>
#include <string>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#include "flutter/fml/hash_combine.h"
#include "flutter/fml/macros.h"
#include "impeller/base/comparable.h"
#include "impeller/renderer/backend/gles/gles.h"
namespace impeller {
enum class HandleType {
kUnknown,
kTexture,
kBuffer,
kProgram,
kRenderBuffer,
kFrameBuffer,
};
std::string HandleTypeToString(HandleType type);
class ReactorGLES;
struct HandleGLES {
HandleType type = HandleType::kUnknown;
std::optional<UniqueID> name;
static HandleGLES DeadHandle() {
return HandleGLES{HandleType::kUnknown, std::nullopt};
}
constexpr bool IsDead() const { return !name.has_value(); }
struct Hash {
std::size_t operator()(const HandleGLES& handle) const {
return fml::HashCombine(
std::underlying_type_t<decltype(handle.type)>(handle.type),
handle.name);
}
};
struct Equal {
bool operator()(const HandleGLES& lhs, const HandleGLES& rhs) const {
return lhs.type == rhs.type && lhs.name == rhs.name;
}
};
private:
friend class ReactorGLES;
HandleGLES(HandleType p_type, UniqueID p_name) : type(p_type), name(p_name) {}
HandleGLES(HandleType p_type, std::optional<UniqueID> p_name)
: type(p_type), name(p_name) {}
static HandleGLES Create(HandleType type) {
return HandleGLES{type, UniqueID{}};
}
};
} // namespace impeller
namespace std {
inline std::ostream& operator<<(std::ostream& out,
const impeller::HandleGLES& handle) {
out << HandleTypeToString(handle.type) << "(";
if (handle.IsDead()) {
out << "DEAD";
} else {
out << handle.name.value().id;
}
out << ")";
return out;
}
} // namespace std