diff --git a/src/backend/gl/gl_common.c b/src/backend/gl/gl_common.c index 2d0acf48..ae539bf8 100644 --- a/src/backend/gl/gl_common.c +++ b/src/backend/gl/gl_common.c @@ -834,6 +834,15 @@ bool gl_init(struct gl_data *gd, session_t *ps) { log_add_target_tls(gd->logger); } + const char *vendor = (const char *)glGetString(GL_VENDOR); + log_debug("GL_VENDOR = %s", vendor); + if (strcmp(vendor, "NVIDIA Corporation") == 0) { + log_info("GL vendor is NVIDIA, don't use glFinish"); + gd->is_nvidia = true; + } else { + gd->is_nvidia = false; + } + return true; } diff --git a/src/backend/gl/gl_common.h b/src/backend/gl/gl_common.h index 993b6691..ebcc1bae 100644 --- a/src/backend/gl/gl_common.h +++ b/src/backend/gl/gl_common.h @@ -60,6 +60,8 @@ typedef struct gl_texture { struct gl_data { backend_t base; + // If we are using proprietary NVIDIA driver + bool is_nvidia; // Height and width of the viewport int height, width; int npasses; diff --git a/src/backend/gl/glx.c b/src/backend/gl/glx.c index 0c1d2dde..c14cb6eb 100644 --- a/src/backend/gl/glx.c +++ b/src/backend/gl/glx.c @@ -435,6 +435,10 @@ err: static void glx_present(backend_t *base) { struct _glx_data *gd = (void *)base; glXSwapBuffers(gd->display, gd->target_win); + // XXX there should be no need to block compton will wait for render to finish + if (!gd->gl.is_nvidia) { + glXWaitGL(); + } } static int glx_buffer_age(backend_t *base) {