u/trace_marker: Refactor init to fix bug

This commit is contained in:
Jakob Bornecrantz 2021-06-14 19:11:45 +01:00
parent c2c49cb6d3
commit aa3f071d2b
5 changed files with 69 additions and 36 deletions
src/xrt

View file

@ -15,10 +15,11 @@
#include "util/u_trace_marker.h"
#ifdef XRT_FEATURE_TRACING
#include <inttypes.h>
#ifdef XRT_FEATURE_TRACING
PERCETTO_CATEGORY_DEFINE(U_TRACE_CATEGORIES)
PERCETTO_TRACK_DEFINE(rt_cpu, PERCETTO_TRACK_EVENTS);
@ -31,13 +32,14 @@ PERCETTO_TRACK_DEFINE(rt_present, PERCETTO_TRACK_EVENTS);
PERCETTO_TRACK_DEFINE(ft_cpu, PERCETTO_TRACK_EVENTS);
PERCETTO_TRACK_DEFINE(ft_draw, PERCETTO_TRACK_EVENTS);
static enum u_trace_which static_which;
static bool static_inited = false;
void
u_tracer_maker_init(enum u_trace_which which)
u_trace_marker_setup(enum u_trace_which which)
{
int ret = PERCETTO_INIT(PERCETTO_CLOCK_MONOTONIC);
if (ret != 0) {
return;
}
static_which = which;
I_PERCETTO_TRACK_PTR(rt_cpu)->name = "RT 1 Sleep";
I_PERCETTO_TRACK_PTR(rt_allotted)->name = "RT 2 Allotted time";
@ -49,8 +51,22 @@ u_tracer_maker_init(enum u_trace_which which)
I_PERCETTO_TRACK_PTR(ft_cpu)->name = "FT 1 App";
I_PERCETTO_TRACK_PTR(ft_draw)->name = "FT 2 Draw";
}
if (which == U_TRACE_WHICH_SERVICE) {
void
u_trace_marker_init(void)
{
if (static_inited) {
return;
}
static_inited = true;
int ret = PERCETTO_INIT(PERCETTO_CLOCK_MONOTONIC);
if (ret != 0) {
return;
}
if (static_which == U_TRACE_WHICH_SERVICE) {
PERCETTO_REGISTER_TRACK(rt_cpu);
PERCETTO_REGISTER_TRACK(rt_allotted);
PERCETTO_REGISTER_TRACK(rt_gpu);
@ -62,27 +78,22 @@ u_tracer_maker_init(enum u_trace_which which)
PERCETTO_REGISTER_TRACK(ft_cpu);
PERCETTO_REGISTER_TRACK(ft_draw);
}
/*
*
* Hack to get consistent names.
* https://github.com/olvaffe/percetto/issues/15
*
*/
os_nanosleep(1000 * 1000);
// But also shows when the app was started.
XRT_TRACE_MARKER();
}
#else /* XRT_FEATURE_TRACING */
void
u_tracer_maker_init(enum u_trace_which which)
u_trace_marker_setup(enum u_trace_which which)
{
(void)which;
// Noop
}
void
u_trace_marker_init(void)
{
// Noop
}
#endif /* XRT_FEATURE_TRACING */

View file

@ -37,12 +37,20 @@ enum u_trace_which
};
/*!
* Internal init function, use @ref U_TRACE_TARGET_INIT, see @ref tracing.
* Internal setup function, use @ref U_TRACE_TARGET_SETUP, see @ref tracing.
*
* @ingroup aux_util
*/
void
u_tracer_maker_init(enum u_trace_which which);
u_trace_marker_setup(enum u_trace_which which);
/*!
* Must be called from a non-static/global constructor context.
*
* @ingroup aux_util
*/
void
u_trace_marker_init(void);
#define VK_TRACE_IDENT(IDENT) U_TRACE_EVENT(vk, #IDENT)
#define XRT_TRACE_MARKER() U_TRACE_EVENT(xrt, __func__)
@ -100,12 +108,12 @@ PERCETTO_TRACK_DECLARE(ft_draw);
TRACE_ANY_WITH_ARGS(PERCETTO_EVENT_INSTANT, CATEGORY, &g_percetto_track_##TRACK, TIME, NAME, 0)
#define U_TRACE_DATA(fd, type, data) u_trace_data(fd, type, (void *)&(data), sizeof(data))
#define U_TRACE_TARGET_INIT(WHICH) \
void __attribute__((constructor(101))) u_trace_maker_constructor(void); \
#define U_TRACE_TARGET_SETUP(WHICH) \
void __attribute__((constructor(101))) u_trace_marker_constructor(void); \
\
void u_trace_maker_constructor(void) \
void u_trace_marker_constructor(void) \
{ \
u_tracer_maker_init(WHICH); \
u_trace_marker_setup(WHICH); \
}
@ -145,7 +153,7 @@ PERCETTO_TRACK_DECLARE(ft_draw);
*
* @ingroup aux_util
*/
#define U_TRACE_TARGET_INIT(WHICH)
#define U_TRACE_TARGET_SETUP(WHICH)
#endif // XRT_FEATURE_TRACING

View file

@ -6,16 +6,23 @@
* @author Jakob Bornecrantz <jakob@collabora.com>
*/
#include "xrt/xrt_gfx_native.h"
#include "util/u_trace_marker.h"
#include "target_instance_parts.h"
#include "xrt/xrt_gfx_native.h"
/*
*
* Internal functions.
*
*/
static int
t_instance_create_system_compositor(struct xrt_instance *xinst,
struct xrt_device *xdev,
struct xrt_system_compositor **out_xsysc)
{
struct xrt_system_compositor *xsysc = NULL;
xrt_result_t ret = xrt_gfx_provider_create_system(xdev, &xsysc);
if (ret < 0 || xsysc == NULL) {
@ -27,6 +34,7 @@ t_instance_create_system_compositor(struct xrt_instance *xinst,
return 0;
}
/*
*
* Exported function(s).
@ -38,6 +46,8 @@ xrt_instance_create(struct xrt_instance_info *i_info, struct xrt_instance **out_
{
struct xrt_prober *xp = NULL;
u_trace_marker_init();
int ret = xrt_prober_create_with_lists(&xp, &target_lists);
if (ret < 0) {
return ret;

View file

@ -13,8 +13,8 @@
#ifdef XRT_FEATURE_SERVICE
// Insert the on load constructor to init trace marker.
U_TRACE_TARGET_INIT(U_TRACE_WHICH_OPENXR)
// Insert the on load constructor to setup trace marker.
U_TRACE_TARGET_SETUP(U_TRACE_WHICH_OPENXR)
#include "xrt/xrt_instance.h"
@ -25,6 +25,8 @@ ipc_instance_create(struct xrt_instance_info *i_info, struct xrt_instance **out_
int
xrt_instance_create(struct xrt_instance_info *i_info, struct xrt_instance **out_xinst)
{
u_trace_marker_init();
XRT_TRACE_MARKER();
return ipc_instance_create(i_info, out_xinst);
@ -32,8 +34,8 @@ xrt_instance_create(struct xrt_instance_info *i_info, struct xrt_instance **out_
#else
// Insert the on load constructor to init trace marker.
U_TRACE_TARGET_INIT(U_TRACE_WHICH_SERVICE)
// Insert the on load constructor to setup trace marker.
U_TRACE_TARGET_SETUP(U_TRACE_WHICH_SERVICE)
/*
* For non-service runtime, xrt_instance_create defined in target_instance

View file

@ -14,7 +14,7 @@
// Insert the on load constructor to init trace marker.
U_TRACE_TARGET_INIT(U_TRACE_WHICH_SERVICE)
U_TRACE_TARGET_SETUP(U_TRACE_WHICH_SERVICE)
int
ipc_server_main(int argc, char *argv[]);
@ -23,5 +23,7 @@ ipc_server_main(int argc, char *argv[]);
int
main(int argc, char *argv[])
{
u_trace_marker_init();
return ipc_server_main(argc, argv);
}