summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/utils
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-05-21 13:37:11 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-05-22 08:03:06 +0300
commitcb79f11be1c0c379a1eccea62606a58b73442f2f (patch)
tree0e8409d491897b4fc9d1929ea1e13e575c6b7198 /src/datavisualization/utils
parent37a82fbeb7aa59260fe5f31b62228914ee4a44a3 (diff)
Cache ObjectHelper instances
Task-number: QTRD-2792 Change-Id: I90d83bd9b73a0f337fd26f1b92000e72b3ec0607 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/utils')
-rw-r--r--src/datavisualization/utils/objecthelper.cpp76
-rw-r--r--src/datavisualization/utils/objecthelper_p.h15
2 files changed, 86 insertions, 5 deletions
diff --git a/src/datavisualization/utils/objecthelper.cpp b/src/datavisualization/utils/objecthelper.cpp
index 97695193..8cbf2aa2 100644
--- a/src/datavisualization/utils/objecthelper.cpp
+++ b/src/datavisualization/utils/objecthelper.cpp
@@ -27,15 +27,87 @@ ObjectHelper::ObjectHelper(const QString &objectFile)
: m_objectFile(objectFile)
{
m_indicesType = GL_UNSIGNED_SHORT;
+ load();
}
+struct ObjectHelperRef {
+ int refCount;
+ ObjectHelper *obj;
+};
+
+// The "Abstract3DRenderer *" key identifies the renderer
+static QHash<const Abstract3DRenderer *, QHash<QString, ObjectHelperRef *> *> cacheTable;
+
ObjectHelper::~ObjectHelper()
{
}
-void ObjectHelper::setObjectFile(const QString &objectFile)
+void ObjectHelper::resetObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj,
+ const QString &meshFile)
+{
+ Q_ASSERT(cacheId);
+
+ if (obj) {
+ const QString &oldFile = obj->objectFile();
+ if (meshFile == oldFile)
+ return; // same file, do nothing
+ releaseObjectHelper(cacheId, obj);
+ }
+ obj = getObjectHelper(cacheId, meshFile);
+}
+
+void ObjectHelper::releaseObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj)
+{
+ Q_ASSERT(cacheId);
+
+ if (obj) {
+ QHash<QString, ObjectHelperRef *> *objectTable = cacheTable.value(cacheId, 0);
+ if (objectTable) {
+ // Delete object if last reference is released
+ ObjectHelperRef *objRef = objectTable->value(obj->m_objectFile, 0);
+ if (objRef) {
+ objRef->refCount--;
+ if (objRef->refCount <= 0) {
+ objectTable->remove(obj->m_objectFile);
+ delete objRef->obj;
+ delete objRef;
+ }
+ }
+ if (objectTable->isEmpty()) {
+ // Remove the entire cache if last object was removed
+ cacheTable.remove(cacheId);
+ delete objectTable;
+ }
+ } else {
+ // Just delete the object if unknown cache
+ delete obj;
+ }
+ obj = 0;
+ }
+}
+
+ObjectHelper *ObjectHelper::getObjectHelper(const Abstract3DRenderer *cacheId,
+ const QString &objectFile)
{
- m_objectFile = objectFile;
+ if (objectFile.isEmpty())
+ return 0;
+
+ QHash<QString, ObjectHelperRef *> *objectTable = cacheTable.value(cacheId, 0);
+ if (!objectTable) {
+ objectTable = new QHash<QString, ObjectHelperRef *>;
+ cacheTable.insert(cacheId, objectTable);
+ }
+
+ // Check if object helper for this mesh already exists
+ ObjectHelperRef *objRef = objectTable->value(objectFile, 0);
+ if (!objRef) {
+ objRef = new ObjectHelperRef;
+ objRef->refCount = 0;
+ objRef->obj = new ObjectHelper(objectFile);
+ objectTable->insert(objectFile, objRef);
+ }
+ objRef->refCount++;
+ return objRef->obj;
}
void ObjectHelper::load()
diff --git a/src/datavisualization/utils/objecthelper_p.h b/src/datavisualization/utils/objecthelper_p.h
index 0260dd05..93dc6c94 100644
--- a/src/datavisualization/utils/objecthelper_p.h
+++ b/src/datavisualization/utils/objecthelper_p.h
@@ -35,17 +35,26 @@
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
+class Abstract3DRenderer;
+
class ObjectHelper : public AbstractObjectHelper
{
+private:
+ ObjectHelper(const QString &objectFile);
public:
- ObjectHelper(const QString &objectFile = QString());
~ObjectHelper();
- void setObjectFile(const QString &objectFile);
+ static void resetObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj,
+ const QString &meshFile);
+ static void releaseObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj);
- void load();
+ inline const QString &objectFile() { return m_objectFile; }
private:
+ static ObjectHelper *getObjectHelper(const Abstract3DRenderer *cacheId,
+ const QString &objectFile);
+ void load();
+
QString m_objectFile;
};