summaryrefslogtreecommitdiffstats
path: root/src/render/jobs
diff options
context:
space:
mode:
authorMauro Persano <mauro.persano@kdab.com>2016-01-12 10:49:20 -0200
committerSean Harmer <sean.harmer@kdab.com>2016-01-16 15:52:31 +0000
commit634ac2a3c1a7bae9eef6476c37cd68209c28ae4f (patch)
tree270469aeac7988b3534918bedd2becf70cfb8e98 /src/render/jobs
parent43e55cd54635a5ef1eb09fe9cff701f7eb16cd7a (diff)
Support for DDS textures
This commit adds support for DDS textures. It also adds QTextureLoader, a generic texture provider without a texture target. The actual texture target will be based on the properties of the texture loaded from its "source" property. Change-Id: If89cce7a55b3d82355f2da35588a091b7188f36c Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/jobs')
-rw-r--r--src/render/jobs/loadtexturedatajob.cpp87
1 files changed, 59 insertions, 28 deletions
diff --git a/src/render/jobs/loadtexturedatajob.cpp b/src/render/jobs/loadtexturedatajob.cpp
index 5f4a9801b..ec41924f6 100644
--- a/src/render/jobs/loadtexturedatajob.cpp
+++ b/src/render/jobs/loadtexturedatajob.cpp
@@ -55,6 +55,36 @@ LoadTextureDataJob::~LoadTextureDataJob()
{
}
+static QPair<HTextureData, QTexImageData *> textureDataFromFunctor(TextureDataManager *textureDataManager, QTextureDataFunctorPtr functor)
+{
+ HTextureData textureDataHandle;
+ QTexImageData *data = Q_NULLPTR;
+
+ QMutexLocker locker(textureDataManager->mutex());
+ // We don't want to take the chance of having two jobs uploading the same functor
+ // because of sync issues
+
+ textureDataHandle = textureDataManager->textureDataFromFunctor(functor);
+
+ // Texture data handle isn't null == there's already a matching TextureData
+ if (!textureDataHandle.isNull()) {
+ data = textureDataManager->data(textureDataHandle);
+ } else {
+ QTexImageDataPtr dataPtr = functor->operator ()();
+ if (dataPtr.isNull()) {
+ qCDebug(Jobs) << Q_FUNC_INFO << "Texture has no raw data";
+ } else {
+ // Save the QTexImageDataPtr with it's functor as a key
+ textureDataHandle = textureDataManager->acquire();
+ data = textureDataManager->data(textureDataHandle);
+ *data = *(dataPtr.data());
+ textureDataManager->addTextureDataForFunctor(textureDataHandle, functor);
+ }
+ }
+
+ return qMakePair(textureDataHandle, data);
+}
+
void LoadTextureDataJob::run()
{
qCDebug(Jobs) << "Entering" << Q_FUNC_INFO << QThread::currentThread();
@@ -63,40 +93,41 @@ void LoadTextureDataJob::run()
TextureDataManager *textureDataManager = m_manager->manager<QTexImageData, TextureDataManager>();
if (txt != Q_NULLPTR) {
+ if (txt->dataFunctor()) {
+ QTextureDataFunctorPtr functor = txt->dataFunctor();
+
+ QPair<HTextureData, QTexImageData *> handleData = textureDataFromFunctor(textureDataManager, functor);
+
+ HTextureData textureDataHandle = handleData.first;
+ QTexImageData *data = handleData.second;
+
+ if (txt->target() == QAbstractTextureProvider::TargetAutomatic)
+ txt->setTarget(static_cast<QAbstractTextureProvider::Target>(data->target()));
+
+ if (!txt->isAutoMipMapGenerationEnabled())
+ txt->setMipLevels(data->mipLevels());
+
+ txt->setSize(data->width(), data->height(), data->depth());
+ txt->setFormat(static_cast<QAbstractTextureProvider::TextureFormat>(data->format()));
+ txt->setTextureDataHandle(textureDataHandle);
+ }
+
// Load update each TextureImage
Q_FOREACH (HTextureImage texImgHandle, txt->textureImages()) {
TextureImage *texImg = m_manager->textureImageManager()->data(texImgHandle);
if (texImg != Q_NULLPTR && texImg->isDirty() && !texImg->dataFunctor().isNull()) {
QTextureDataFunctorPtr functor = texImg->dataFunctor();
- HTextureData textureDataHandle;
- QTexImageData *data = Q_NULLPTR;
-
- // scoped for locker
- {
- QMutexLocker locker(textureDataManager->mutex());
- // We don't want to take the chance of having two jobs uploading the same functor
- // because of sync issues
- textureDataHandle = textureDataManager->textureDataFromFunctor(functor);
-
- // Texture data handle isn't null == there's already a matching TextureData
- if (!textureDataHandle.isNull()) {
- data = textureDataManager->data(textureDataHandle);
- } else {
- QTexImageDataPtr dataPtr = functor->operator ()();
- if (dataPtr.isNull()) {
- qCDebug(Jobs) << Q_FUNC_INFO << "Texture has no raw data";
- } else {
- // Save the QTexImageDataPtr with it's functor as a key
- textureDataHandle = textureDataManager->acquire();
- data = textureDataManager->data(textureDataHandle);
- *data = *(dataPtr.data());
- textureDataManager->addTextureDataForFunctor(textureDataHandle, functor);
- }
- }
- // Update HTextureImage Functor to release TextureData when needed
- textureDataManager->assignFunctorToTextureImage(functor, texImgHandle);
- }
+ QPair<HTextureData, QTexImageData *> handleData = textureDataFromFunctor(textureDataManager, functor);
+
+ HTextureData textureDataHandle = handleData.first;
+ QTexImageData *data = handleData.second;
+
+ // XXX released textureDataManager mutex, do we have a race here?
+
+ // Update HTextureImage Functor to release TextureData when needed
+ TextureDataManager *textureDataManager = m_manager->manager<QTexImageData, TextureDataManager>();
+ textureDataManager->assignFunctorToTextureImage(functor, texImgHandle);
// Set texture size of texture if the first layer / level / face has a valid size
// otherwise assume the size was set on the texture itself