From 7ce8d4c1fec618ac2578ea0ddb8915b1b41ab9cb Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 27 Feb 2009 13:46:31 -0800 Subject: [PATCH] intel: Update reloc_tree_size of the first buffer when we count the tree size. This helps avoid the n^2 performance cost of counting tree size when we get a lot of relocations into our batch buffer. rgb10text on keithp's laptop went from 136k glyphs/sec to 234k glyphs/sec. --- libdrm/intel/intel_bufmgr_gem.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/libdrm/intel/intel_bufmgr_gem.c b/libdrm/intel/intel_bufmgr_gem.c index 6ddecf4a..9e49d7c9 100644 --- a/libdrm/intel/intel_bufmgr_gem.c +++ b/libdrm/intel/intel_bufmgr_gem.c @@ -1260,8 +1260,21 @@ drm_intel_gem_compute_batch_space(drm_intel_bo **bo_array, int count) int i; unsigned int total = 0; - for (i = 0; i < count; i++) + for (i = 0; i < count; i++) { total += drm_intel_gem_bo_get_aperture_space(bo_array[i]); + /* For the first buffer object in the array, we get an accurate count + * back for its reloc_tree size (since nothing had been flagged as + * being counted yet). We can save that value out as a more + * conservative reloc_tree_size that avoids double-counting target + * buffers. Since the first buffer happens to usually be the batch + * buffer in our callers, this can pull us back from doing the tree + * walk on every new batch emit. + */ + if (i == 0) { + drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo_array[i]; + bo_gem->reloc_tree_size = total; + } + } for (i = 0; i < count; i++) drm_intel_gem_bo_clear_aperture_space_flag(bo_array[i]);