mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-24 17:10:05 +01:00
glamor: Don't glFlush/ctx switch unless any work has been performed
`glamor_make_current` is always called before any calls to GL.
Apply some dirty-tracking to whenever we call `glamor_make_current` so
that we can avoid a decent amount of redundant GL work on each
Dispatch cycle.
Gamescope previously was waking up an empty Xwayland server with an
XQueryPointer and I noticed a significant amount of churn doing
redundant GL work.
This has been addressed on the Gamescope side as well, but avoiding any
useless GL context switches and flushes when glamor is doing nothing
is still beneficial for CPU and power usage on portable devices.
Signed-off-by: Joshua Ashton <joshua@froggi.es>
Reviewed-by: Emma Anholt <emma@anholt.net>
Acked-by: Olivier Fourdan <ofourdan@redhat.com
(cherry picked from commit 89163917e1)
This commit is contained in:
parent
667afc6f8d
commit
d2e27b0a8c
4 changed files with 15 additions and 7 deletions
|
|
@ -271,9 +271,7 @@ void
|
|||
glamor_block_handler(ScreenPtr screen)
|
||||
{
|
||||
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
|
||||
|
||||
glamor_make_current(glamor_priv);
|
||||
glFlush();
|
||||
glamor_flush(glamor_priv);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -281,8 +279,7 @@ _glamor_block_handler(ScreenPtr screen, void *timeout)
|
|||
{
|
||||
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
|
||||
|
||||
glamor_make_current(glamor_priv);
|
||||
glFlush();
|
||||
glamor_flush(glamor_priv);
|
||||
|
||||
screen->BlockHandler = glamor_priv->saved_procs.block_handler;
|
||||
screen->BlockHandler(screen, timeout);
|
||||
|
|
|
|||
|
|
@ -313,6 +313,7 @@ typedef struct glamor_screen_private {
|
|||
Bool suppress_gl_out_of_memory_logging;
|
||||
Bool logged_any_fbo_allocation_failure;
|
||||
Bool logged_any_pbo_allocation_failure;
|
||||
Bool dirty;
|
||||
|
||||
/* xv */
|
||||
glamor_program xv_prog;
|
||||
|
|
|
|||
|
|
@ -52,8 +52,7 @@ glamor_sync_fence_set_triggered (SyncFence *fence)
|
|||
struct glamor_sync_fence *glamor_fence = glamor_get_sync_fence(fence);
|
||||
|
||||
/* Flush pending rendering operations */
|
||||
glamor_make_current(glamor);
|
||||
glFlush();
|
||||
glamor_flush(glamor);
|
||||
|
||||
fence->funcs.SetTriggered = glamor_fence->set_triggered;
|
||||
fence->funcs.SetTriggered(fence);
|
||||
|
|
|
|||
|
|
@ -672,6 +672,17 @@ glamor_make_current(glamor_screen_private *glamor_priv)
|
|||
lastGLContext = glamor_priv->ctx.ctx;
|
||||
glamor_priv->ctx.make_current(&glamor_priv->ctx);
|
||||
}
|
||||
glamor_priv->dirty = TRUE;
|
||||
}
|
||||
|
||||
static inline void
|
||||
glamor_flush(glamor_screen_private *glamor_priv)
|
||||
{
|
||||
if (glamor_priv->dirty) {
|
||||
glamor_make_current(glamor_priv);
|
||||
glFlush();
|
||||
glamor_priv->dirty = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static inline BoxRec
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue