diff options
Diffstat (limited to 'shaders/texture-unit-cache.hpp')
-rw-r--r-- | shaders/texture-unit-cache.hpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/shaders/texture-unit-cache.hpp b/shaders/texture-unit-cache.hpp new file mode 100644 index 00000000..2647ea8c --- /dev/null +++ b/shaders/texture-unit-cache.hpp @@ -0,0 +1,35 @@ +#pragma once +#include "compat/defs.hpp" +#include <Corrade/Containers/Array.h> + +namespace Magnum::GL { class AbstractTexture; } + +namespace floormat { + +struct texture_unit_cache final +{ + fm_DECLARE_DELETED_COPY_ASSIGNMENT(texture_unit_cache); + fm_DECLARE_DEFAULT_MOVE_ASSIGNMENT_(texture_unit_cache); + + texture_unit_cache(); + + [[nodiscard]] int32_t bind(GL::AbstractTexture* ptr); + [[nodiscard]] int32_t bind(GL::AbstractTexture& x); + void invalidate(); + void lock(size_t i, GL::AbstractTexture* = (GL::AbstractTexture*)-1); + void lock(size_t i, GL::AbstractTexture& tex) { lock(i, &tex); } + void unlock(size_t i, bool immediately = true); + + size_t reuse_count() const { return cache_hit_count; } + size_t bind_count() const { return rebind_count; } + void reset_stats() { rebind_count = cache_hit_count = 0; } + +private: + static size_t get_unit_count(); + struct unit_data; + + size_t unit_count, lru_counter = 0, rebind_count = 0, cache_hit_count = 0; + Array<unit_data> units; +}; + +} // namespace floormat |