summaryrefslogtreecommitdiffhomepage
path: root/shaders/texture-unit-cache.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'shaders/texture-unit-cache.hpp')
-rw-r--r--shaders/texture-unit-cache.hpp35
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