summaryrefslogtreecommitdiffstats
path: root/src/render/backend/jobs
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-07-17 13:00:33 +0200
committerSean Harmer <sean.harmer@kdab.com>2015-07-24 09:18:06 +0000
commitf71b223452f7f0eda62eddfc173c0d36d86dc32b (patch)
treef58f40a45b047e6f047151fc14d13a2b5e942904 /src/render/backend/jobs
parent098b2181e98cf57b56712d7a335a0f3027653ff0 (diff)
TextureDataManager/TextureImageData improved
* Removed RenderTextureProvider which was never used * Add cleanup method in TextureImageData to reduced memory consumption when waiting for the object to be recycled by the resources manager * Improved the TextureDataManager to keep track for each functor of all the associated TextureImages which allows to release TextureImageData that we don't need to keep Change-Id: Id805fc0e7ef8d7c586eb77382bc66cd5e4cc8107 Task-number: QTBUG-47223 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/backend/jobs')
-rw-r--r--src/render/backend/jobs/framecleanupjob.cpp6
-rw-r--r--src/render/backend/jobs/loadtexturedatajob.cpp42
2 files changed, 30 insertions, 18 deletions
diff --git a/src/render/backend/jobs/framecleanupjob.cpp b/src/render/backend/jobs/framecleanupjob.cpp
index 06b7b2ffb..b1d909626 100644
--- a/src/render/backend/jobs/framecleanupjob.cpp
+++ b/src/render/backend/jobs/framecleanupjob.cpp
@@ -39,6 +39,7 @@
#include <private/renderentity_p.h>
#include <private/rendershaderdata_p.h>
#include <private/managers_p.h>
+#include <private/texturedatamanager_p.h>
QT_BEGIN_NAMESPACE
@@ -64,7 +65,10 @@ void FrameCleanupJob::run()
shaderData->clearUpdate();
}
RenderShaderData::clearShaderDataList();
- // TO DO: Add anything that should be clean after all RenderViewJobs have been executed
+
+ // Cleanup texture handles
+ TextureDataManager *textureDataManager = m_renderer->textureDataManager();
+ textureDataManager->cleanup();
}
} // Render
diff --git a/src/render/backend/jobs/loadtexturedatajob.cpp b/src/render/backend/jobs/loadtexturedatajob.cpp
index d651e5338..7176f7ae2 100644
--- a/src/render/backend/jobs/loadtexturedatajob.cpp
+++ b/src/render/backend/jobs/loadtexturedatajob.cpp
@@ -67,26 +67,34 @@ void LoadTextureDataJob::run()
RenderTextureImage *texImg = m_renderer->textureImageManager()->data(texImgHandle);
if (texImg != Q_NULLPTR && texImg->isDirty() && !texImg->dataFunctor().isNull()) {
QTextureDataFunctorPtr functor = texImg->dataFunctor();
- TextureDataManager::Locker locker(m_renderer->textureDataManager());
- HTextureData textureDataHandle = m_renderer->textureDataManager()->textureDataFromFunctor(functor);
- locker.unlock();
-
+ HTextureData textureDataHandle;
TexImageData *data = Q_NULLPTR;
- // Texture data handle isn't null == there's already a matching TextureData
- if (!textureDataHandle.isNull()) {
- data = m_renderer->textureDataManager()->data(textureDataHandle);
- } else {
- TexImageDataPtr dataPtr = functor->operator ()();
- if (dataPtr.isNull()) {
- qCDebug(Jobs) << Q_FUNC_INFO << "Texture has no raw data";
- } else {
- // Save the TexImageDataPtr with it's functor as a key
- textureDataHandle = m_renderer->textureDataManager()->acquire();
+
+ // scoped for locker
+ {
+ QMutexLocker locker(m_renderer->textureDataManager()->mutex());
+ // We don't want to take the chance of having two jobs uploading the same functor
+ // because of sync issues
+ textureDataHandle = m_renderer->textureDataManager()->textureDataFromFunctor(functor);
+
+ // Texture data handle isn't null == there's already a matching TextureData
+ if (!textureDataHandle.isNull()) {
data = m_renderer->textureDataManager()->data(textureDataHandle);
- locker.relock();
- *data = *(dataPtr.data());
- m_renderer->textureDataManager()->addTextureDataForFunctor(textureDataHandle, functor);
+ } else {
+ TexImageDataPtr dataPtr = functor->operator ()();
+ if (dataPtr.isNull()) {
+ qCDebug(Jobs) << Q_FUNC_INFO << "Texture has no raw data";
+ } else {
+ // Save the TexImageDataPtr with it's functor as a key
+ textureDataHandle = m_renderer->textureDataManager()->acquire();
+ data = m_renderer->textureDataManager()->data(textureDataHandle);
+ *data = *(dataPtr.data());
+ m_renderer->textureDataManager()->addTextureDataForFunctor(textureDataHandle, functor);
+ }
}
+
+ // Update HTextureImage Functor to release TextureData when needed
+ m_renderer->textureDataManager()->assignFunctorToTextureImage(functor, texImgHandle);
}
// Set texture size of texture if the first layer / level / face has a valid size