From 45a260b433ba289281087697eba226e0b7a25133 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sat, 10 Nov 2018 14:57:41 +0000 Subject: [PATCH 1/3] Print warning messages for multipass blur Multipass blur is not properly implemented for xrender backend. There is visible artifacts when it is used. And it is quite difficult to implement correctly and efficiently for the xrender backend. Print a warning message for multipass blur so we can survey whether it is actually been used. No functionality is removed in this commit. Signed-off-by: Yuxuan Shui --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index c5d2c5a63f..21af44b388 100644 --- a/src/config.c +++ b/src/config.c @@ -196,6 +196,12 @@ parse_conv_kern_lst(session_t *ps, const char *src, xcb_render_fixed_t **dest, i return false; } + if (i > 1) { + printf_errf("(): You are seeing this message because your are using multipass\n" + "blur. Please report an issue to us so we know multipass blur is actually been used.\n" + "Otherwise it might be removed in future releases"); + } + if (*pc) { printf_errf("(): Too many blur kernels!"); return false; From 03ff094f751665bc9847943939565e07be229afb Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sat, 10 Nov 2018 22:12:46 +0000 Subject: [PATCH 2/3] Remove GLX sync fence code It was never enabled in the old version of compton anyway. Signed-off-by: Yuxuan Shui --- src/common.h | 6 ------ src/opengl.c | 36 ------------------------------------ 2 files changed, 42 deletions(-) diff --git a/src/common.h b/src/common.h index adf297aab1..cfcfd4acb5 100644 --- a/src/common.h +++ b/src/common.h @@ -1638,9 +1638,6 @@ vsync_deinit(session_t *ps); */ ///@{ -void -xr_glx_sync(session_t *ps, Drawable d, XSyncFence *pfence); - /** * Free a GLX texture. */ @@ -1761,9 +1758,6 @@ xr_sync(session_t *ps, Drawable d, XSyncFence *pfence) { if (*pfence) XSyncResetFence(ps->dpy, *pfence); } -#ifdef OPENGL - xr_glx_sync(ps, d, pfence); -#endif } /** @name DBus handling diff --git a/src/opengl.c b/src/opengl.c index dd10b8a42a..424a4a4957 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -185,23 +185,6 @@ get_visualinfo_from_visual(session_t *ps, xcb_visualid_t visual) { return XGetVisualInfo(ps->dpy, VisualIDMask, &vreq, &nitems); } -void -xr_glx_sync(session_t *ps, Drawable d, XSyncFence *pfence) { - if (*pfence) { - // GLsync sync = ps->psglx->glFenceSyncProc(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - GLsync sync = ps->psglx->glImportSyncEXT(GL_SYNC_X11_FENCE_EXT, *pfence, 0); - /* GLenum ret = ps->psglx->glClientWaitSyncProc(sync, GL_SYNC_FLUSH_COMMANDS_BIT, - 1000); - assert(GL_CONDITION_SATISFIED == ret); */ - XSyncTriggerFence(ps->dpy, *pfence); - XFlush(ps->dpy); - ps->psglx->glWaitSyncProc(sync, 0, GL_TIMEOUT_IGNORED); - // ps->psglx->glDeleteSyncProc(sync); - // XSyncResetFence(ps->dpy, *pfence); - } - glx_check_err(ps); -} - #ifdef DEBUG_GLX_DEBUG_CONTEXT static inline GLXFBConfig get_fbconfig_from_visualinfo(session_t *ps, const XVisualInfo *visualinfo) { @@ -378,25 +361,6 @@ glx_init(session_t *ps, bool need_render) { printf_errf("(): Failed to acquire glXBindTexImageEXT() / glXReleaseTexImageEXT()."); goto glx_init_end; } - - psglx->glFenceSyncProc = (f_FenceSync) - glXGetProcAddress((const GLubyte *) "glFenceSync"); - psglx->glIsSyncProc = (f_IsSync) - glXGetProcAddress((const GLubyte *) "glIsSync"); - psglx->glDeleteSyncProc = (f_DeleteSync) - glXGetProcAddress((const GLubyte *) "glDeleteSync"); - psglx->glClientWaitSyncProc = (f_ClientWaitSync) - glXGetProcAddress((const GLubyte *) "glClientWaitSync"); - psglx->glWaitSyncProc = (f_WaitSync) - glXGetProcAddress((const GLubyte *) "glWaitSync"); - psglx->glImportSyncEXT = (f_ImportSyncEXT) - glXGetProcAddress((const GLubyte *) "glImportSyncEXT"); - if (!psglx->glFenceSyncProc || !psglx->glIsSyncProc || !psglx->glDeleteSyncProc - || !psglx->glClientWaitSyncProc || !psglx->glWaitSyncProc - || !psglx->glImportSyncEXT) { - printf_errf("(): Failed to acquire GLX sync functions."); - goto glx_init_end; - } } // Acquire FBConfigs From bcab5d15187e193388e98df8d66af24ec8f8c632 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sat, 10 Nov 2018 21:52:42 +0000 Subject: [PATCH 3/3] Workaround the incompatibility between DRI2 and xcb When using DRI2, Mesa uses XESetWireToEvent to hook into Xlib's event handling loop, so it can get notified when certain DRI2 event happens, which is crucial to the normal functioning of GLX. When xcb is owning the event queue (meaning libxcb is doing all the event handling), those functions registered by Mesa will never be called, thus GLX will malfunction, leading to screen flickers or visual artifacts. This commit uses a hack from Qt to manually call those functions in compton. Signed-off-by: Yuxuan Shui --- src/compton.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/compton.c b/src/compton.c index 13cf52e2a9..4ff426cd4f 100644 --- a/src/compton.c +++ b/src/compton.c @@ -11,6 +11,8 @@ #include #include +#include +#include #include #include #include @@ -28,6 +30,8 @@ #include "config.h" #include "diagnostic.h" +#define auto __auto_type + static void finish_destroy_win(session_t *ps, win **_w); @@ -3236,6 +3240,28 @@ ev_handle(session_t *ps, xcb_generic_event_t *ev) { } #endif + // Check if a custom XEvent constructor was registered in xlib for this event + // type, and call it discarding the constructed XEvent if any. XESetWireToEvent + // might be used by libraries to intercept messages from the X server e.g. the + // OpenGL lib waiting for DRI2 events. + + // XXX This exists to workaround compton issue #33, #34, #47 + // For even more details, see: + // https://bugs.freedesktop.org/show_bug.cgi?id=35945 + // https://lists.freedesktop.org/archives/xcb/2011-November/007337.html + auto proc = XESetWireToEvent(ps->dpy, ev->response_type, 0); + if (proc) { + XESetWireToEvent(ps->dpy, ev->response_type, proc); + XEvent dummy; + + // Stop Xlib from complaining about lost sequence numbers. + // proc might also just be Xlib internal event processing functions, and + // because they probably won't see all X replies, they will complain about + // missing sequence numbers. + ev->sequence = LastKnownRequestProcessed(ps->dpy); + proc(ps->dpy, &dummy, (xEvent *)ev); + } + // XXX redraw needs to be more fine grained queue_redraw(ps);