<table><tr><td style="">ekurzinger added a comment.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D23881">View Revision</a></tr></table><br /><div><div><p>Also, apart from the above two comments, any thoughts to how this relates to Roman's pending re-work of a lot of the GLX code <a href="https://phabricator.kde.org/D23105" class="remarkup-link" target="_blank" rel="noreferrer">https://phabricator.kde.org/D23105</a>?</p></div></div><br /><div><strong>INLINE COMMENTS</strong><div><div style="margin: 6px 0 12px 0;"><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D23881#inline-135007">View Inline</a><span style="color: #4b4d51; font-weight: bold;">glxbackend.cpp:339</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"> <span class="n">QMetaObject</span><span style="color: #aa2211">::</span><span class="n">invokeMethod</span><span class="p">(</span><span class="n">m_asyncSwapHandler</span><span class="p">,</span> <span style="color: #aa2211">&</span><span class="n">AsyncSwapBuffersHandler</span><span style="color: #aa2211">::</span><span class="n">makeCurrent</span><span class="p">,</span> <span class="n">Qt</span><span style="color: #aa2211">::</span><span class="n">QueuedConnection</span><span class="p">);</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"> <span class="p">}</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">Is this necessary? If the swap thread isn't rendering anything I don't think it actually needs a current context, right?</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D23881#inline-135009">View Inline</a><span style="color: #4b4d51; font-weight: bold;">glxbackend.cpp:786</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"> <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">m_asyncSwapHandler</span><span class="p">)</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"> <span class="n">glFlush</span><span class="p">();</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"> <span class="n">QMetaObject</span><span style="color: #aa2211">::</span><span class="n">invokeMethod</span><span class="p">(</span><span class="n">m_asyncSwapHandler</span><span class="p">,</span> <span style="color: #aa2211">&</span><span class="n">AsyncSwapBuffersHandler</span><span style="color: #aa2211">::</span><span class="n">swapBuffers</span><span class="p">,</span> <span class="n">Qt</span><span style="color: #aa2211">::</span><span class="n">QueuedConnection</span><span class="p">);</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">I'm not 100% sure this is sufficient to ensure all rendering is complete before the swap. It only guarantees that any commands have been submitted to the GPU, but not necessarily that they've all finished executing. Furthermore, glXSwapBuffers should cause an implicit glFlush anyway.</p>
<p style="padding: 0; margin: 8px;">For instance, the glXSwapBuffers spec mentions glFinish for this purpose:</p>
<blockquote style="border-left: 3px solid #a7b5bf; color: #464c5c; font-style: italic; margin: 4px 0 12px 0; padding: 4px 12px; background-color: #f8f9fc;"><p style="padding: 0; margin: 8px;">All GLX rendering contexts share the same notion of which are front buffers and which are back buffers. One consequence is that when multiple clients are rendering to the same double-buffered window, all of them should finish rendering before one of them issues the command to swap buffers. The clients are responsible for implementing this synchronization. Typically this is accomplished by executing glFinish and then using a semaphore in shared memory to rendezvous before swapping.</p></blockquote></div></div></div></div></div><br /><div><strong>REPOSITORY</strong><div><div>R108 KWin</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D23881">https://phabricator.kde.org/D23881</a></div></div><br /><div><strong>To: </strong>fredrik, KWin, romangg<br /><strong>Cc: </strong>ekurzinger, kwin, LeGast00n, The-Feren-OS-Dev, sbergeron, jraleigh, fbampaloukas, GB_2, mkulinski, ragreen, jackyalcine, Pitel, iodelay, crozbo, bwowk, ZrenBot, ngraham, alexeymin, himcesjf, lesliezhai, ali-mohamed, hardening, romangg, jensreuterberg, abetts, sebas, apol, mart<br /></div>