summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compton.c2
-rw-r--r--opengl.c36
-rw-r--r--opengl.h48
3 files changed, 85 insertions, 1 deletions
diff --git a/compton.c b/compton.c
index eb94d9b5c..00849cb0f 100644
--- a/compton.c
+++ b/compton.c
@@ -4175,7 +4175,7 @@ usage(void) {
#else
#define WARNING
#endif
- " opengl = Try to VSync with SGI_swap_control OpenGL extension. Only\n"
+ " opengl = Try to VSync with SGI_video_sync OpenGL extension. Only\n"
" work on some drivers." WARNING"\n"
" opengl-oml = Try to VSync with OML_sync_control OpenGL extension.\n"
" Only work on some drivers. Experimental." WARNING"\n"
diff --git a/opengl.c b/opengl.c
index 2ea8a8c15..eb65e4f4c 100644
--- a/opengl.c
+++ b/opengl.c
@@ -238,6 +238,10 @@ glx_init_blur(session_t *ps) {
#undef P_GET_UNIFM_LOC
+#ifdef DEBUG_GLX_ERR
+ glx_check_err(ps);
+#endif
+
return true;
#else
printf_errf("(): GLSL support not compiled in. Cannot do blur with GLX backend.");
@@ -515,6 +519,10 @@ glx_bind_pixmap(session_t *ps, glx_texture_t **pptex, Pixmap pixmap,
glBindTexture(ptex->target, 0);
glDisable(ptex->target);
+#ifdef DEBUG_GLX_ERR
+ glx_check_err(ps);
+#endif
+
return true;
}
@@ -535,6 +543,10 @@ glx_release_pixmap(session_t *ps, glx_texture_t *ptex) {
glXDestroyPixmap(ps->dpy, ptex->glpixmap);
ptex->glpixmap = 0;
}
+
+#ifdef DEBUG_GLX_ERR
+ glx_check_err(ps);
+#endif
}
/**
@@ -585,6 +597,10 @@ glx_paint_pre(session_t *ps, XserverRegion *preg) {
free_region(ps, &all_damage_last);
glx_set_clip(ps, *preg, NULL);
+
+#ifdef DEBUG_GLX_ERR
+ glx_check_err(ps);
+#endif
}
/**
@@ -664,6 +680,10 @@ glx_set_clip(session_t *ps, XserverRegion reg, const reg_data_t *pcache_reg) {
}
cxfree(rects_free);
+
+#ifdef DEBUG_GLX_ERR
+ glx_check_err(ps);
+#endif
}
#define P_PAINTREG_START() \
@@ -783,6 +803,10 @@ glx_blur_dst(session_t *ps, int dx, int dy, int width, int height, float z,
glDeleteTextures(1, &tex_scr);
glDisable(tex_tgt);
+#ifdef DEBUG_GLX_ERR
+ glx_check_err(ps);
+#endif
+
return true;
}
@@ -816,6 +840,10 @@ glx_dim_dst(session_t *ps, int dx, int dy, int width, int height, float z,
glColor4f(0.0f, 0.0f, 0.0f, 0.0f);
glDisable(GL_BLEND);
+#ifdef DEBUG_GLX_ERR
+ glx_check_err(ps);
+#endif
+
return true;
}
@@ -999,6 +1027,10 @@ glx_render(session_t *ps, const glx_texture_t *ptex,
glActiveTexture(GL_TEXTURE0);
}
+#ifdef DEBUG_GLX_ERR
+ glx_check_err(ps);
+#endif
+
return true;
}
@@ -1029,6 +1061,10 @@ glx_swap_copysubbuffermesa(session_t *ps, XserverRegion reg) {
}
}
+#ifdef DEBUG_GLX_ERR
+ glx_check_err(ps);
+#endif
+
cxfree(rects);
}
diff --git a/opengl.h b/opengl.h
index 7f6dae696..f6ba09b60 100644
--- a/opengl.h
+++ b/opengl.h
@@ -12,6 +12,54 @@
#include <ctype.h>
+#ifdef DEBUG_GLX_ERR
+
+/**
+ * Get a textual representation of an OpenGL error.
+ */
+static inline const char *
+glx_dump_err_str(GLenum err) {
+ switch (err) {
+ CASESTRRET(GL_NO_ERROR);
+ CASESTRRET(GL_INVALID_ENUM);
+ CASESTRRET(GL_INVALID_VALUE);
+ CASESTRRET(GL_INVALID_OPERATION);
+ CASESTRRET(GL_INVALID_FRAMEBUFFER_OPERATION);
+ CASESTRRET(GL_OUT_OF_MEMORY);
+ CASESTRRET(GL_STACK_UNDERFLOW);
+ CASESTRRET(GL_STACK_OVERFLOW);
+ }
+
+ return NULL;
+}
+
+/**
+ * Check for GLX error.
+ *
+ * http://blog.nobel-joergensen.com/2013/01/29/debugging-opengl-using-glgeterror/
+ */
+static inline void
+glx_check_err_(session_t *ps, const char *func, int line) {
+ if (!ps->glx_context) return;
+
+ GLenum err = GL_NO_ERROR;
+
+ while (GL_NO_ERROR != (err = glGetError())) {
+ print_timestamp(ps);
+ printf("%s():%d: GLX error ", func, line);
+ const char *errtext = glx_dump_err_str(err);
+ if (errtext) {
+ printf_dbg("%s\n", errtext);
+ }
+ else {
+ printf_dbg("%d\n", err);
+ }
+ }
+}
+
+#define glx_check_err(ps) glx_check_err_(ps, __func__, __LINE__)
+#endif
+
/**
* Check if a word is in string.
*/