diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2018-02-20 15:21:13 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-02-28 10:44:49 +0000 |
commit | 3dff7c204da1d834629544b54b9f6efaafe165e2 (patch) | |
tree | f8529c267fd3a8ffa2f7e293682bdea219fe2897 /src/render/jobs | |
parent | a43cf3726679704cc8c4c5a405c60c6f1c4fcfce (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.h | 7 | ||||
-rw-r--r-- | src/render/jobs/loadtexturedatajob.cpp | 30 | ||||
-rw-r--r-- | src/render/jobs/loadtexturedatajob_p.h | 6 |
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; }; |