summaryrefslogtreecommitdiff
path: root/src/mbgl/util/texture_pool.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/util/texture_pool.cpp')
-rw-r--r--src/mbgl/util/texture_pool.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/mbgl/util/texture_pool.cpp b/src/mbgl/util/texture_pool.cpp
new file mode 100644
index 0000000000..9c8c24b085
--- /dev/null
+++ b/src/mbgl/util/texture_pool.cpp
@@ -0,0 +1,58 @@
+#include <mbgl/util/texture_pool.hpp>
+
+#include <vector>
+
+const int TextureMax = 64;
+
+using namespace mbgl;
+
+GLuint TexturePool::getTextureID() {
+ if (texture_ids.empty()) {
+ GLuint new_texture_ids[TextureMax];
+ glGenTextures(TextureMax, new_texture_ids);
+ for (uint32_t id = 0; id < TextureMax; id++) {
+ texture_ids.insert(new_texture_ids[id]);
+ }
+ }
+
+ GLuint id = 0;
+
+ if (!texture_ids.empty()) {
+ std::set<GLuint>::iterator id_iterator = texture_ids.begin();
+ id = *id_iterator;
+ texture_ids.erase(id_iterator);
+ }
+
+ return id;
+}
+
+void TexturePool::removeTextureID(GLuint texture_id) {
+ bool needs_clear = false;
+
+ texture_ids.insert(texture_id);
+
+ if (texture_ids.size() > TextureMax) {
+ needs_clear = true;
+ }
+
+ if (needs_clear) {
+ // TODO: We need to find a better way to deal with texture pool cleanup
+// clearTextureIDs();
+ }
+}
+
+void TexturePool::clearTextureIDs() {
+ std::vector<GLuint> ids_to_remove;
+ ids_to_remove.reserve(texture_ids.size());
+
+ for (std::set<GLuint>::iterator id_iterator = texture_ids.begin();
+ id_iterator != texture_ids.end(); ++id_iterator) {
+ ids_to_remove.push_back(*id_iterator);
+ }
+
+ if (!ids_to_remove.empty()) {
+ glDeleteTextures((GLsizei)ids_to_remove.size(), &ids_to_remove[0]);
+ }
+
+ texture_ids.clear();
+}