diff options
author | Liang Qi <liang.qi@qt.io> | 2017-10-05 08:51:36 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2017-10-05 08:51:42 +0200 |
commit | 7de71897132cc771f6177a75fdb3c76ce82659da (patch) | |
tree | 89baca562e4368b42c35ae3d9f409b19e45ef270 | |
parent | df98a3c31459d626de3ff8cf3956419e9e8b911f (diff) | |
parent | 3b24ef25fa328bf993891e242c0c3ff677fafbcb (diff) |
Merge remote-tracking branch 'origin/5.10' into dev
Change-Id: I2bb295b4cb5b8149f43456ed0ef22a002436cd66
-rw-r--r-- | src/imports/qtcanvas3d/canvasrenderer.cpp | 36 | ||||
-rw-r--r-- | src/imports/qtcanvas3d/glcommandqueue.cpp | 4 | ||||
-rw-r--r-- | src/imports/qtcanvas3d/glcommandqueue_p.h | 2 |
3 files changed, 27 insertions, 15 deletions
diff --git a/src/imports/qtcanvas3d/canvasrenderer.cpp b/src/imports/qtcanvas3d/canvasrenderer.cpp index db16051..95f77ad 100644 --- a/src/imports/qtcanvas3d/canvasrenderer.cpp +++ b/src/imports/qtcanvas3d/canvasrenderer.cpp @@ -809,21 +809,33 @@ void CanvasRenderer::createFBOs() void CanvasRenderer::transferCommands() { if (m_glContext) { - const int count = m_commandQueue.queuedCount(); - if (count > m_executeQueue.size()) - m_executeQueue.resize(count); + const int commandQueueCount = m_commandQueue.queuedCount(); + const int finalExecuteQueueCount = m_executeQueueCount + commandQueueCount; + if (finalExecuteQueueCount > m_executeQueue.size()) + m_executeQueue.resize(finalExecuteQueueCount); if (m_renderTarget == Canvas::RenderTargetOffscreenBuffer) { - m_executeQueueCount = count; - m_commandQueue.transferCommands(m_executeQueue); + m_commandQueue.transferCommands(m_executeQueue.data() + m_executeQueueCount); + m_executeQueueCount = finalExecuteQueueCount; } else { m_clearMask = m_commandQueue.resetClearMask(); - // Use previous frame count and indices if no new commands, otherwise reset values - if (count) { - deleteCommandData(); - m_executeQueueCount = count; - m_executeStartIndex = 0; - m_executeEndIndex = 0; - m_commandQueue.transferCommands(m_executeQueue); + if (commandQueueCount) { + if (m_executeStartIndex) { + // The commands in the execute queue have been executed at least once, + // so we can assume the new commands represent a new frame. Delete old commands. + deleteCommandData(); + m_executeStartIndex = 0; + m_executeEndIndex = 0; + m_commandQueue.transferCommands(m_executeQueue.data()); + m_executeQueueCount = commandQueueCount; + } else { + // Append new commands to existing non-executed commands + m_commandQueue.transferCommands(m_executeQueue.data() + m_executeQueueCount); + m_executeQueueCount = finalExecuteQueueCount; + } + } else { + // No new commands. Leave m_executeQueue alone, and let the renderer + // re-render the commands between m_executeStartIndex and m_executeEndIndex + // for the next frame. } } } diff --git a/src/imports/qtcanvas3d/glcommandqueue.cpp b/src/imports/qtcanvas3d/glcommandqueue.cpp index 0a23aae..929d7f8 100644 --- a/src/imports/qtcanvas3d/glcommandqueue.cpp +++ b/src/imports/qtcanvas3d/glcommandqueue.cpp @@ -176,9 +176,9 @@ GlCommand &CanvasGlCommandQueue::queueCommand(CanvasGlCommandQueue::GlCommandId * Copies command data to execute queue. GUI thread must be locked when this * method is called. */ -void CanvasGlCommandQueue::transferCommands(QVector<GlCommand> &executeQueue) +void CanvasGlCommandQueue::transferCommands(GlCommand executeQueue[]) { - memcpy(executeQueue.data(), m_queue.data(), m_queuedCount * sizeof(GlCommand)); + memcpy(executeQueue, m_queue.data(), m_queuedCount * sizeof(GlCommand)); m_queuedCount = 0; diff --git a/src/imports/qtcanvas3d/glcommandqueue_p.h b/src/imports/qtcanvas3d/glcommandqueue_p.h index 1c29009..b40cb66 100644 --- a/src/imports/qtcanvas3d/glcommandqueue_p.h +++ b/src/imports/qtcanvas3d/glcommandqueue_p.h @@ -248,7 +248,7 @@ public: GLint i1, GLint i2, GLfloat p1, GLfloat p2 = 0.0f, GLfloat p3 = 0.0f, GLfloat p4 = 0.0f); - void transferCommands(QVector<GlCommand> &executeQueue); + void transferCommands(GlCommand executeQueue[]); void resetQueue(int size); void deleteUntransferedCommandData(); |