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/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); 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; 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