fb7bf9ce02
When building with --enable-profile we now depend on the uprof-0.3 developer release which brings a few improvements: » It lets us "fix" how we initialize uprof so that instead of using a shared object constructor/destructor (which was a hack used when first adding uprof support to Clutter) we can now initialize as part of clutter's normal initialization code. As a side note though, I found that the way Clutter initializes has some quite serious problems whenever it involves GOptionGroups. It is not able to guarantee the initialization of dependencies like uprof and Cogl. For this reason we still use the contructor/destructor approach to initialize uprof in Cogl. » uprof-0.3 provides a better API for adding custom columns when reporting timer and counter statistics which lets us remove quite a lot of manual report generation code in clutter-profile.c. » uprof-0.3 provides a shared context for tracking mainloop timer statistics. This means any mainloop based library following the same "Mainloop" timer naming convention can use the shared context and no matter who ends up owning the final mainloop the statistics will always be in the same place. This allows profiling of Clutter with an external mainloop such as with the Mutter compositor. » uprof-0.3 can export statistics over dbus and comes with an ncurses based ui to vizualize timer and counter stats live. The latest version of uprof can be cloned from: git://github.com/rib/UProf.git
114 lines
4.6 KiB
C
114 lines
4.6 KiB
C
#ifndef __CLUTTER_DEBUG_H__
|
|
#define __CLUTTER_DEBUG_H__
|
|
|
|
#include <glib.h>
|
|
#include "clutter-main.h"
|
|
#include "clutter-profile.h"
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef enum {
|
|
CLUTTER_DEBUG_MISC = 1 << 0,
|
|
CLUTTER_DEBUG_ACTOR = 1 << 1,
|
|
CLUTTER_DEBUG_TEXTURE = 1 << 2,
|
|
CLUTTER_DEBUG_EVENT = 1 << 3,
|
|
CLUTTER_DEBUG_PAINT = 1 << 4,
|
|
CLUTTER_DEBUG_GL = 1 << 5,
|
|
CLUTTER_DEBUG_ALPHA = 1 << 6,
|
|
CLUTTER_DEBUG_BEHAVIOUR = 1 << 7,
|
|
CLUTTER_DEBUG_PANGO = 1 << 8,
|
|
CLUTTER_DEBUG_BACKEND = 1 << 9,
|
|
CLUTTER_DEBUG_SCHEDULER = 1 << 10,
|
|
CLUTTER_DEBUG_SCRIPT = 1 << 11,
|
|
CLUTTER_DEBUG_SHADER = 1 << 12,
|
|
CLUTTER_DEBUG_MULTISTAGE = 1 << 13,
|
|
CLUTTER_DEBUG_ANIMATION = 1 << 14,
|
|
CLUTTER_DEBUG_LAYOUT = 1 << 15,
|
|
CLUTTER_DEBUG_PICK = 1 << 16
|
|
} ClutterDebugFlag;
|
|
|
|
typedef enum {
|
|
CLUTTER_DEBUG_NOP_PICKING = 1 << 0,
|
|
CLUTTER_DEBUG_DUMP_PICK_BUFFERS = 1 << 1
|
|
} ClutterPickDebugFlag;
|
|
|
|
typedef enum {
|
|
CLUTTER_DEBUG_DISABLE_SWAP_EVENTS = 1 << 0,
|
|
CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS = 1 << 1,
|
|
CLUTTER_DEBUG_REDRAWS = 1 << 2
|
|
} ClutterDrawDebugFlag;
|
|
|
|
#ifdef CLUTTER_ENABLE_DEBUG
|
|
|
|
#define CLUTTER_HAS_DEBUG(type) ((clutter_debug_flags & CLUTTER_DEBUG_##type) != FALSE)
|
|
|
|
#ifdef __GNUC__
|
|
|
|
/* Try the GCC extension for valists in macros */
|
|
#define CLUTTER_NOTE(type,x,a...) G_STMT_START { \
|
|
if (G_UNLIKELY (CLUTTER_HAS_DEBUG (type))) \
|
|
{ _clutter_profile_trace_message ("[" #type "] " \
|
|
G_STRLOC " & " x, ##a); } \
|
|
} G_STMT_END
|
|
|
|
#define CLUTTER_TIMESTAMP(type,x,a...) G_STMT_START { \
|
|
if (G_UNLIKELY (CLUTTER_HAS_DEBUG (type))) \
|
|
{ g_message ("[" #type "]" " %li:" G_STRLOC ": " \
|
|
x, clutter_get_timestamp(), ##a); } \
|
|
} G_STMT_END
|
|
#else /* !__GNUC__ */
|
|
/* Try the C99 version; unfortunately, this does not allow us to pass
|
|
* empty arguments to the macro, which means we have to
|
|
* do an intemediate printf.
|
|
*/
|
|
#define CLUTTER_NOTE(type,...) G_STMT_START { \
|
|
if (G_UNLIKELY (CLUTTER_HAS_DEBUG (type))) \
|
|
{ \
|
|
gchar * _fmt = g_strdup_printf (__VA_ARGS__); \
|
|
_clutter_profile_trace_message ("[" #type "] " \
|
|
G_STRLOC " & %s",_fmt); \
|
|
g_free (_fmt); \
|
|
} \
|
|
} G_STMT_END
|
|
|
|
#define CLUTTER_TIMESTAMP(type,...) G_STMT_START { \
|
|
if (G_UNLIKELY (CLUTTER_HAS_DEBUG (type))) \
|
|
{ \
|
|
gchar * _fmt = g_strdup_printf (__VA_ARGS__); \
|
|
g_message ("[" #type "]" " %li:" G_STRLOC ": %s", \
|
|
clutter_get_timestamp(), _fmt); \
|
|
g_free (_fmt); \
|
|
} \
|
|
} G_STMT_END
|
|
#endif
|
|
|
|
#define CLUTTER_MARK() CLUTTER_NOTE(MISC, "== mark ==")
|
|
#define CLUTTER_DBG(x) { a }
|
|
|
|
#define CLUTTER_GLERR() G_STMT_START { \
|
|
if (clutter_debug_flags & CLUTTER_DEBUG_GL) { \
|
|
GLenum _err = glGetError (); /* roundtrip */ \
|
|
if (_err != GL_NO_ERROR) \
|
|
g_warning (G_STRLOC ": GL Error %x", _err); \
|
|
} } G_STMT_END
|
|
|
|
|
|
#else /* !CLUTTER_ENABLE_DEBUG */
|
|
|
|
#define CLUTTER_NOTE(type,...) G_STMT_START { } G_STMT_END
|
|
#define CLUTTER_MARK() G_STMT_START { } G_STMT_END
|
|
#define CLUTTER_DBG(x) G_STMT_START { } G_STMT_END
|
|
#define CLUTTER_GLERR() G_STMT_START { } G_STMT_END
|
|
#define CLUTTER_TIMESTAMP(type,...) G_STMT_START { } G_STMT_END
|
|
#define CLUTTER_HAS_DEBUG(type) FALSE
|
|
|
|
#endif /* CLUTTER_ENABLE_DEBUG */
|
|
|
|
extern guint clutter_debug_flags;
|
|
extern guint clutter_pick_debug_flags;
|
|
extern guint clutter_paint_debug_flags;
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __CLUTTER_DEBUG_H__ */
|