Misc: Add DEBUG_GLX_MARK & Misc

- GLX backend: Add DEBUG_GLX_MARK, to add GL marks around functions with
  glStringMarkerGREMEDY(), and mark frame termination with
  glFrameTerminatorGREMEDY().

- Print output of `compton -h` to stdout. (#110)

- GLX backend: Strip out elements with factor 0 in GLSL blur code.
  Thanks to jrfonseca for guides. (#107)
This commit is contained in:
Richard Grenville 2013-05-12 18:21:16 +08:00
parent 90099d371d
commit 57d8b940e7
5 changed files with 85 additions and 7 deletions

View File

@ -317,6 +317,11 @@ typedef void (*f_ReleaseTexImageEXT) (Display *display, GLXDrawable drawable, in
typedef void (*f_CopySubBuffer) (Display *dpy, GLXDrawable drawable, int x, int y, int width, int height); typedef void (*f_CopySubBuffer) (Display *dpy, GLXDrawable drawable, int x, int y, int width, int height);
#ifdef DEBUG_GLX_MARK
typedef void (*f_StringMarkerGREMEDY) (GLsizei len, const void *string);
typedef void (*f_FrameTerminatorGREMEDY) (void);
#endif
/// @brief Wrapper of a GLX FBConfig. /// @brief Wrapper of a GLX FBConfig.
typedef struct { typedef struct {
GLXFBConfig cfg; GLXFBConfig cfg;
@ -688,6 +693,12 @@ typedef struct {
f_ReleaseTexImageEXT glXReleaseTexImageProc; f_ReleaseTexImageEXT glXReleaseTexImageProc;
/// Pointer to glXCopySubBufferMESA function. /// Pointer to glXCopySubBufferMESA function.
f_CopySubBuffer glXCopySubBufferProc; f_CopySubBuffer glXCopySubBufferProc;
#ifdef DEBUG_GLX_MARK
/// Pointer to StringMarkerGREMEDY function.
f_StringMarkerGREMEDY glStringMarkerGREMEDY;
/// Pointer to FrameTerminatorGREMEDY function.
f_FrameTerminatorGREMEDY glFrameTerminatorGREMEDY;
#endif
/// FBConfig-s for GLX pixmap of different depths. /// FBConfig-s for GLX pixmap of different depths.
glx_fbconfig_t *glx_fbconfigs[OPENGL_MAX_DEPTH + 1]; glx_fbconfig_t *glx_fbconfigs[OPENGL_MAX_DEPTH + 1];
#ifdef CONFIG_VSYNC_OPENGL_GLSL #ifdef CONFIG_VSYNC_OPENGL_GLSL
@ -1803,6 +1814,38 @@ glx_create_program(const GLuint * const shaders, int nshaders);
#endif #endif
#endif #endif
/**
* Add a OpenGL debugging marker.
*/
static inline void
glx_mark_(session_t *ps, const char *func, XID xid, bool start) {
#ifdef DEBUG_GLX_MARK
if (BKEND_GLX == ps->o.backend && ps->glStringMarkerGREMEDY) {
if (!func) func = "(unknown)";
const char *postfix = (start ? " (start)": " (end)");
char *str = malloc((strlen(func) + 12 + 2
+ strlen(postfix) + 5) * sizeof(char));
strcpy(str, func);
sprintf(str + strlen(str), "(%#010lx)%s", xid, postfix);
ps->glStringMarkerGREMEDY(strlen(str), str);
free(str);
}
#endif
}
#define glx_mark(ps, xid, start) glx_mark_(ps, __func__, xid, start)
/**
* Add a OpenGL debugging marker.
*/
static inline void
glx_mark_frame(session_t *ps) {
#ifdef DEBUG_GLX_MARK
if (BKEND_GLX == ps->o.backend && ps->glFrameTerminatorGREMEDY)
ps->glFrameTerminatorGREMEDY();
#endif
}
static inline void static inline void
free_texture(session_t *ps, glx_texture_t **pptex) { free_texture(session_t *ps, glx_texture_t **pptex) {
#ifdef CONFIG_VSYNC_OPENGL #ifdef CONFIG_VSYNC_OPENGL

View File

@ -1402,6 +1402,8 @@ render(session_t *ps, int x, int y, int dx, int dy, int wid, int hei,
static inline void static inline void
win_paint_win(session_t *ps, win *w, XserverRegion reg_paint, win_paint_win(session_t *ps, win *w, XserverRegion reg_paint,
const reg_data_t *pcache_reg) { const reg_data_t *pcache_reg) {
glx_mark(ps, w->id, true);
// Fetch Pixmap // Fetch Pixmap
if (!w->paint.pixmap && ps->has_name_pixmap) { if (!w->paint.pixmap && ps->has_name_pixmap) {
set_ignore_next(ps); set_ignore_next(ps);
@ -1564,6 +1566,8 @@ win_paint_win(session_t *ps, win *w, XserverRegion reg_paint,
#endif #endif
} }
} }
glx_mark(ps, w->id, false);
} }
/** /**
@ -1812,6 +1816,7 @@ paint_all(session_t *ps, XserverRegion region, XserverRegion region_real, win *t
default: default:
assert(0); assert(0);
} }
glx_mark_frame(ps);
if (ps->o.vsync_aggressive) if (ps->o.vsync_aggressive)
vsync_wait(ps); vsync_wait(ps);
@ -4050,7 +4055,7 @@ ev_handle(session_t *ps, XEvent *ev) {
* Print usage text and exit. * Print usage text and exit.
*/ */
static void static void
usage(void) { usage(int ret) {
#define WARNING_DISABLED " (DISABLED AT COMPILE TIME)" #define WARNING_DISABLED " (DISABLED AT COMPILE TIME)"
#define WARNING #define WARNING
const static char *usage_text = const static char *usage_text =
@ -4277,11 +4282,12 @@ usage(void) {
" Specify window ID to repaint in benchmark mode. If omitted or is 0,\n" " Specify window ID to repaint in benchmark mode. If omitted or is 0,\n"
" the whole screen is repainted.\n" " the whole screen is repainted.\n"
; ;
fputs(usage_text , stderr); FILE *f = (ret ? stderr: stdout);
fputs(usage_text, f);
#undef WARNING #undef WARNING
#undef WARNING_DISABLED #undef WARNING_DISABLED
exit(1); exit(ret);
} }
/** /**
@ -4903,7 +4909,7 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
else if ('d' == o) else if ('d' == o)
ps->o.display = mstrcpy(optarg); ps->o.display = mstrcpy(optarg);
else if ('?' == o || ':' == o) else if ('?' == o || ':' == o)
usage(); usage(1);
} }
// Check for abundant positional arguments // Check for abundant positional arguments
@ -4944,7 +4950,7 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
#define P_CASEBOOL(idx, option) case idx: ps->o.option = true; break #define P_CASEBOOL(idx, option) case idx: ps->o.option = true; break
// Short options // Short options
case 'h': case 'h':
usage(); usage(0);
break; break;
case 'd': case 'd':
break; break;
@ -5118,7 +5124,7 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
break; break;
P_CASEBOOL(303, glx_use_gpushader4); P_CASEBOOL(303, glx_use_gpushader4);
default: default:
usage(); usage(1);
break; break;
#undef P_CASEBOOL #undef P_CASEBOOL
} }

View File

@ -813,7 +813,7 @@ ev_window(session_t *ps, XEvent *ev);
#endif #endif
static void __attribute__ ((noreturn)) static void __attribute__ ((noreturn))
usage(void); usage(int ret);
static bool static bool
register_cm(session_t *ps); register_cm(session_t *ps);

View File

@ -605,6 +605,20 @@ cdbus_process(session_t *ps, DBusMessage *msg) {
"org.freedesktop.DBus.Introspectable", "Introspect")) { "org.freedesktop.DBus.Introspectable", "Introspect")) {
success = cdbus_process_introspect(ps, msg); success = cdbus_process_introspect(ps, msg);
} }
else if (dbus_message_is_method_call(msg,
"org.freedesktop.DBus.Peer", "Ping")) {
cdbus_reply(ps, msg, NULL, NULL);
success = true;
}
else if (dbus_message_is_method_call(msg,
"org.freedesktop.DBus.Peer", "GetMachineId")) {
char *uuid = dbus_get_local_machine_id();
if (uuid) {
cdbus_reply_string(ps, msg, uuid);
dbus_free(uuid);
success = true;
}
}
else if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameAcquired") else if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameAcquired")
|| dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameLost")) { || dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameLost")) {
success = true; success = true;
@ -1028,6 +1042,12 @@ cdbus_process_introspect(session_t *ps, DBusMessage *msg) {
" <arg name='data' direction='out' type='s' />\n" " <arg name='data' direction='out' type='s' />\n"
" </method>\n" " </method>\n"
" </interface>\n" " </interface>\n"
" <interface name='org.freedesktop.DBus.Peer'>\n"
" <method name='Ping' />\n"
" <method name='GetMachineId'>\n"
" <arg name='machine_uuid' direction='out' type='s' />\n"
" </method>\n"
" </interface>\n"
" <interface name='" CDBUS_INTERFACE_NAME "'>\n" " <interface name='" CDBUS_INTERFACE_NAME "'>\n"
" <signal name='win_added'>\n" " <signal name='win_added'>\n"
" <arg name='wid' type='" CDBUS_TYPE_WINDOW_STR "'/>\n" " <arg name='wid' type='" CDBUS_TYPE_WINDOW_STR "'/>\n"

View File

@ -90,6 +90,13 @@ glx_init(session_t *ps, bool need_render) {
// Acquire function addresses // Acquire function addresses
if (need_render) { if (need_render) {
#ifdef DEBUG_GLX_MARK
ps->glStringMarkerGREMEDY = (f_StringMarkerGREMEDY)
glXGetProcAddress((const GLubyte *) "glStringMarkerGREMEDY");
ps->glFrameTerminatorGREMEDY = (f_FrameTerminatorGREMEDY)
glXGetProcAddress((const GLubyte *) "glFrameTerminatorGREMEDY");
#endif
ps->glXBindTexImageProc = (f_BindTexImageEXT) ps->glXBindTexImageProc = (f_BindTexImageEXT)
glXGetProcAddress((const GLubyte *) "glXBindTexImageEXT"); glXGetProcAddress((const GLubyte *) "glXBindTexImageEXT");
ps->glXReleaseTexImageProc = (f_ReleaseTexImageEXT) ps->glXReleaseTexImageProc = (f_ReleaseTexImageEXT)
@ -249,6 +256,8 @@ glx_init_blur(session_t *ps) {
if (hei / 2 == i && wid / 2 == j) if (hei / 2 == i && wid / 2 == j)
continue; continue;
double val = XFixedToDouble(ps->o.blur_kern[2 + i * wid + j]); double val = XFixedToDouble(ps->o.blur_kern[2 + i * wid + j]);
if (0.0 == val)
continue;
sum += val; sum += val;
sprintf(pc, shader_add, val, texture_func, j - wid / 2, i - hei / 2); sprintf(pc, shader_add, val, texture_func, j - wid / 2, i - hei / 2);
pc += strlen(pc); pc += strlen(pc);