i965: Create drm_intel_bo_map wrappers with performance warnings.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 29 Jan 2014 17:09:18 +0000 (09:09 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 4 Feb 2014 00:16:26 +0000 (16:16 -0800)
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 <kenneth@whitecape.org>
Reviewed-by: Carl Worth <cworth@cworth.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/intel_buffer_objects.c

index afa335041e9570e795de0cd57f535fa99513189f..a0189b77bad15c81d8710fcad9e6b3dd4910e6fc 100644 (file)
@@ -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);
 
index 4d7044a4722ce8a0681afe2d449ab2f2c24c1b98..a493c3b7d5752ede3a132ef364d0e31412654984 100644 (file)
 #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);