[Mesa-dev] [PATCH 2/4] radeon: Add bo statistics dumping support
Lauri Kasanen
cand at gmx.com
Fri Jan 3 07:49:20 PST 2014
No measurable overhead when off (glxgears within 0.5%).
Signed-off-by: Lauri Kasanen <cand at 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
More information about the mesa-dev
mailing list