[Mesa-dev] [PATCH 12/23] intel: Add simple logging façade for Android
Jason Ekstrand
jason at jlekstrand.net
Sat Sep 2 17:28:53 UTC 2017
n Sat, Sep 2, 2017 at 1:17 AM, Chad Versace <chadversary at chromium.org>
wrote:
> I'm bringing up Vulkan in the Android container of Chrome OS (ARC++).
>
> On Android, stdio goes to /dev/null. On Android, remote gdb is even more
> painful than the usual remote gdb. On Android, nothing works like you
> expect and debugging is hell. I need logging.
>
> This patch introduces a small, simple logging API that can easily wrap
> Android's API. On non-Android platforms, this logger does nothing fancy.
> It follows the time-honored Unix tradition of spewing everything to
> stderr with minimal fuss.
>
> My goal here is not perfection. My goal is to make a minimal, clean API,
> that people hate merely a little instead of a lot, and that's good
> enough to let me bring up Android Vulkan. And it needs to be fast,
> which means it must be small. No one wants to their game to miss frames
> while aiming a flaming bow into the jaws of an angry robot t-rex, and
> thus become t-rex breakfast, because some fool had too much fun desiging
> a bloated, ideal logging API.
>
I don't actually hate it at all. In fact, I rather like it. Sadtly, we
probably need a bit more indirection in Vulkan thanks to
VK_EXT_debug_report but it should be pretty easy to tie in here.
> If people like it, perhaps we should quickly promote it to src/util.
>
I'd be a fan.
> The API looks like this:
>
> #define INTEL_LOG_TAG "intel-vulkan"
> #define DEBUG
>
> intel_logd("try hard thing with foo=%d", foo);
>
> n = try_foo(...);
> if (n < 0) {
> intel_loge("%s:%d: foo failed bigtime", __FILE__, __LINE__);
> return VK_ERROR_DEVICE_LOST;
> }
>
> And produces this on non-Android:
>
> intel-vulkan: debug: try hard thing with foo=93
> intel-vulkan: error: anv_device.c:182: foo failed bigtime
> ---
> src/intel/Makefile.sources | 4 +-
> src/intel/common/intel_log.c | 87 ++++++++++++++++++++++++++++++
> ++++++++++++++
> src/intel/common/intel_log.h | 82 ++++++++++++++++++++++++++++++
> +++++++++++
> 3 files changed, 172 insertions(+), 1 deletion(-)
> create mode 100644 src/intel/common/intel_log.c
> create mode 100644 src/intel/common/intel_log.h
>
> diff --git a/src/intel/Makefile.sources b/src/intel/Makefile.sources
> index 4074ba9ee54..f6a69f65455 100644
> --- a/src/intel/Makefile.sources
> +++ b/src/intel/Makefile.sources
> @@ -18,7 +18,9 @@ COMMON_FILES = \
> common/gen_l3_config.c \
> common/gen_l3_config.h \
> common/gen_urb_config.c \
> - common/gen_sample_positions.h
> + common/gen_sample_positions.h \
> + common/intel_log.c \
> + common/intel_log.h
>
> COMPILER_FILES = \
> compiler/brw_cfg.cpp \
> diff --git a/src/intel/common/intel_log.c b/src/intel/common/intel_log.c
> new file mode 100644
> index 00000000000..03d6dc72a8d
> --- /dev/null
> +++ b/src/intel/common/intel_log.c
> @@ -0,0 +1,87 @@
> +/*
> + * Copyright 2017 Google
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> "Software"),
> + * to deal in the Software without restriction, including without
> limitation
> + * the rights to use, copy, modify, merge, publish, distribute,
> sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> next
> + * paragraph) shall be included in all copies or substantial portions of
> the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
> SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> DEALINGS
> + * IN THE SOFTWARE.
> + */
> +
> +#include <stdarg.h>
> +
> +#ifdef ANDROID
> +#include <android/log.h>
> +#else
> +#include <stdio.h>
> +#endif
> +
> +#include "intel_log.h"
> +
> +#ifdef ANDROID
> +static inline android_LogPriority
> +level_to_android(enum intel_log_level l)
> +{
> + switch (l) {
> + case INTEL_LOG_ERROR: return ANDROID_LOG_ERROR;
> + case INTEL_LOG_WARN: return ANDROID_LOG_WARN;
> + case INTEL_LOG_INFO: return ANDROID_LOG_INFO;
> + case INTEL_LOG_DEBUG: return ANDROID_LOG_DEBUG;
> + }
> +
> + unreachable("bad intel_log_level");
> +}
> +#endif
> +
> +#ifndef ANDROID
> +static inline const char *
> +level_to_str(enum intel_log_level l)
> +{
> + switch (l) {
> + case INTEL_LOG_ERROR: return "error";
> + case INTEL_LOG_WARN: return "warning";
> + case INTEL_LOG_INFO: return "info";
> + case INTEL_LOG_DEBUG: return "debug";
> + }
> +
> + unreachable("bad intel_log_level");
> +}
> +#endif
> +
> +void
> +intel_log(enum intel_log_level level, const char *tag, const char
> *format, ...)
> +{
> + va_list va;
> +
> + va_start(va, format);
> + intel_log_v(level, tag, format, va);
> + va_end(va);
> +}
> +
> +void
> +intel_log_v(enum intel_log_level level, const char *tag, const char
> *format,
> + va_list va)
> +{
> +#ifdef ANDROID
> + __android_log_vprint(level_to_android(level), tag, format, va);
> +#else
> + flockfile(stderr);
> + fprintf(stderr, "%s: %s: ", tag, level_to_str(level));
> + vfprintf(stderr, format, va);
> + fprintf(stderr, "\n");
> + funlockfile(stderr);
> +#endif
> +}
> diff --git a/src/intel/common/intel_log.h b/src/intel/common/intel_log.h
> new file mode 100644
> index 00000000000..0f28109a0a4
> --- /dev/null
> +++ b/src/intel/common/intel_log.h
> @@ -0,0 +1,82 @@
> +/*
> + * Copyright 2017 Google
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> "Software"),
> + * to deal in the Software without restriction, including without
> limitation
> + * the rights to use, copy, modify, merge, publish, distribute,
> sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> next
> + * paragraph) shall be included in all copies or substantial portions of
> the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
> SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> DEALINGS
> + * IN THE SOFTWARE.
> + */
> +
> +#ifndef INTEL_LOG_H
> +#define INTEL_LOG_H
> +
> +#include <stdarg.h>
> +
> +#include "util/macros.h"
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#ifndef INTEL_LOG_TAG
> +#define INTEL_LOG_TAG "INTEL-MESA"
> +#endif
> +
> +enum intel_log_level {
> + INTEL_LOG_ERROR,
> + INTEL_LOG_WARN,
> + INTEL_LOG_INFO,
> + INTEL_LOG_DEBUG,
> +};
> +
> +void PRINTFLIKE(3, 4)
> +intel_log(enum intel_log_level, const char *tag, const char *format, ...);
> +
> +void
> +intel_log_v(enum intel_log_level, const char *tag, const char *format,
> + va_list va);
> +
> +#define intel_loge(fmt, ...) intel_log(INTEL_LOG_ERROR, (INTEL_LOG_TAG),
> (fmt), ##__VA_ARGS__)
> +#define intel_logw(fmt, ...) intel_log(INTEL_LOG_WARN, (INTEL_LOG_TAG),
> (fmt), ##__VA_ARGS__)
> +#define intel_logi(fmt, ...) intel_log(INTEL_LOG_INFO, (INTEL_LOG_TAG),
> (fmt), ##__VA_ARGS__)
> +#ifdef DEBUG
> +#define intel_logd(fmt, ...) intel_log(INTEL_LOG_DEBUG, (INTEL_LOG_TAG),
> (fmt), ##__VA_ARGS__)
> +#else
> +#define intel_logd(fmt, ...) __intel_log_use_args((fmt), ##__VA_ARGS__)
> +#endif
>
I'm not sure if ignoring debug loigging is best done here or at some
slightly higher level. I think here is probably fine.
> +
> +#define intel_loge_v(fmt, va) intel_log_v(INTEL_LOG_ERROR,
> (INTEL_LOG_TAG), (fmt), (va))
> +#define intel_logw_v(fmt, va) intel_log_v(INTEL_LOG_WARN,
> (INTEL_LOG_TAG), (fmt), (va))
> +#define intel_logi_v(fmt, va) intel_log_v(INTEL_LOG_INFO,
> (INTEL_LOG_TAG), (fmt), (va))
> +#ifdef DEBUG
> +#define intel_logd_v(fmt, va) intel_log_v(INTEL_LOG_DEBUG,
> (INTEL_LOG_TAG), (fmt), (va))
> +#else
> +#define intel_logd_v(fmt, va) __intel_log_use_args((fmt), (va))
> +#endif
> +
> +
> +#ifndef DEBUG
> +/* Suppres -Wunused */
> +static inline void PRINTFLIKE(1, 2)
> +__intel_log_use_args(const char *format, ...) { }
> +#endif
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* INTEL_LOG_H */
> --
> 2.13.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170902/f1cd4ce3/attachment-0001.html>
More information about the mesa-dev
mailing list