n Sat, Sep 2, 2017 at 1:17 AM, Chad Versace <chadvers...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev