From 1dd41253b22c78bf3cd4497895c906fe07cb209b Mon Sep 17 00:00:00 2001 From: Richard Grenville Date: Thu, 25 Apr 2013 09:27:14 +0800 Subject: Misc: Fix wrong description & DEBUG_GLX_ERR - Fix description of "opengl" VSync. - Add DEBUG_GLX_ERR to check for OpenGL errors. - Update man page. --- compton.c | 2 +- opengl.c | 36 ++++++++++++++++++++++++++++++++++++ opengl.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) 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 +#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. */ -- cgit v1.2.1