mutter/cogl/cogl-profile.c
Robert Bragg 0e7a632e13 Adds initial Emscripten support to Cogl
This enables basic Emscripten support in Cogl via the SDL winsys.
Assuming you have setup an emscripten toolchain you can configure Cogl
like this:

 emconfigure ./configure --enable-debug --enable-emscripten

Building the examples will build .html files that can be loaded directly
by a WebGL enabled browser.

Note: at this point the emscripten support has just barely been smoke
tested so it's expected that as we continue to build on this we will
learn about more things we need to change in Cogl to full support this
environment.

Reviewed-by: Neil Roberts <neil@linux.intel.com>

(cherry picked from commit a3bc2e7539391b074e697839dfae60b69c37cf10)
2013-05-29 19:30:44 +01:00

127 lines
4.1 KiB
C

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef COGL_ENABLE_PROFILE
#include "cogl-profile.h"
#include "cogl-debug.h"
#include "cogl-i18n-private.h"
#include <stdlib.h>
UProfContext *_cogl_uprof_context;
static CoglBool
debug_option_getter (void *user_data)
{
unsigned int shift = GPOINTER_TO_UINT (user_data);
return COGL_DEBUG_ENABLED (shift);
}
static void
debug_option_setter (CoglBool value, void *user_data)
{
unsigned int shift = GPOINTER_TO_UINT (user_data);
if (value)
COGL_DEBUG_SET_FLAG (shift);
else
COGL_DEBUG_CLEAR_FLAG (shift);
}
static void
print_exit_report (void)
{
if (getenv ("COGL_PROFILE_OUTPUT_REPORT"))
{
UProfContext *mainloop_context;
UProfTimerResult *mainloop_timer;
UProfReport *report;
/* NB: uprof provides a shared context for mainloop statistics
* which needs to be setup by the application which controls the
* mainloop.
*
* If no "Mainloop" timer has been setup then we print a warning
* since we can't provide a meaningful Cogl report without one.
*/
mainloop_context = uprof_get_mainloop_context ();
mainloop_timer = uprof_context_get_timer_result (mainloop_context,
"Mainloop");
/* just bail out if the mainloop timer wasn't hit */
if (!mainloop_timer)
{
g_warning ("\n\n"
"No UProf \"Mainloop\" timer was setup by the "
"application therefore we\ncan't provide a meaningful "
"profile report.\n"
"\n"
"This should be done automatically if you are using Clutter "
"(if\nbuilt with --enable-profile)\n"
"\n"
"If you aren't using Clutter then you can declare a "
"\"Mainloop\" UProf\ntimer in your application like this:\n\n"
" UPROF_STATIC_TIMER (mainloop_timer, \n"
" NULL,\n"
" \"Mainloop\",\n"
" \"Time in glib mainloop\",\n"
" 0);\n"
"\n"
"And start/stop it around your mainloop like this:\n"
"\n"
" UPROF_TIMER_START (uprof_get_mainloop_context (), mainloop_timer);\n"
" g_main_loop_run (loop);\n"
" UPROF_TIMER_STOP (uprof_get_mainloop_context (), mainloop_timer);\n");
return;
}
report = uprof_report_new ("Cogl report");
uprof_report_add_context (report, _cogl_uprof_context);
uprof_report_print (report);
uprof_report_unref (report);
}
uprof_context_unref (_cogl_uprof_context);
}
void
_cogl_uprof_init (void)
{
_cogl_uprof_context = uprof_context_new ("Cogl");
uprof_context_link (_cogl_uprof_context, uprof_get_mainloop_context ());
#define OPT(MASK_NAME, GROUP, NAME, NAME_FORMATTED, DESCRIPTION) \
G_STMT_START { \
int shift = COGL_DEBUG_ ## MASK_NAME; \
uprof_context_add_boolean_option (_cogl_uprof_context, \
g_dgettext (GETTEXT_PACKAGE, GROUP), \
NAME, \
g_dgettext (GETTEXT_PACKAGE, \
NAME_FORMATTED), \
g_dgettext (GETTEXT_PACKAGE, \
DESCRIPTION), \
debug_option_getter, \
debug_option_setter, \
GUINT_TO_POINTER (shift)); \
} G_STMT_END;
#include "cogl-debug-options.h"
#undef OPT
atexit (print_exit_report);
}
void
_cogl_profile_trace_message (const char *format, ...)
{
va_list ap;
va_start (ap, format);
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, ap);
va_end (ap);
if (_cogl_uprof_context)
uprof_context_vtrace_message (_cogl_uprof_context, format, ap);
}
#endif