From 634ac2a3c1a7bae9eef6476c37cd68209c28ae4f Mon Sep 17 00:00:00 2001 From: Mauro Persano Date: Tue, 12 Jan 2016 10:49:20 -0200 Subject: 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 --- src/render/jobs/loadtexturedatajob.cpp | 87 +++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 28 deletions(-) (limited to 'src/render/jobs') 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 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(); if (txt != Q_NULLPTR) { + if (txt->dataFunctor()) { + QTextureDataFunctorPtr functor = txt->dataFunctor(); + + QPair handleData = textureDataFromFunctor(textureDataManager, functor); + + HTextureData textureDataHandle = handleData.first; + QTexImageData *data = handleData.second; + + if (txt->target() == QAbstractTextureProvider::TargetAutomatic) + txt->setTarget(static_cast(data->target())); + + if (!txt->isAutoMipMapGenerationEnabled()) + txt->setMipLevels(data->mipLevels()); + + txt->setSize(data->width(), data->height(), data->depth()); + txt->setFormat(static_cast(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 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(); + 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 -- cgit v1.2.3