blob: c13a3821158e395286444dfc1d780868af9928fe [file] [log] [blame]
/*
* Copyright 2022 Google LLC
* SPDX-License-Identifier: MIT
*/
#ifndef CPU_TRACE_H
#define CPU_TRACE_H
#include "u_perfetto.h"
#include "util/macros.h"
#if defined(HAVE_PERFETTO)
/* note that util_perfetto_is_category_enabled always returns false util
* util_perfetto_init is called
*/
#define _MESA_TRACE_BEGIN(category, name) \
do { \
if (unlikely(util_perfetto_is_category_enabled(category))) \
util_perfetto_trace_begin(category, name); \
} while (0)
#define _MESA_TRACE_END(category) \
do { \
if (unlikely(util_perfetto_is_category_enabled(category))) \
util_perfetto_trace_end(category); \
} while (0)
/* NOTE: for now disable atrace for C++ to workaround a ndk bug with ordering
* between stdatomic.h and atomic.h. See:
*
* https://github.com/android/ndk/issues/1178
*/
#elif defined(ANDROID) && !defined(__cplusplus)
#include <cutils/trace.h>
#define _MESA_TRACE_BEGIN(category, name) \
atrace_begin(ATRACE_TAG_GRAPHICS, name)
#define _MESA_TRACE_END(category) atrace_end(ATRACE_TAG_GRAPHICS)
#else
#define _MESA_TRACE_BEGIN(category, name)
#define _MESA_TRACE_END(category)
#endif /* HAVE_PERFETTO */
#if __has_attribute(cleanup) && __has_attribute(unused)
#define _MESA_TRACE_SCOPE_VAR_CONCAT(name, suffix) name##suffix
#define _MESA_TRACE_SCOPE_VAR(suffix) \
_MESA_TRACE_SCOPE_VAR_CONCAT(_mesa_trace_scope_, suffix)
/* This must expand to a single non-scoped statement for
*
* if (cond)
* _MESA_TRACE_SCOPE(...)
*
* to work.
*/
#define _MESA_TRACE_SCOPE(category, name) \
int _MESA_TRACE_SCOPE_VAR(__LINE__) \
__attribute__((cleanup(_mesa_trace_scope_end), unused)) = \
_mesa_trace_scope_begin(category, name)
static inline int
_mesa_trace_scope_begin(enum util_perfetto_category category,
const char *name)
{
_MESA_TRACE_BEGIN(category, name);
return category;
}
static inline void
_mesa_trace_scope_end(int *scope)
{
/* we save the category in the scope variable */
_MESA_TRACE_END(*scope);
}
#else
#define _MESA_TRACE_SCOPE(category, name)
#endif /* __has_attribute(cleanup) && __has_attribute(unused) */
/* These use the default category. Drivers or subsystems can use these, or
* define their own categories/macros.
*/
#define MESA_TRACE_BEGIN(name) \
_MESA_TRACE_BEGIN(UTIL_PERFETTO_CATEGORY_DEFAULT, name)
#define MESA_TRACE_END() _MESA_TRACE_END(UTIL_PERFETTO_CATEGORY_DEFAULT)
#define MESA_TRACE_SCOPE(name) \
_MESA_TRACE_SCOPE(UTIL_PERFETTO_CATEGORY_DEFAULT, name)
#define MESA_TRACE_FUNC() \
_MESA_TRACE_SCOPE(UTIL_PERFETTO_CATEGORY_DEFAULT, __func__)
/* these use the slow category */
#define MESA_TRACE_BEGIN_SLOW(name) \
_MESA_TRACE_BEGIN(UTIL_PERFETTO_CATEGORY_SLOW, name)
#define MESA_TRACE_END_SLOW() _MESA_TRACE_END(UTIL_PERFETTO_CATEGORY_SLOW)
#define MESA_TRACE_SCOPE_SLOW(name) \
_MESA_TRACE_SCOPE(UTIL_PERFETTO_CATEGORY_SLOW, name)
#define MESA_TRACE_FUNC_SLOW() \
_MESA_TRACE_SCOPE(UTIL_PERFETTO_CATEGORY_SLOW, __func__)
#endif /* CPU_TRACE_H */