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:
parent
90099d371d
commit
57d8b940e7
43
src/common.h
43
src/common.h
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
20
src/dbus.c
20
src/dbus.c
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue