diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-07-17 13:00:33 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-07-24 09:18:06 +0000 |
commit | f71b223452f7f0eda62eddfc173c0d36d86dc32b (patch) | |
tree | f58f40a45b047e6f047151fc14d13a2b5e942904 /src/render/backend/jobs | |
parent | 098b2181e98cf57b56712d7a335a0f3027653ff0 (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.cpp | 6 | ||||
-rw-r--r-- | src/render/backend/jobs/loadtexturedatajob.cpp | 42 |
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 |