No measurable overhead when off (glxgears within 0.5%). Signed-off-by: Lauri Kasanen <c...@gmx.com> --- src/gallium/drivers/radeon/r600_pipe_common.c | 32 +++++++++++++++++++++++++++ src/gallium/drivers/radeon/r600_pipe_common.h | 1 + src/gallium/winsys/radeon/drm/radeon_drm_bo.c | 17 ++++++++++++++ src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 9 ++++++++ src/gallium/winsys/radeon/drm/radeon_winsys.h | 6 +++++ 5 files changed, 65 insertions(+)
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index 28921be..121aa49 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -26,11 +26,18 @@ #include "r600_pipe_common.h" #include "r600_cs.h" +#include "../../winsys/radeon/drm/radeon_drm_winsys.h" +#include "os/os_time.h" #include "tgsi/tgsi_parse.h" #include "util/u_format_s3tc.h" #include "util/u_upload_mgr.h" #include <inttypes.h> +#ifdef __GLIBC__ +#define _GNU_SOURCE +#include <errno.h> +#endif + static const struct debug_named_value common_debug_options[] = { /* logging */ { "tex", DBG_TEX, "Print texture info" }, @@ -38,6 +45,7 @@ static const struct debug_named_value common_debug_options[] = { { "compute", DBG_COMPUTE, "Print compute info" }, { "vm", DBG_VM, "Print virtual addresses when creating resources" }, { "trace_cs", DBG_TRACE_CS, "Trace cs and write rlockup_<csid>.c file with faulty cs" }, + { "bostats", DBG_BO_STATS, "Write bo statistics to /tmp/bostats.<pid>[.name]" }, /* shaders */ { "fs", DBG_FS, "Print fetch shaders" }, @@ -209,6 +217,24 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen, return false; } + if (rscreen->debug_flags & DBG_BO_STATS) { + char statsfile[80]; + const pid_t pid = getpid(); + +#ifdef __GLIBC__ + snprintf(statsfile, 80, "/tmp/bostats.%u.%s", pid, program_invocation_short_name); +#else + snprintf(statsfile, 80, "/tmp/bostats.%u", pid); +#endif + + rscreen->ws->bo_stats_file = fopen(statsfile, "w"); + if (!rscreen->ws->bo_stats_file) + fprintf(stderr, "Failed to open bo stats file %s\n", statsfile); + else + fprintf(rscreen->ws->bo_stats_file, "Started at %llu\n", + stats_time_get(ws)); + } + util_format_s3tc_init(); pipe_mutex_init(rscreen->aux_context_lock); @@ -217,6 +243,12 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen, void r600_common_screen_cleanup(struct r600_common_screen *rscreen) { + if ((rscreen->debug_flags & DBG_BO_STATS) && rscreen->ws->bo_stats_file) { + fflush(rscreen->ws->bo_stats_file); + fclose(rscreen->ws->bo_stats_file); + rscreen->ws->bo_stats_file = NULL; + } + pipe_mutex_destroy(rscreen->aux_context_lock); rscreen->aux_context->destroy(rscreen->aux_context); } diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index bf0b968..4c35e66 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -67,6 +67,7 @@ #define DBG_COMPUTE (1 << 2) #define DBG_VM (1 << 3) #define DBG_TRACE_CS (1 << 4) +#define DBG_BO_STATS (1 << 5) /* shaders */ #define DBG_FS (1 << 8) #define DBG_VS (1 << 9) diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c index ca569a1..7543840 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c @@ -370,6 +370,7 @@ static void radeon_bo_destroy(struct pb_buffer *_buf) { struct radeon_bo *bo = radeon_bo(_buf); struct radeon_bomgr *mgr = bo->mgr; + struct radeon_winsys *ws = (struct radeon_winsys *) mgr->rws; struct drm_gem_close args; memset(&args, 0, sizeof(args)); @@ -399,6 +400,11 @@ static void radeon_bo_destroy(struct pb_buffer *_buf) bo->rws->allocated_vram -= align(bo->base.size, 4096); else if (bo->initial_domain & RADEON_DOMAIN_GTT) bo->rws->allocated_gtt -= align(bo->base.size, 4096); + + if (ws->bo_stats_file) { + fprintf(ws->bo_stats_file, "%p destroyed @%llu\n", bo, stats_time_get(ws)); + } + FREE(bo); } @@ -450,6 +456,7 @@ static void *radeon_bo_map(struct radeon_winsys_cs_handle *buf, { struct radeon_bo *bo = (struct radeon_bo*)buf; struct radeon_drm_cs *cs = (struct radeon_drm_cs*)rcs; + struct radeon_winsys *ws = (struct radeon_winsys *) bo->mgr->rws; /* If it's not unsynchronized bo_map, flush CS if needed and then wait. */ if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) { @@ -518,6 +525,10 @@ static void *radeon_bo_map(struct radeon_winsys_cs_handle *buf, } } + if (ws->bo_stats_file) { + fprintf(ws->bo_stats_file, "%p cpu mapped @%llu\n", bo, stats_time_get(ws)); + } + return radeon_bo_do_map(bo); } @@ -562,6 +573,7 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr, { struct radeon_bomgr *mgr = radeon_bomgr(_mgr); struct radeon_drm_winsys *rws = mgr->rws; + struct radeon_winsys *ws = (struct radeon_winsys *) rws; struct radeon_bo *bo; struct drm_radeon_gem_create args; struct radeon_bo_desc *rdesc = (struct radeon_bo_desc*)desc; @@ -636,6 +648,11 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr, else if (rdesc->initial_domains & RADEON_DOMAIN_GTT) rws->allocated_gtt += align(size, 4096); + if (ws->bo_stats_file) { + fprintf(ws->bo_stats_file, "%p created, size %u, prio %u, @%llu\n", bo, size, + bo->stats.high_prio, stats_time_get(ws)); + } + return &bo->base; } diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c index d8ad297..4d46e85 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c @@ -344,6 +344,7 @@ static unsigned radeon_drm_cs_add_reloc(struct radeon_winsys_cs *rcs, { struct radeon_drm_cs *cs = radeon_drm_cs(rcs); struct radeon_bo *bo = (struct radeon_bo*)buf; + struct radeon_winsys *ws = (struct radeon_winsys *) cs->ws; enum radeon_bo_domain added_domains; unsigned index = radeon_add_reloc(cs, bo, usage, domains, &added_domains); @@ -352,6 +353,14 @@ static unsigned radeon_drm_cs_add_reloc(struct radeon_winsys_cs *rcs, if (added_domains & RADEON_DOMAIN_VRAM) cs->csc->used_vram += bo->base.size; + if (ws->bo_stats_file) { + if (usage & RADEON_USAGE_WRITE) { + fprintf(ws->bo_stats_file, "%p write @%llu\n", bo, stats_time_get(ws)); + } else { + fprintf(ws->bo_stats_file, "%p read @%llu\n", bo, stats_time_get(ws)); + } + } + return index; } diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h index 85458c2..33e5c3e 100644 --- a/src/gallium/winsys/radeon/drm/radeon_winsys.h +++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h @@ -40,6 +40,7 @@ * - R16F/RG16F */ +#include <stdio.h> #include "pipebuffer/pb_buffer.h" #include "radeon_surface.h" @@ -214,6 +215,11 @@ struct radeon_winsys { struct pipe_screen *screen; /** + * The bo statistics debug file, if any + */ + FILE *bo_stats_file; + + /** * Destroy this winsys. * * \param ws The winsys this function is called from. -- 1.8.3.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev