From d613bafe9111a577bed6bb89ef559df40712674c Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Wed, 29 Jan 2014 09:09:18 -0800 Subject: [PATCH] i965: Create drm_intel_bo_map wrappers with performance warnings. Mapping a buffer is a common place where we could stall the CPU. In a few places, we've added special code to check whether a buffer is busy and log the stall as a performance warning. Most of these give no indication of the severity of the stall, though, since measuring the time is a small hassle. This patch introduces a new brw_bo_map() function which wraps drm_intel_bo_map, but additionally measures the time stalled and reports a performance warning. If performance debugging is not enabled, it simply maps the buffer with negligable overhead. We also add a similar wrapper for drm_intel_gem_bo_map_gtt(). This should make it easy to add performance warnings in lots of places. Signed-off-by: Kenneth Graunke Reviewed-by: Carl Worth Reviewed-by: Eric Anholt --- src/mesa/drivers/dri/i965/brw_context.h | 6 +++ .../drivers/dri/i965/intel_buffer_objects.c | 40 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index afa335041e9..a0189b77bad 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1658,6 +1658,12 @@ void brw_dump_perf_monitors(struct brw_context *brw); void brw_perf_monitor_new_batch(struct brw_context *brw); void brw_perf_monitor_finish_batch(struct brw_context *brw); +/* intel_buffer_objects.c */ +int brw_bo_map(struct brw_context *brw, drm_intel_bo *bo, int write_enable, + const char *bo_name); +int brw_bo_map_gtt(struct brw_context *brw, drm_intel_bo *bo, + const char *bo_name); + /* intel_extensions.c */ extern void intelInitExtensions(struct gl_context *ctx); diff --git a/src/mesa/drivers/dri/i965/intel_buffer_objects.c b/src/mesa/drivers/dri/i965/intel_buffer_objects.c index 4d7044a4722..a493c3b7d57 100644 --- a/src/mesa/drivers/dri/i965/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/i965/intel_buffer_objects.c @@ -41,6 +41,46 @@ #include "intel_buffer_objects.h" #include "intel_batchbuffer.h" +/** + * Map a buffer object; issue performance warnings if mapping causes stalls. + * + * This matches the drm_intel_bo_map API, but takes an additional human-readable + * name for the buffer object to use in the performance debug message. + */ +int +brw_bo_map(struct brw_context *brw, + drm_intel_bo *bo, int write_enable, + const char *bo_name) +{ + if (likely(!brw->perf_debug) || !drm_intel_bo_busy(bo)) + return drm_intel_bo_map(bo, write_enable); + + float start_time = get_time(); + + int ret = drm_intel_bo_map(bo, write_enable); + + perf_debug("CPU mapping a busy %s BO stalled and took %.03f ms.\n", + bo_name, (get_time() - start_time) * 1000); + + return ret; +} + +int +brw_bo_map_gtt(struct brw_context *brw, drm_intel_bo *bo, const char *bo_name) +{ + if (likely(!brw->perf_debug) || !drm_intel_bo_busy(bo)) + return drm_intel_gem_bo_map_gtt(bo); + + float start_time = get_time(); + + int ret = drm_intel_gem_bo_map_gtt(bo); + + perf_debug("GTT mapping a busy %s BO stalled and took %.03f ms.\n", + bo_name, (get_time() - start_time) * 1000); + + return ret; +} + static GLboolean intel_bufferobj_unmap(struct gl_context * ctx, struct gl_buffer_object *obj); -- 2.30.2