xf86-video-intel: 4 commits - src/sna/kgem.c src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_driver.c src/sna/sna.h
Chris Wilson
ickle at kemper.freedesktop.org
Mon Oct 31 02:23:15 PDT 2011
src/sna/kgem.c | 24 ++++++++++------
src/sna/kgem.h | 2 -
src/sna/sna.h | 4 ++
src/sna/sna_accel.c | 76 ++++++++++++++++++++++++++++++++++++---------------
src/sna/sna_driver.c | 5 +++
5 files changed, 81 insertions(+), 30 deletions(-)
New commits:
commit 9c399c74adc5e5bc7d425382a74d84315d2cef02
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Oct 31 09:20:54 2011 +0000
sna: Add an option to disable the delayed flush
Section "Device"
Option "DelayedFlush" "False"
EndSection
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index ae161a2..4ed3fb8 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -192,6 +192,8 @@ enum {
OPTION_RELAXED_FENCING,
OPTION_VMAP,
OPTION_ZAPHOD,
+ OPTION_DELAYED_FLUSH,
+ NUM_OPTIONS
};
enum {
@@ -205,6 +207,7 @@ struct sna {
unsigned flags;
#define SNA_NO_THROTTLE 0x1
+#define SNA_NO_DELAYED_FLUSH 0x2
int timer[NUM_TIMERS];
int timer_active;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 0b04db8..f6095b5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -5995,6 +5995,9 @@ static Bool sna_accel_do_flush(struct sna *sna)
return FALSE;
}
+ if (sna->flags & SNA_NO_DELAYED_FLUSH)
+ return TRUE;
+
if (sna->timer[FLUSH_TIMER] == -1)
return TRUE;
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 3e3f65c..46ca5ce 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -91,6 +91,7 @@ static OptionInfoRec sna_options[] = {
{OPTION_RELAXED_FENCING, "UseRelaxedFencing", OPTV_BOOLEAN, {0}, TRUE},
{OPTION_VMAP, "UseVmap", OPTV_BOOLEAN, {0}, TRUE},
{OPTION_ZAPHOD, "ZaphodHeads", OPTV_STRING, {0}, FALSE},
+ {OPTION_DELAYED_FLUSH, "DelayedFlush", OPTV_BOOLEAN, {0}, TRUE},
{-1, NULL, OPTV_NONE, {0}, FALSE}
};
@@ -506,6 +507,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
sna->flags = 0;
if (!xf86ReturnOptValBool(sna->Options, OPTION_THROTTLE, TRUE))
sna->flags |= SNA_NO_THROTTLE;
+ if (!xf86ReturnOptValBool(sna->Options, OPTION_DELAYED_FLUSH, TRUE))
+ sna->flags |= SNA_NO_DELAYED_FLUSH;
xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Framebuffer %s\n",
sna->tiling & SNA_TILING_FB ? "tiled" : "linear");
@@ -515,6 +518,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
sna->tiling & SNA_TILING_3D ? "tiled" : "linear");
xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Throttling %sabled\n",
sna->flags & SNA_NO_THROTTLE ? "dis" : "en");
+ xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Delayed flush %sabled\n",
+ sna->flags & SNA_NO_DELAYED_FLUSH ? "dis" : "en");
if (!sna_mode_pre_init(scrn, sna)) {
PreInitCleanup(scrn);
commit c8860ce26eaa8f9e876af2354d61c35338076ac8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sun Oct 30 23:25:48 2011 +0000
sna: Report whether anything was retired to the inactive list
So that we can skip a fresh search of the inactive list if nothing
changed.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 86cde01..60ae5ca 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -586,9 +586,10 @@ static void kgem_bo_unref(struct kgem *kgem, struct kgem_bo *bo)
__kgem_bo_destroy(kgem, bo);
}
-void kgem_retire(struct kgem *kgem)
+bool kgem_retire(struct kgem *kgem)
{
struct kgem_bo *bo, *next;
+ bool retired = false;
DBG(("%s\n", __FUNCTION__));
@@ -602,6 +603,7 @@ void kgem_retire(struct kgem *kgem)
bo->gpu = false;
list_move(&bo->list, inactive(kgem, bo->size));
list_del(&bo->request);
+ retired = true;
}
while (!list_is_empty(&kgem->requests)) {
@@ -641,6 +643,7 @@ void kgem_retire(struct kgem *kgem)
__FUNCTION__, bo->handle));
list_move(&bo->list,
inactive(kgem, bo->size));
+ retired = true;
} else {
DBG(("%s: closing %d\n",
__FUNCTION__, bo->handle));
@@ -657,6 +660,7 @@ void kgem_retire(struct kgem *kgem)
assert(rq->bo->gpu == 0);
list_move(&rq->bo->list,
inactive(kgem, rq->bo->size));
+ retired = true;
} else {
kgem->need_purge = 1;
gem_close(kgem->fd, rq->bo->handle);
@@ -669,6 +673,8 @@ void kgem_retire(struct kgem *kgem)
if (kgem->ring && list_is_empty(&kgem->requests))
kgem->ring = kgem->mode;
+
+ return retired;
}
static void kgem_commit(struct kgem *kgem)
@@ -1269,10 +1275,11 @@ struct kgem_bo *kgem_create_linear(struct kgem *kgem, int size)
return kgem_bo_reference(bo);
if (!list_is_empty(&kgem->requests)) {
- kgem_retire(kgem);
- bo = search_linear_cache(kgem, size, false);
- if (bo)
- return kgem_bo_reference(bo);
+ if (kgem_retire(kgem)) {
+ bo = search_linear_cache(kgem, size, false);
+ if (bo)
+ return kgem_bo_reference(bo);
+ }
}
handle = gem_create(kgem->fd, size);
@@ -1547,9 +1554,10 @@ next_bo:
}
if (flags & CREATE_INACTIVE && !list_is_empty(&kgem->requests)) {
- kgem_retire(kgem);
- flags &= ~CREATE_INACTIVE;
- goto skip_active_search;
+ if (kgem_retire(kgem)) {
+ flags &= ~CREATE_INACTIVE;
+ goto skip_active_search;
+ }
}
handle = gem_create(kgem->fd, size);
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index eb89c63..377670e 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -171,7 +171,7 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
int tiling,
uint32_t flags);
-void kgem_retire(struct kgem *kgem);
+bool kgem_retire(struct kgem *kgem);
void _kgem_submit(struct kgem *kgem);
static inline void kgem_submit(struct kgem *kgem)
commit a7adcc8e47ba550e7c36a6543a6e0d99040c7354
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sun Oct 30 21:19:35 2011 +0000
sna: Stash the last scratch pixmap
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 1bb81d0..ae161a2 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -213,6 +213,7 @@ struct sna {
struct list dirty_pixmaps;
PixmapPtr front, shadow;
+ PixmapPtr freed_pixmap;
struct sna_mode {
uint32_t fb_id;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index c0c72ee..0b04db8 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -135,8 +135,16 @@ static Bool sna_destroy_private(PixmapPtr pixmap, struct sna_pixmap *priv)
kgem_bo_destroy(&sna->kgem, priv->cpu_bo);
}
+ if (!sna->freed_pixmap) {
+ sna->freed_pixmap = pixmap;
+ priv->gpu_bo = NULL;
+ priv->cpu_bo = NULL;
+ priv->mapped = 0;
+ return false;
+ }
+
free(priv);
- return TRUE;
+ return true;
}
static uint32_t sna_pixmap_choose_tiling(PixmapPtr pixmap)
@@ -228,15 +236,25 @@ sna_pixmap_create_scratch(ScreenPtr screen,
CREATE_PIXMAP_USAGE_SCRATCH);
/* you promise never to access this via the cpu... */
- pixmap = fbCreatePixmap(screen, 0, 0, depth,
- CREATE_PIXMAP_USAGE_SCRATCH);
- if (!pixmap)
- return NullPixmap;
-
- priv = _sna_pixmap_attach(pixmap);
- if (!priv) {
- fbDestroyPixmap(pixmap);
- return NullPixmap;
+ if (sna->freed_pixmap) {
+ pixmap = sna->freed_pixmap;
+ sna->freed_pixmap = NULL;
+
+ priv = sna_pixmap(pixmap);
+ memset(priv, 0, sizeof(*priv));
+ list_init(&priv->list);
+ priv->pixmap = pixmap;
+ } else {
+ pixmap = fbCreatePixmap(screen, 0, 0, depth,
+ CREATE_PIXMAP_USAGE_SCRATCH);
+ if (!pixmap)
+ return NullPixmap;
+
+ priv = _sna_pixmap_attach(pixmap);
+ if (!priv) {
+ fbDestroyPixmap(pixmap);
+ return NullPixmap;
+ }
}
priv->gpu_bo = kgem_create_2d(&sna->kgem,
@@ -753,15 +771,22 @@ sna_pixmap_create_upload(ScreenPtr screen,
return fbCreatePixmap(screen, width, height, depth,
CREATE_PIXMAP_USAGE_SCRATCH);
- pixmap = fbCreatePixmap(screen, 0, 0, depth,
- CREATE_PIXMAP_USAGE_SCRATCH);
- if (!pixmap)
- return NullPixmap;
+ if (sna->freed_pixmap) {
+ pixmap = sna->freed_pixmap;
+ sna->freed_pixmap = NULL;
- priv = malloc(sizeof(*priv));
- if (!priv) {
- fbDestroyPixmap(pixmap);
- return NullPixmap;
+ priv = sna_pixmap(pixmap);
+ } else {
+ pixmap = fbCreatePixmap(screen, 0, 0, depth,
+ CREATE_PIXMAP_USAGE_SCRATCH);
+ if (!pixmap)
+ return NullPixmap;
+
+ priv = malloc(sizeof(*priv));
+ if (!priv) {
+ fbDestroyPixmap(pixmap);
+ return NullPixmap;
+ }
}
priv->gpu_bo = kgem_create_buffer(&sna->kgem,
@@ -6175,6 +6200,12 @@ Bool sna_accel_create(struct sna *sna)
void sna_accel_close(struct sna *sna)
{
+ if (sna->freed_pixmap) {
+ assert(sna->freed_pixmap->refcnt == 1);
+ sna_destroy_pixmap(sna->freed_pixmap);
+ sna->freed_pixmap = NULL;
+ }
+
sna_glyphs_close(sna);
sna_gradients_close(sna);
commit c8d4f5d32af94f712cc81ff495b19907261759ea
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sun Oct 30 21:21:25 2011 +0000
sna: Correct PolyRectangle verticals to be the end-point not the length
Fixes an off-by-one in the drawing of the rectangles caused by a
too-literal translation of the rectangles into boxes.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 6f0275b..c0c72ee 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4284,7 +4284,7 @@ zero:
b[1].y2 += rr.height;
b[2].y1 = rr.y + 1;
- b[2].y2 = rr.y + rr.height - 1;
+ b[2].y2 = rr.y + rr.height;
b[2].x1 = rr.x;
b[2].x2 = rr.x + 1;
@@ -4334,7 +4334,7 @@ zero_clipped:
box[1].y2 += rr.height;
box[2].y1 = rr.y + 1;
- box[2].y2 = box[2].y1 + rr.height - 1;
+ box[2].y2 = box[2].y1 + rr.height;
box[2].x1 = rr.x;
box[2].x2 = rr.x + 1;
@@ -4392,7 +4392,7 @@ zero_clipped:
box[1].y2 += rr.height;
box[2].y1 = rr.y + 1;
- box[2].y2 = box[2].y1 + rr.height - 1;
+ box[2].y2 = box[2].y1 + rr.height;
box[2].x1 = rr.x;
box[2].x2 = rr.x + 1;
More information about the xorg-commit
mailing list