From 97f2d04d5eb93731700c1941c811bb354d057cfc Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Fri, 8 Mar 2019 15:24:57 +0100 Subject: [PATCH] panfrost: Add support for PAN_MESA_DEBUG Signed-off-by: Tomeu Vizoso Reviewed-by: Alyssa Rosenzweig --- src/gallium/drivers/panfrost/pan_blend_shaders.c | 4 ++- src/gallium/drivers/panfrost/pan_context.c | 37 ++++++++++----------- src/gallium/drivers/panfrost/pan_resource.c | 15 +++++---- src/gallium/drivers/panfrost/pan_screen.c | 14 ++++++++ src/gallium/drivers/panfrost/pan_util.h | 41 ++++++++++++++++++++++++ src/gallium/drivers/panfrost/pan_wallpaper.c | 4 ++- 6 files changed, 88 insertions(+), 27 deletions(-) create mode 100644 src/gallium/drivers/panfrost/pan_util.h diff --git a/src/gallium/drivers/panfrost/pan_blend_shaders.c b/src/gallium/drivers/panfrost/pan_blend_shaders.c index 648e84b..fadcdec 100644 --- a/src/gallium/drivers/panfrost/pan_blend_shaders.c +++ b/src/gallium/drivers/panfrost/pan_blend_shaders.c @@ -24,6 +24,7 @@ #include #include "pan_blend_shaders.h" +#include "pan_util.h" #include "midgard/midgard_compile.h" #include "compiler/nir/nir_builder.h" //#include "gallium/auxiliary/nir/nir_lower_blend.h" @@ -130,7 +131,8 @@ panfrost_make_blend_shader(struct panfrost_context *ctx, struct panfrost_blend_s /* Build a trivial blend shader */ nir_store_var(b, c_out, nir_blending_f(blend, b, s_src, s_dst, s_con), 0xFF); - nir_print_shader(shader, stdout); + if (pan_debug & PAN_DBG_SHADERS) + nir_print_shader(shader, stdout); /* Compile the built shader */ diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 3c8a483..095f9cf 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -41,6 +41,7 @@ #include "pan_screen.h" #include "pan_blending.h" #include "pan_blend_shaders.h" +#include "pan_util.h" #include "pan_wallpaper.h" static int performance_counter_number = 0; @@ -85,7 +86,7 @@ static void panfrost_enable_afbc(struct panfrost_context *ctx, struct panfrost_resource *rsrc, bool ds) { if (ctx->require_sfbd) { - printf("AFBC not supported yet on SFBD\n"); + DBG("AFBC not supported yet on SFBD\n"); assert(0); } @@ -145,7 +146,7 @@ panfrost_set_fragment_afbc(struct panfrost_context *ctx) continue; if (ctx->require_sfbd) { - fprintf(stderr, "Color AFBC not supported on SFBD\n"); + DBG("Color AFBC not supported on SFBD\n"); assert(0); } @@ -169,7 +170,7 @@ panfrost_set_fragment_afbc(struct panfrost_context *ctx) if (rsrc->bo->has_afbc) { if (ctx->require_sfbd) { - fprintf(stderr, "Depth AFBC not supported on SFBD\n"); + DBG("Depth AFBC not supported on SFBD\n"); assert(0); } @@ -193,7 +194,7 @@ panfrost_set_fragment_afbc(struct panfrost_context *ctx) if (ctx->pipe_framebuffer.nr_cbufs == 0) { if (ctx->require_sfbd) { - fprintf(stderr, "Depth-only FBO not supported on SFBD\n"); + DBG("Depth-only FBO not supported on SFBD\n"); assert(0); } @@ -598,7 +599,7 @@ static void panfrost_invalidate_frame(struct panfrost_context *ctx) { unsigned transient_count = ctx->transient_pools[ctx->cmdstream_i].entry_index*ctx->transient_pools[0].entry_size + ctx->transient_pools[ctx->cmdstream_i].entry_offset; - printf("Uploaded transient %d bytes\n", transient_count); + DBG("Uploaded transient %d bytes\n", transient_count); /* Rotate cmdstream */ if ((++ctx->cmdstream_i) == (sizeof(ctx->transient_pools) / sizeof(ctx->transient_pools[0]))) @@ -958,7 +959,7 @@ panfrost_fragment_job(struct panfrost_context *ctx) if (rsrc->bo->has_checksum) { if (ctx->require_sfbd) { - fprintf(stderr, "Checksumming not supported on SFBD\n"); + DBG("Checksumming not supported on SFBD\n"); assert(0); } @@ -1428,7 +1429,7 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data) break; default: - printf("Unknown shader stage %d in uniform upload\n", i); + DBG("Unknown shader stage %d in uniform upload\n", i); assert(0); } @@ -1459,7 +1460,7 @@ panfrost_queue_draw(struct panfrost_context *ctx) { /* TODO: Expand the array? */ if (ctx->draw_count >= MAX_DRAW_CALLS) { - printf("Job buffer overflow, ignoring draw\n"); + DBG("Job buffer overflow, ignoring draw\n"); assert(0); } @@ -1612,7 +1613,7 @@ g2m_draw_mode(enum pipe_prim_type mode) DEFINE_CASE(POLYGON); default: - printf("Illegal draw mode %d\n", mode); + DBG("Illegal draw mode %d\n", mode); assert(0); return MALI_LINE_LOOP; } @@ -1634,7 +1635,7 @@ panfrost_translate_index_size(unsigned size) return MALI_DRAW_INDEXED_UINT32; default: - printf("Unknown index size %d\n", size); + DBG("Unknown index size %d\n", size); assert(0); return 0; } @@ -1911,7 +1912,7 @@ panfrost_delete_vertex_elements_state(struct pipe_context *pctx, void *hwcso) { struct panfrost_vertex_state *so = (struct panfrost_vertex_state *) hwcso; unsigned bytes = sizeof(struct mali_attr_meta) * so->num_elements; - printf("Vertex elements delete leaks descriptor (%d bytes)\n", bytes); + DBG("Vertex elements delete leaks descriptor (%d bytes)\n", bytes); free(hwcso); } @@ -1939,11 +1940,11 @@ panfrost_delete_shader_state( struct panfrost_shader_variants *cso = (struct panfrost_shader_variants *) so; if (cso->base.type == PIPE_SHADER_IR_TGSI) { - printf("Deleting TGSI shader leaks duplicated tokens\n"); + DBG("Deleting TGSI shader leaks duplicated tokens\n"); } unsigned leak = cso->variant_count * sizeof(struct mali_shader_meta); - printf("Deleting shader state leaks descriptors (%d bytes), and shader bytecode\n", leak); + DBG("Deleting shader state leaks descriptors (%d bytes), and shader bytecode\n", leak); free(so); } @@ -2172,7 +2173,7 @@ panfrost_set_constant_buffer( } else if (buf->user_buffer) { cpu = buf->user_buffer; } else { - printf("No constant buffer?\n"); + DBG("No constant buffer?\n"); return; } @@ -2321,7 +2322,7 @@ panfrost_set_framebuffer_state(struct pipe_context *pctx, if (ctx->pipe_framebuffer.cbufs[i] == cb) continue; if (cb && (i != 0)) { - printf("XXX: Multiple render targets not supported before t7xx!\n"); + DBG("XXX: Multiple render targets not supported before t7xx!\n"); assert(0); } @@ -2436,7 +2437,7 @@ panfrost_delete_blend_state(struct pipe_context *pipe, struct panfrost_blend_state *so = (struct panfrost_blend_state *) blend; if (so->has_blend_shader) { - printf("Deleting blend state leak blend shaders bytecode\n"); + DBG("Deleting blend state leak blend shaders bytecode\n"); } free(blend); @@ -2637,7 +2638,7 @@ panfrost_begin_query(struct pipe_context *pipe, struct pipe_query *q) } default: - fprintf(stderr, "Skipping query %d\n", query->type); + DBG("Skipping query %d\n", query->type); break; } @@ -2683,7 +2684,7 @@ panfrost_get_query_result(struct pipe_context *pipe, break; } default: - fprintf(stderr, "Skipped query get %d\n", query->type); + DBG("Skipped query get %d\n", query->type); break; } diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index abef927..b869170 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -42,6 +42,7 @@ #include "pan_screen.h" #include "pan_resource.h" #include "pan_swizzle.h" +#include "pan_util.h" static struct pipe_resource * panfrost_resource_from_handle(struct pipe_screen *pscreen, @@ -125,7 +126,7 @@ panfrost_resource_get_handle(struct pipe_screen *pscreen, static void panfrost_flush_resource(struct pipe_context *pctx, struct pipe_resource *prsc) { - //fprintf(stderr, "TODO %s\n", __func__); + //DBG("TODO %s\n", __func__); } static void @@ -133,7 +134,7 @@ panfrost_blit(struct pipe_context *pipe, const struct pipe_blit_info *info) { /* STUB */ - printf("Skipping blit XXX\n"); + DBG("Skipping blit XXX\n"); return; } @@ -243,7 +244,7 @@ panfrost_resource_create(struct pipe_screen *screen, case PIPE_TEXTURE_RECT: break; default: - fprintf(stderr, "Unknown texture target %d\n", template->target); + DBG("Unknown texture target %d\n", template->target); assert(0); } @@ -306,12 +307,12 @@ panfrost_destroy_bo(struct panfrost_screen *screen, struct panfrost_bo *pbo) if (bo->has_afbc) { /* TODO */ - printf("--leaking afbc (%d bytes)--\n", bo->afbc_metadata_size); + DBG("--leaking afbc (%d bytes)--\n", bo->afbc_metadata_size); } if (bo->has_checksum) { /* TODO */ - printf("--leaking checksum (%zd bytes)--\n", bo->checksum_slab.size); + DBG("--leaking checksum (%zd bytes)--\n", bo->checksum_slab.size); } if (bo->imported) { @@ -450,7 +451,7 @@ panfrost_unmap_bo(struct panfrost_context *ctx, /* Gallium thinks writeback happens here; instead, this is our cue to tile */ if (bo->has_afbc) { - printf("Warning: writes to afbc surface can't possibly work out well for you...\n"); + DBG("Warning: writes to afbc surface can't possibly work out well for you...\n"); } else if (bo->tiled) { struct pipe_context *gallium = (struct pipe_context *) ctx; struct panfrost_screen *screen = pan_screen(gallium->screen); @@ -525,7 +526,7 @@ panfrost_slab_free(void *priv, struct pb_slab *slab) static void panfrost_invalidate_resource(struct pipe_context *pctx, struct pipe_resource *prsc) { - //fprintf(stderr, "TODO %s\n", __func__); + //DBG("TODO %s\n", __func__); } static enum pipe_format diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c index b7f2e4b..9cd65ca 100644 --- a/src/gallium/drivers/panfrost/pan_screen.c +++ b/src/gallium/drivers/panfrost/pan_screen.c @@ -28,6 +28,7 @@ **************************************************************************/ +#include "util/u_debug.h" #include "util/u_memory.h" #include "util/u_format.h" #include "util/u_format_s3tc.h" @@ -46,10 +47,21 @@ #include "pan_screen.h" #include "pan_resource.h" #include "pan_public.h" +#include "pan_util.h" #include "pan_context.h" #include "midgard/midgard_compile.h" +static const struct debug_named_value debug_options[] = { + {"msgs", PAN_DBG_MSGS, "Print debug messages"}, + {"shaders", PAN_DBG_SHADERS, "Dump shaders in NIR"}, + DEBUG_NAMED_VALUE_END +}; + +DEBUG_GET_ONCE_FLAGS_OPTION(pan_debug, "PAN_MESA_DEBUG", debug_options, 0) + +int pan_debug = 0; + struct panfrost_driver *panfrost_create_drm_driver(int fd); struct panfrost_driver *panfrost_create_nondrm_driver(int fd); @@ -531,6 +543,8 @@ panfrost_create_screen(int fd, struct renderonly *ro, bool is_drm) { struct panfrost_screen *screen = CALLOC_STRUCT(panfrost_screen); + pan_debug = debug_get_option_pan_debug(); + if (!screen) return NULL; diff --git a/src/gallium/drivers/panfrost/pan_util.h b/src/gallium/drivers/panfrost/pan_util.h new file mode 100644 index 0000000..35d95d88 --- /dev/null +++ b/src/gallium/drivers/panfrost/pan_util.h @@ -0,0 +1,41 @@ +/************************************************************************** + * + * Copyright 2019 Collabora + * All Rights Reserved. + * + * 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, sub license, 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 NON-INFRINGEMENT. + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS 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 PAN_UTIL_H +#define PAN_UTIL_H + +#define PAN_DBG_MSGS 0x0001 +#define PAN_DBG_SHADERS 0x0002 + +extern int pan_debug; + +#define DBG(fmt, ...) \ + do { if (pan_debug & PAN_DBG_MSGS) \ + fprintf(stderr, "%s:%d: "fmt, \ + __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0) + +#endif /* PAN_UTIL_H */ diff --git a/src/gallium/drivers/panfrost/pan_wallpaper.c b/src/gallium/drivers/panfrost/pan_wallpaper.c index 4841801..b402519 100644 --- a/src/gallium/drivers/panfrost/pan_wallpaper.c +++ b/src/gallium/drivers/panfrost/pan_wallpaper.c @@ -25,6 +25,7 @@ #include "pan_wallpaper.h" #include "pan_context.h" #include "pan_screen.h" +#include "pan_util.h" //#include "include/panfrost-job.h" #include "midgard/midgard_compile.h" #include "compiler/nir/nir_builder.h" @@ -78,7 +79,8 @@ panfrost_build_wallpaper_program() nir_store_var(b, c_out, texel, 0xFF); - nir_print_shader(shader, stdout); + if (pan_debug & PAN_DBG_SHADERS) + nir_print_shader(shader, stdout); return shader; } -- 2.7.4