diff --git a/docs/envvars.rst b/docs/envvars.rst index ca46538280d..9d0b8a0b968 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -1990,6 +1990,46 @@ PowerVR driver environment variables Color is forced off if set to ``off``/``0`` or on if set to ``on``/``1``. Defaults to ``auto``. +.. envvar:: PCO_DEBUG + + A comma-separated list of named flags for the PCO compiler, + which control various compilation options: + + ``val_skip`` + Skip IR validation. + +.. envvar:: PCO_SKIP_PASSES + + A comma-separated list of passes to skip. + +.. envvar:: PCO_PRINT + + A comma-separated list of named flags for the PCO compiler, + which control debug printing options: + + ``vs`` + Print the IR for vertex shaders. + ``fs`` + Print the IR for fragment shaders. + ``cs`` + Print the IR for compute shaders. + ``all`` + Print the IR for all shaders. + ``internal`` + Print the IR for internal shader types. + ``passes`` + Print the IR after each pass. + ``nir`` + Print the resulting NIR. + ``binary`` + Print the resulting binary. + +.. envvar:: PCO_COLOR + + if set to ``auto`` PCO IR will be colorized if stdout is not a pipe. + Color is forced off if set to ``off``/``0`` or on if set to ``on``/``1``. + Defaults to ``auto``. + i915 driver environment variables --------------------------------- diff --git a/src/imagination/pco/meson.build b/src/imagination/pco/meson.build index d0b64938738..a3783a13d1b 100644 --- a/src/imagination/pco/meson.build +++ b/src/imagination/pco/meson.build @@ -6,6 +6,7 @@ inc_powervr_compiler = include_directories(['.']) libpowervr_compiler_files = files( 'pco.c', 'pco_binary.c', + 'pco_debug.c', 'pco_ir.c', 'pco_nir.c', 'pco_trans_nir.c', diff --git a/src/imagination/pco/pco.c b/src/imagination/pco/pco.c index 02adc529241..eac675780e1 100644 --- a/src/imagination/pco/pco.c +++ b/src/imagination/pco/pco.c @@ -28,6 +28,8 @@ pco_ctx *pco_ctx_create(const struct pvr_device_info *dev_info, void *mem_ctx) ctx->dev_info = dev_info; + pco_debug_init(); + return ctx; } diff --git a/src/imagination/pco/pco_debug.c b/src/imagination/pco/pco_debug.c new file mode 100644 index 00000000000..52494693729 --- /dev/null +++ b/src/imagination/pco/pco_debug.c @@ -0,0 +1,80 @@ +/* + * Copyright © 2024 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +/** + * \file pco_debug.c + * + * \brief Debug-related functions. + */ + +#include "pco.h" +#include "pco_internal.h" +#include "util/macros.h" +#include "util/u_call_once.h" +#include "util/u_debug.h" + +#include +#include +#include +#include +#include + +static const struct debug_named_value pco_debug_options[] = { + { "val_skip", PCO_DEBUG_VAL_SKIP, "Skip IR validation." }, + DEBUG_NAMED_VALUE_END, +}; + +static const struct debug_named_value pco_debug_print_options[] = { + { "vs", PCO_DEBUG_PRINT_VS, "Print the IR for vertex shaders." }, + { "fs", PCO_DEBUG_PRINT_FS, "Print the IR for fragment shaders." }, + { "cs", PCO_DEBUG_PRINT_CS, "Print the IR for compute shaders." }, + { "all", PCO_DEBUG_PRINT_ALL, "Print the IR for all shaders." }, + { "internal", + PCO_DEBUG_PRINT_INTERNAL, + "Print the IR for internal shader types." }, + { "passes", PCO_DEBUG_PRINT_PASSES, "Print the IR after each pass." }, + { "nir", PCO_DEBUG_PRINT_NIR, "Print the resulting NIR." }, + { "binary", PCO_DEBUG_PRINT_BINARY, "Print the resulting binary." }, + DEBUG_NAMED_VALUE_END, +}; + +DEBUG_GET_ONCE_FLAGS_OPTION(pco_debug, "PCO_DEBUG", pco_debug_options, 0U) +uint64_t pco_debug = 0U; + +DEBUG_GET_ONCE_FLAGS_OPTION(pco_debug_print, + "PCO_DEBUG_PRINT", + pco_debug_print_options, + 0U) +uint64_t pco_debug_print = 0U; + +DEBUG_GET_ONCE_OPTION(pco_skip_passes, "PCO_SKIP_PASSES", "") +const char *pco_skip_passes = ""; + +DEBUG_GET_ONCE_OPTION(pco_color, "PCO_COLOR", NULL) +bool pco_color = false; + +static void pco_debug_init_once(void) +{ + /* Get debug flags. */ + pco_debug = debug_get_option_pco_debug(); + pco_debug_print = debug_get_option_pco_debug_print(); + pco_skip_passes = debug_get_option_pco_skip_passes(); + + /* Get/parse color option. */ + const char *color_opt = debug_get_option_pco_color(); + if (!color_opt || !strcmp(color_opt, "auto") || !strcmp(color_opt, "a")) + pco_color = isatty(fileno(stdout)); + else if (!strcmp(color_opt, "on") || !strcmp(color_opt, "1")) + pco_color = true; + else if (!strcmp(color_opt, "off") || !strcmp(color_opt, "0")) + pco_color = false; +} + +void pco_debug_init(void) +{ + static util_once_flag flag = UTIL_ONCE_FLAG_INIT; + util_call_once(&flag, pco_debug_init_once); +} diff --git a/src/imagination/pco/pco_internal.h b/src/imagination/pco/pco_internal.h index eb0a3ba5463..4e630195eed 100644 --- a/src/imagination/pco/pco_internal.h +++ b/src/imagination/pco/pco_internal.h @@ -15,6 +15,10 @@ #include "pco.h" #include "spirv/nir_spirv.h" +#include "util/macros.h" + +#include +#include /** PCO compiler context. */ typedef struct _pco_ctx { @@ -28,4 +32,35 @@ typedef struct _pco_ctx { struct spirv_to_nir_options spirv_options; } pco_ctx; +/* Debug. */ +enum pco_debug { + PCO_DEBUG_VAL_SKIP = BITFIELD64_BIT(0), +}; + +extern uint64_t pco_debug; + +#define PCO_DEBUG(flag) unlikely(pco_debug &(PCO_DEBUG_##flag)) + +enum pco_debug_print { + PCO_DEBUG_PRINT_VS = BITFIELD64_BIT(0), + PCO_DEBUG_PRINT_FS = BITFIELD64_BIT(1), + PCO_DEBUG_PRINT_CS = BITFIELD64_BIT(2), + PCO_DEBUG_PRINT_ALL = PCO_DEBUG_PRINT_VS | PCO_DEBUG_PRINT_FS | + PCO_DEBUG_PRINT_CS, + PCO_DEBUG_PRINT_INTERNAL = BITFIELD64_BIT(3), + PCO_DEBUG_PRINT_PASSES = BITFIELD64_BIT(4), + PCO_DEBUG_PRINT_NIR = BITFIELD64_BIT(5), + PCO_DEBUG_PRINT_BINARY = BITFIELD64_BIT(6), +}; + +extern uint64_t pco_debug_print; + +extern const char *pco_skip_passes; + +#define PCO_DEBUG_PRINT(flag) \ + unlikely(pco_debug_print &(PCO_DEBUG_PRINT_##flag)) + +extern bool pco_color; + +void pco_debug_init(void); #endif /* PCO_INTERNAL_H */