xf86-video-intel: 2 commits - src/sna/sna_dri.c src/sna/sna_gradient.c src/sna/sna_render.h

Chris Wilson ickle at kemper.freedesktop.org
Sat Dec 29 09:07:57 PST 2012


 src/sna/sna_dri.c      |   30 +++++++++++++++++-------------
 src/sna/sna_gradient.c |   22 ++++++++++++++--------
 src/sna/sna_render.h   |    2 +-
 3 files changed, 32 insertions(+), 22 deletions(-)

New commits:
commit 43336c632beb5d599ec0fc614434b88ef7a26422
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Dec 29 16:47:53 2012 +0000

    sna: Seed the solid color cache with an invalid value to prevent false hits
    
    After flushing, we *do* need to make sure we cannot hit a false lookup
    via the last cache.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_gradient.c b/src/sna/sna_gradient.c
index c437b27..db09e72 100644
--- a/src/sna/sna_gradient.c
+++ b/src/sna/sna_gradient.c
@@ -219,11 +219,11 @@ sna_render_flush_solid(struct sna *sna)
 	DBG(("sna_render_flush_solid(size=%d)\n", cache->size));
 	assert(cache->dirty);
 	assert(cache->size);
+	assert(cache->size <= 1024);
 
 	kgem_bo_write(&sna->kgem, cache->cache_bo,
 		      cache->color, cache->size*sizeof(uint32_t));
 	cache->dirty = 0;
-	cache->last = 0;
 }
 
 static void
@@ -250,10 +250,8 @@ sna_render_finish_solid(struct sna *sna, bool force)
 		cache->bo[i] = NULL;
 	}
 
-	old = cache->cache_bo;
-
 	DBG(("sna_render_finish_solid reset\n"));
-
+	old = cache->cache_bo;
 	cache->cache_bo = kgem_create_linear(&sna->kgem, sizeof(cache->color), 0);
 	if (cache->cache_bo == NULL) {
 		cache->cache_bo = old;
@@ -262,6 +260,14 @@ sna_render_finish_solid(struct sna *sna, bool force)
 
 	if (force)
 		cache->size = 0;
+	if (cache->last < cache->size) {
+		cache->bo[cache->last] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
+							   cache->last*sizeof(uint32_t), sizeof(uint32_t));
+		if (cache->bo[cache->last])
+			cache->bo[cache->last]->pitch = 4;
+		else
+			cache->last = 1024;
+	}
 
 	if (old)
 		kgem_bo_destroy(&sna->kgem, old);
@@ -334,7 +340,7 @@ sna_render_get_solid(struct sna *sna, uint32_t color)
 		}
 	}
 
-	sna_render_finish_solid(sna, i == ARRAY_SIZE(cache->color));
+	sna_render_finish_solid(sna, i == 1024);
 
 	i = cache->size++;
 	cache->color[i] = color;
@@ -406,14 +412,14 @@ static bool sna_solid_cache_init(struct sna *sna)
 	DBG(("%s\n", __FUNCTION__));
 
 	cache->cache_bo =
-		kgem_create_linear(&sna->kgem, sizeof(cache->color), 0);
+		kgem_create_linear(&sna->kgem, 4096, 0);
 	if (!cache->cache_bo)
 		return false;
 
-	cache->color[0] = 0;
+	cache->last = 1024;
+	cache->color[cache->last] = 0;
 	cache->dirty = 0;
 	cache->size = 0;
-	cache->last = 0;
 
 	return true;
 }
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 2f44479..b957a9f 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -259,8 +259,8 @@ struct sna_render {
 
 	struct sna_solid_cache {
 		struct kgem_bo *cache_bo;
-		uint32_t color[1024];
 		struct kgem_bo *bo[1024];
+		uint32_t color[1025];
 		int last;
 		int size;
 		int dirty;
commit f6050382095c3bc4f78bc4ff9e9c6086e58d6b28
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Dec 29 16:41:03 2012 +0000

    sna/dri: Gracefully handle failures from pageflip
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 10b6360..af75a55 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -1031,7 +1031,7 @@ sna_dri_frame_event_info_free(struct sna *sna,
 	free(info);
 }
 
-static void
+static bool
 sna_dri_page_flip(struct sna *sna, struct sna_dri_frame_event *info)
 {
 	struct kgem_bo *bo = get_private(info->back)->bo;
@@ -1042,6 +1042,8 @@ sna_dri_page_flip(struct sna *sna, struct sna_dri_frame_event *info)
 	assert(get_drawable_pixmap(info->draw)->drawable.height * bo->pitch <= kgem_bo_size(bo));
 
 	info->count = sna_page_flip(sna, bo, info, info->pipe);
+	if (!info->count)
+		return false;
 
 	info->old_front.name = info->front->name;
 	info->old_front.bo = get_private(info->front)->bo;
@@ -1050,6 +1052,7 @@ sna_dri_page_flip(struct sna *sna, struct sna_dri_frame_event *info)
 
 	info->front->name = info->back->name;
 	get_private(info->front)->bo = bo;
+	return true;
 }
 
 static bool
@@ -1383,8 +1386,8 @@ void sna_dri_vblank_handler(struct sna *sna, struct drm_event_vblank *event)
 	switch (info->type) {
 	case DRI2_FLIP:
 		/* If we can still flip... */
-		if (can_flip(sna, draw, info->front, info->back)) {
-			sna_dri_page_flip(sna, info);
+		if (can_flip(sna, draw, info->front, info->back) &&
+		    sna_dri_page_flip(sna, info)) {
 			info->back->name = info->old_front.name;
 			get_private(info->back)->bo = info->old_front.bo;
 			info->old_front.bo = NULL;
@@ -1446,7 +1449,7 @@ done:
 	sna_dri_frame_event_info_free(sna, draw, info);
 }
 
-static void
+static bool
 sna_dri_flip_continue(struct sna *sna, struct sna_dri_frame_event *info)
 {
 	struct dri_bo tmp;
@@ -1457,12 +1460,14 @@ sna_dri_flip_continue(struct sna *sna, struct sna_dri_frame_event *info)
 
 	tmp = info->old_front;
 
-	sna_dri_page_flip(sna, info);
+	if (!sna_dri_page_flip(sna, info))
+		return false;
 
 	get_private(info->back)->bo = tmp.bo;
 	info->back->name = tmp.name;
 
 	info->next_front.name = 0;
+	return true;
 }
 
 static void chain_flip(struct sna *sna)
@@ -1480,9 +1485,9 @@ static void chain_flip(struct sna *sna)
 	}
 
 	if (chain->type == DRI2_FLIP &&
-	    can_flip(sna, chain->draw, chain->front, chain->back)) {
+	    can_flip(sna, chain->draw, chain->front, chain->back) &&
+	    sna_dri_page_flip(sna, chain)) {
 		DBG(("%s: performing chained flip\n", __FUNCTION__));
-		sna_dri_page_flip(sna, chain);
 
 		chain->back->name = chain->old_front.name;
 		get_private(chain->back)->bo = chain->old_front.bo;
@@ -1577,8 +1582,8 @@ static void sna_dri_flip_event(struct sna *sna,
 				sna_dri_frame_event_info_free(sna, flip->draw, flip);
 			}
 		} else if (flip->draw &&
-			   can_flip(sna, flip->draw, flip->front, flip->back)) {
-			sna_dri_flip_continue(sna, flip);
+			   can_flip(sna, flip->draw, flip->front, flip->back) &&
+			   sna_dri_flip_continue(sna, flip)) {
 			DRI2SwapComplete(flip->client, flip->draw,
 					 0, 0, 0,
 					 DRI2_FLIP_COMPLETE,
@@ -1805,9 +1810,7 @@ sna_dri_schedule_flip(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 			return true;
 		}
 
-		sna_dri_page_flip(sna, info);
-
-		if (info->count == 0) {
+		if (!sna_dri_page_flip(sna, info)) {
 			sna_dri_frame_event_info_free(sna, draw, info);
 			return false;
 		} else if (info->type != DRI2_FLIP) {
@@ -2253,7 +2256,8 @@ blit:
 		sna_dri_reference_buffer(front);
 		sna_dri_reference_buffer(back);
 
-		sna_dri_page_flip(sna, info);
+		if (!sna_dri_page_flip(sna, info))
+			goto blit;
 
 		info->next_front.name = info->front->name;
 		info->next_front.bo = get_private(info->front)->bo;


More information about the xorg-commit mailing list