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