summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-10-05 08:51:36 +0200
committerLiang Qi <liang.qi@qt.io>2017-10-05 08:51:42 +0200
commit7de71897132cc771f6177a75fdb3c76ce82659da (patch)
tree89baca562e4368b42c35ae3d9f409b19e45ef270
parentdf98a3c31459d626de3ff8cf3956419e9e8b911f (diff)
parent3b24ef25fa328bf993891e242c0c3ff677fafbcb (diff)
Merge remote-tracking branch 'origin/5.10' into dev
-rw-r--r--src/imports/qtcanvas3d/canvasrenderer.cpp36
-rw-r--r--src/imports/qtcanvas3d/glcommandqueue.cpp4
-rw-r--r--src/imports/qtcanvas3d/glcommandqueue_p.h2
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();