Implement resource management for GL_EXT_memory_object
This implements glCreateMemoryObjectsEXT, glDeleteMemoryObjectsEXT, and
glIsMemoryObjectEXT. It's not possible to do anything useful with them
yet.
Bug: angleproject:3289
Change-Id: I8882b657e9de564b5f97f8dea87838f67b1928f8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1552025
Commit-Queue: Michael Spang <spang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/ResourceManager.cpp b/src/libANGLE/ResourceManager.cpp
index cc008ca..a8cda1b 100644
--- a/src/libANGLE/ResourceManager.cpp
+++ b/src/libANGLE/ResourceManager.cpp
@@ -12,6 +12,7 @@
#include "libANGLE/Buffer.h"
#include "libANGLE/Context.h"
#include "libANGLE/Fence.h"
+#include "libANGLE/MemoryObject.h"
#include "libANGLE/Path.h"
#include "libANGLE/Program.h"
#include "libANGLE/ProgramPipeline.h"
@@ -476,4 +477,51 @@
return mObjectMap.query(handle);
}
+// MemoryObjectManager Implementation.
+
+MemoryObjectManager::MemoryObjectManager() {}
+
+MemoryObjectManager::~MemoryObjectManager()
+{
+ ASSERT(mMemoryObjects.empty());
+}
+
+void MemoryObjectManager::reset(const Context *context)
+{
+ while (!mMemoryObjects.empty())
+ {
+ deleteMemoryObject(context, mMemoryObjects.begin()->first);
+ }
+ mMemoryObjects.clear();
+}
+
+GLuint MemoryObjectManager::createMemoryObject(rx::GLImplFactory *factory)
+{
+ GLuint handle = mHandleAllocator.allocate();
+ mMemoryObjects.assign(handle, new MemoryObject(factory, handle));
+ return handle;
+}
+
+void MemoryObjectManager::deleteMemoryObject(const Context *context, GLuint handle)
+{
+ MemoryObject *memoryObject = nullptr;
+ if (!mMemoryObjects.erase(handle, &memoryObject))
+ {
+ return;
+ }
+
+ // Requires an explicit this-> because of C++ template rules.
+ this->mHandleAllocator.release(handle);
+
+ if (memoryObject)
+ {
+ memoryObject->release(context);
+ }
+}
+
+MemoryObject *MemoryObjectManager::getMemoryObject(GLuint handle) const
+{
+ return mMemoryObjects.query(handle);
+}
+
} // namespace gl