summaryrefslogtreecommitdiffstats
path: root/src/render/jobs/loadtexturedatajob.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-04-28 08:16:59 +0200
committerPaul Lemire <paul.lemire@kdab.com>2016-05-20 11:12:46 +0000
commita2999182a07a94ee6124de8e970596002e5e9078 (patch)
tree0c450ab34f1c42d783364134ec62bf02f4e27aa5 /src/render/jobs/loadtexturedatajob.cpp
parent99c70270a1f68dfb67c707ac996fb18e94cce1c8 (diff)
Make QTexture use QTextureSourceGenerator
Instead of using a QTextureImageDataGenerator which was confusing Change-Id: Ibbda6b2e8ddf6a917e1d1c0b1e086596c8c30510 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/jobs/loadtexturedatajob.cpp')
-rw-r--r--src/render/jobs/loadtexturedatajob.cpp100
1 files changed, 69 insertions, 31 deletions
diff --git a/src/render/jobs/loadtexturedatajob.cpp b/src/render/jobs/loadtexturedatajob.cpp
index 2d61bfded..65bcd70bc 100644
--- a/src/render/jobs/loadtexturedatajob.cpp
+++ b/src/render/jobs/loadtexturedatajob.cpp
@@ -43,6 +43,7 @@
#include <Qt3DRender/private/texturedatamanager_p.h>
#include <Qt3DRender/private/qtextureimage_p.h>
#include <Qt3DRender/qtextureimagedata.h>
+#include <Qt3DRender/qtexturedata.h>
#include <QThread>
#include <Qt3DRender/private/job_common_p.h>
@@ -51,18 +52,12 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
namespace Render {
-LoadTextureDataJob::LoadTextureDataJob(Qt3DCore::QNodeId textureId)
- : m_textureId(textureId)
-{
- SET_JOB_RUN_STAT_TYPE(this, JobTypes::LoadTextureData, 0);
-}
+namespace {
-LoadTextureDataJob::~LoadTextureDataJob()
-{
-}
+typedef QPair<HTextureData, QTextureImageData *> HandleDataPair;
-static QPair<HTextureData, QTextureImageData *> textureDataFromGenerator(TextureDataManager *textureDataManager,
- QTextureImageDataGeneratorPtr generator)
+HandleDataPair textureDataFromGenerator(TextureDataManager *textureDataManager,
+ QTextureImageDataGeneratorPtr generator)
{
HTextureData textureDataHandle;
QTextureImageData *data = nullptr;
@@ -77,6 +72,7 @@ static QPair<HTextureData, QTextureImageData *> textureDataFromGenerator(Texture
if (!textureDataHandle.isNull()) {
data = textureDataManager->data(textureDataHandle);
} else {
+ // Texture data is null -> we need to generate it
QTextureImageDataPtr dataPtr = generator->operator ()();
if (dataPtr.isNull()) {
qCDebug(Jobs) << Q_FUNC_INFO << "Texture has no raw data";
@@ -92,35 +88,76 @@ static QPair<HTextureData, QTextureImageData *> textureDataFromGenerator(Texture
return qMakePair(textureDataHandle, data);
}
-void LoadTextureDataJob::run()
+void createTextureFromGenerator(TextureDataManager *textureDataManager,
+ Texture *texture)
{
- qCDebug(Jobs) << "Entering" << Q_FUNC_INFO << QThread::currentThread();
+ QTextureGeneratorPtr generator = texture->dataGenerator();
+ const QTextureDataPtr generatedData = generator->operator ()();
- Texture *txt = m_manager->textureManager()->lookupResource(m_textureId);
- TextureDataManager *textureDataManager = m_manager->manager<QTextureImageData, TextureDataManager>();
+ // TO DO set the status of the texture based on the status of the functor
- if (txt != nullptr) {
- if (txt->dataGenerator()) {
- QTextureImageDataGeneratorPtr generator = txt->dataGenerator();
+ // Use the first QTexImageData loaded to determine the target / mipmaps
+ // if not specified
+
+ if (texture->target() != QAbstractTexture::TargetAutomatic)
+ qWarning() << "When a texture provides a generator, it's target is expected to be TargetAutomatic";
+
+ texture->setTarget(static_cast<QAbstractTexture::Target>(generatedData->target()));
- QPair<HTextureData, QTextureImageData *> handleData = textureDataFromGenerator(textureDataManager, generator);
+ texture->setSize(generatedData->width(), generatedData->height(), generatedData->depth());
+ texture->setLayers(generatedData->layers());
+ texture->setFormat(generatedData->format());
+ texture->setFormat(static_cast<QAbstractTexture::TextureFormat>(generatedData->format()));
- HTextureData textureDataHandle = handleData.first;
- QTextureImageData *data = handleData.second;
- if (!data)
- return;
+ // Note: These texture data handles aren't associated with a QTextureImageDataGenerator
+ // and will therefore be destroyed when the Texture element is destroyed or cleaned up
+ const QVector<QTextureImageDataPtr> imageData = generatedData->imageData();
- if (txt->target() == QAbstractTexture::TargetAutomatic)
- txt->setTarget(static_cast<QAbstractTexture::Target>(data->target()));
+ if (imageData.size() > 0) {
+ QMutexLocker locker(textureDataManager->mutex());
+ // We don't want to take the chance of having two jobs uploading the same functor
+ // because of sync issues
- if (!txt->isAutoMipMapGenerationEnabled())
- txt->setMipLevels(data->mipLevels());
+ // Set the mips level based on the first image if autoMipMapGeneration is disabled
+ if (!texture->isAutoMipMapGenerationEnabled())
+ texture->setMipLevels(imageData.first()->mipLevels());
- txt->setSize(data->width(), data->height(), data->depth());
- txt->setLayers(data->layers());
- txt->setFormat(static_cast<QAbstractTexture::TextureFormat>(data->format()));
- txt->setTextureDataHandle(textureDataHandle);
+ for (QTextureImageDataPtr dataPtr : imageData) {
+ HTextureData textureDataHandle = textureDataManager->acquire();
+ QTextureImageData *data = textureDataManager->data(textureDataHandle);
+ *data = *(dataPtr.data());
+ texture->addTextureDataHandle(textureDataHandle);
}
+ }
+}
+
+} // anonymous
+
+LoadTextureDataJob::LoadTextureDataJob(Qt3DCore::QNodeId textureId)
+ : m_textureId(textureId)
+{
+ SET_JOB_RUN_STAT_TYPE(this, JobTypes::LoadTextureData, 0);
+}
+
+LoadTextureDataJob::~LoadTextureDataJob()
+{
+}
+
+void LoadTextureDataJob::run()
+{
+ qCDebug(Jobs) << "Entering" << Q_FUNC_INFO << QThread::currentThread();
+
+ Texture *txt = m_manager->textureManager()->lookupResource(m_textureId);
+ TextureDataManager *textureDataManager = m_manager->manager<QTextureImageData, TextureDataManager>();
+
+ if (txt != nullptr) {
+ // We need to clear the TextureData handles of the texture in case it was previously
+ // loaded with a different functor
+ txt->releaseTextureDataHandles();
+
+ // If the texture has a functor we used it to generate embedded TextureImages
+ if (txt->dataGenerator())
+ createTextureFromGenerator(textureDataManager, txt);
// Load update each TextureImage
const auto texImgHandles = txt->textureImages();
@@ -166,10 +203,11 @@ void LoadTextureDataJob::run()
}
}
// Set the textureDataHandle on the texture image
+ // Note: this internally updates the DNA of the TextureImage
texImg->setTextureDataHandle(textureDataHandle);
}
}
- // Tell the renderer to reload the TextureImage for the Texture
+ // Tell the renderer to reload/upload to GPU the TextureImage for the Texture
// next frame
txt->requestTextureDataUpdate();
}