summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-02-06 20:37:54 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-02-06 21:10:35 +0000
commitef335a65a9d9f7eb96873201b546c25fd03d090c (patch)
tree4494a1ea110603f098f8cd8662ef959693af65f2
parentb7e3aaf773f05ce82405e135c0f99b40b3c2f434 (diff)
sna: Search all active buckets for a temporary allocation
Reduce the need for creating a new object if we only need the allocation for a single operation. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/kgem.c7
-rw-r--r--src/sna/kgem.h1
-rw-r--r--src/sna/sna_accel.c4
-rw-r--r--src/sna/sna_render.c4
4 files changed, 9 insertions, 7 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 259666e6..e80eaaee 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2291,13 +2291,14 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
if (tiling < 0)
tiling = -tiling, flags |= CREATE_EXACT;
- DBG(("%s(%dx%d, bpp=%d, tiling=%d, exact=%d, inactive=%d, cpu-mapping=%d, gtt-mapping=%d, scanout?=%d)\n", __FUNCTION__,
+ DBG(("%s(%dx%d, bpp=%d, tiling=%d, exact=%d, inactive=%d, cpu-mapping=%d, gtt-mapping=%d, scanout?=%d, temp?=%d)\n", __FUNCTION__,
width, height, bpp, tiling,
!!(flags & CREATE_EXACT),
!!(flags & CREATE_INACTIVE),
!!(flags & CREATE_CPU_MAP),
!!(flags & CREATE_GTT_MAP),
- !!(flags & CREATE_SCANOUT)));
+ !!(flags & CREATE_SCANOUT),
+ !!(flags & CREATE_TEMPORARY)));
size = kgem_surface_size(kgem,
kgem->has_relaxed_fencing,
@@ -2404,7 +2405,7 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
/* Best active match */
retry = NUM_CACHE_BUCKETS - bucket;
- if (retry > 3)
+ if (retry > 3 && (flags & CREATE_TEMPORARY) == 0)
retry = 3;
search_again:
assert(bucket < NUM_CACHE_BUCKETS);
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index b6930e0c..f3a7b94e 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -221,6 +221,7 @@ enum {
CREATE_CPU_MAP = 0x4,
CREATE_GTT_MAP = 0x8,
CREATE_SCANOUT = 0x10,
+ CREATE_TEMPORARY = 0x20,
};
struct kgem_bo *kgem_create_2d(struct kgem *kgem,
int width,
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index a8bfe40c..2a4aaecc 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -700,7 +700,7 @@ sna_pixmap_create_scratch(ScreenPtr screen,
priv->gpu_bo = kgem_create_2d(&sna->kgem,
width, height, bpp, tiling,
- 0);
+ CREATE_TEMPORARY);
if (priv->gpu_bo == NULL) {
free(priv);
fbDestroyPixmap(pixmap);
@@ -5522,7 +5522,7 @@ sna_poly_zero_line_blt(DrawablePtr drawable,
adx, ady, sdx, sdy,
1, 1, octant);
- DBG(("%s: adx=(%d, %d), sdx=(%d, %d), oc1=%d, oc2\n",
+ DBG(("%s: adx=(%d, %d), sdx=(%d, %d), oc1=%d, oc2=%d\n",
__FUNCTION__, adx, ady, sdx, sdy, oc1, oc2));
if (adx == 0 || ady == 0) {
if (x1 <= x2) {
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index c2b9e798..3309157d 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -1146,7 +1146,7 @@ sna_render_picture_extract(struct sna *sna,
kgem_choose_tiling(&sna->kgem,
I915_TILING_X, w, h,
pixmap->drawable.bitsPerPixel),
- 0);
+ CREATE_TEMPORARY);
if (bo) {
PixmapRec tmp;
@@ -1725,7 +1725,7 @@ sna_render_composite_redirect(struct sna *sna,
width, height, bpp,
kgem_choose_tiling(&sna->kgem, I915_TILING_X,
width, height, bpp),
- CREATE_SCANOUT);
+ CREATE_SCANOUT | CREATE_TEMPORARY);
if (!bo)
return FALSE;