summaryrefslogtreecommitdiffstats
path: root/src/render/jobs
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2018-02-20 15:21:13 +0100
committerPaul Lemire <paul.lemire@kdab.com>2018-02-28 10:44:49 +0000
commit3dff7c204da1d834629544b54b9f6efaafe165e2 (patch)
treef8529c267fd3a8ffa2f7e293682bdea219fe2897 /src/render/jobs
parenta43cf3726679704cc8c4c5a405c60c6f1c4fcfce (diff)
Revert "Keep rendering in sync with aspect jobs by adding barriers"
This reverts commit 46319648436814afb5a77755dde6681e304befaf. We want to be able to render one set of RenderViews for frame n while concurrently building RenderViews for frame n + 1. The reverted commit removed that behavior which reduced the CPU time available to prepare a frame. This would cause on some scenes a failure to meet the ~10ms budget we have to prepare a frame. This is therefore a regression. The root cause behind this regression is that a job cannot be executed until all the jobs which have been previously launched have completed. The proposed solution would be to instead add an OpenGL command thread that can be used to load graphics resources required for the RenderViews directly when required. This would in turn allow to cache RenderViews and keep the concurrent behavior of RenderView submission and creation. With that goal in mind, the following patches will be rebased and updated https://codereview.qt-project.org/#/c/189309/ https://codereview.qt-project.org/#/c/189310/ Change-Id: I4879047c45986a0e615e3aef7b7352f82a04a9da Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/jobs')
-rw-r--r--src/render/jobs/job_common_p.h7
-rw-r--r--src/render/jobs/loadtexturedatajob.cpp30
-rw-r--r--src/render/jobs/loadtexturedatajob_p.h6
3 files changed, 22 insertions, 21 deletions
diff --git a/src/render/jobs/job_common_p.h b/src/render/jobs/job_common_p.h
index 7fd88a697..648f07a9b 100644
--- a/src/render/jobs/job_common_p.h
+++ b/src/render/jobs/job_common_p.h
@@ -100,17 +100,12 @@ namespace JobTypes {
UpdateMeshTriangleList,
FilterCompatibleTechniques,
UpdateLevelOfDetail,
- SyncSkeletonLoading,
+ SyncTextureLoading,
LoadSkeleton,
UpdateSkinningPalette,
ProximityFiltering,
SyncFilterEntityByLayer,
SyncMaterialGatherer,
- ReadRenderQueueSizeBarrier,
- BeginDrawingBarrier,
- UpdateGLResourcesBarrier,
- PrepareCommandSubmissionBarrier,
- EndDrawingBarrier
};
} // JobTypes
diff --git a/src/render/jobs/loadtexturedatajob.cpp b/src/render/jobs/loadtexturedatajob.cpp
index 790e41998..55232d74f 100644
--- a/src/render/jobs/loadtexturedatajob.cpp
+++ b/src/render/jobs/loadtexturedatajob.cpp
@@ -49,7 +49,16 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
namespace Render {
-LoadTextureDataJob::LoadTextureDataJob()
+LoadTextureDataJob::LoadTextureDataJob(const QTextureGeneratorPtr &texGen)
+ : m_texGen(texGen)
+ , m_imgDataGen(nullptr)
+{
+ SET_JOB_RUN_STAT_TYPE(this, JobTypes::LoadTextureData, 0);
+}
+
+LoadTextureDataJob::LoadTextureDataJob(const QTextureImageDataGeneratorPtr &imgDataGen)
+ : m_texGen(nullptr)
+ , m_imgDataGen(imgDataGen)
{
SET_JOB_RUN_STAT_TYPE(this, JobTypes::LoadTextureData, 0);
}
@@ -60,20 +69,13 @@ LoadTextureDataJob::~LoadTextureDataJob()
void LoadTextureDataJob::run()
{
- // NOTE: This must run after Renderer::updateGLResources(),
- // because that is where pendingGenerators is populated.
- // We are therefore not able to create one job for each texture
- // before we add the ability for running jobs (like this) to
- // spawn new jobs.
- const QVector<QTextureImageDataGeneratorPtr> pendingImgGen = m_manager->textureImageDataManager()->pendingGenerators();
- for (const QTextureImageDataGeneratorPtr &imgGen : pendingImgGen) {
- QTextureImageDataPtr imgData = (*imgGen)();
- m_manager->textureImageDataManager()->assignData(imgGen, imgData);
+ if (m_texGen) {
+ QTextureDataPtr texData = (*m_texGen)();
+ m_manager->textureDataManager()->assignData(m_texGen, texData);
}
- const QVector<QTextureGeneratorPtr> pendingTexGen = m_manager->textureDataManager()->pendingGenerators();
- for (const QTextureGeneratorPtr &texGen : pendingTexGen) {
- QTextureDataPtr texData = (*texGen)();
- m_manager->textureDataManager()->assignData(texGen, texData);
+ if (m_imgDataGen) {
+ QTextureImageDataPtr imgData = (*m_imgDataGen)();
+ m_manager->textureImageDataManager()->assignData(m_imgDataGen, imgData);
}
}
diff --git a/src/render/jobs/loadtexturedatajob_p.h b/src/render/jobs/loadtexturedatajob_p.h
index 7272bbc1d..607068712 100644
--- a/src/render/jobs/loadtexturedatajob_p.h
+++ b/src/render/jobs/loadtexturedatajob_p.h
@@ -67,7 +67,8 @@ class NodeManagers;
class LoadTextureDataJob : public Qt3DCore::QAspectJob
{
public:
- LoadTextureDataJob();
+ LoadTextureDataJob(const QTextureGeneratorPtr &texGen);
+ LoadTextureDataJob(const QTextureImageDataGeneratorPtr &imgDataGen);
~LoadTextureDataJob();
inline void setNodeManagers(NodeManagers *manager) { m_manager = manager; }
@@ -76,6 +77,9 @@ protected:
void run() final;
private:
+ QTextureGeneratorPtr m_texGen;
+ QTextureImageDataGeneratorPtr m_imgDataGen;
+
NodeManagers *m_manager;
};