xf86-video-intel: src/sna/sna_display.c src/sna/sna_dri2.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Jan 16 00:37:13 PST 2015
src/sna/sna_display.c | 36 +++++++++++++++++++++++++++++++++---
src/sna/sna_dri2.c | 27 +++++++++++++++++++++------
2 files changed, 54 insertions(+), 9 deletions(-)
New commits:
commit 6a6efd3517f48b191ac727b17380c3251a689490
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Jan 15 12:17:27 2015 +0000
sna/dri2: Track tracking of active-scanout for back buffer replacement
In the end it turned out to a small typo, s/scanout/active_scanout/ in
consideration of reusing the cache. Though there are a number of very
useful debug improvements along the way.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index db337fb..5b45618 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1538,6 +1538,8 @@ __sna_crtc_disable(struct sna *sna, struct sna_crtc *sna_crtc)
sna_crtc_disable_shadow(sna, sna_crtc);
if (sna_crtc->bo) {
+ DBG(("%s: releasing handle=%d from scanout, active=%d\n",
+ __FUNCTION__,sna_crtc->bo->handle, sna_crtc->bo->active_scanout-1));
assert(sna_crtc->bo->active_scanout);
assert(sna_crtc->bo->refcnt >= sna_crtc->bo->active_scanout);
sna_crtc->bo->active_scanout--;
@@ -2349,6 +2351,9 @@ retry: /* Attach per-crtc pixmap or direct */
}
bo->active_scanout++;
+ DBG(("%s: marking handle=%d as active=%d (removing %d from scanout, active=%d)\n",
+ __FUNCTION__, bo->handle, bo->active_scanout,
+ saved_bo ? saved_bo->handle : 0, saved_bo ? saved_bo->active_scanout - 1: -1));
if (saved_bo) {
assert(saved_bo->active_scanout);
assert(saved_bo->refcnt >= saved_bo->active_scanout);
@@ -2361,7 +2366,8 @@ retry: /* Attach per-crtc pixmap or direct */
sna_crtc_damage(crtc);
sna->mode.front_active += saved_bo == NULL;
sna->mode.dirty = true;
- DBG(("%s: front_active=%d\n", __FUNCTION__, sna->mode.front_active));
+ DBG(("%s: handle=%d, scanout_active=%d, front_active=%d\n",
+ __FUNCTION__, bo->handle, bo->active_scanout, sna->mode.front_active));
return TRUE;
@@ -5350,6 +5356,9 @@ sna_page_flip(struct sna *sna,
crtc_offset, crtc->offset));
fixup_flip:
if (crtc->bo != bo && sna_crtc_flip(sna, crtc, bo, crtc->base->x, crtc->base->y)) {
+ DBG(("%s: removing handle=%d [active_scanout=%d] from scanout, installing handle=%d [active_scanout=%d]\n",
+ __FUNCTION__, crtc->bo->handle, crtc->bo->active_scanout,
+ bo->handle, bo->active_scanout));
assert(crtc->bo->active_scanout);
assert(crtc->bo->refcnt >= crtc->bo->active_scanout);
crtc->bo->active_scanout--;
@@ -5437,6 +5446,9 @@ retry_flip:
crtc->flip_serial = crtc->mode_serial;
crtc->flip_pending = true;
sna->mode.flip_active++;
+
+ DBG(("%s: recording flip on CRTC:%d handle=%d, active_scanout=%d, serial=%d\n",
+ __FUNCTION__, crtc->id, crtc->flip_bo->handle, crtc->flip_bo->active_scanout, crtc->flip_serial));
}
next_crtc:
@@ -7199,6 +7211,9 @@ void sna_mode_redisplay(struct sna *sna)
if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_PAGE_FLIP, &arg)) {
if (sna_crtc_flip(sna, sna_crtc, bo, 0, 0)) {
+ DBG(("%s: removing handle=%d [active_scanout=%d] from scanout, installing handle=%d [active_scanout=%d]\n",
+ __FUNCTION__, sna_crtc->bo->handle, sna_crtc->bo->active_scanout,
+ bo->handle, bo->active_scanout));
assert(sna_crtc->bo->active_scanout);
assert(sna_crtc->bo->refcnt >= sna_crtc->bo->active_scanout);
sna_crtc->bo->active_scanout--;
@@ -7232,6 +7247,9 @@ void sna_mode_redisplay(struct sna *sna)
sna_crtc->flip_serial = sna_crtc->mode_serial;
sna_crtc->client_bo = kgem_bo_reference(sna_crtc->bo);
+
+ DBG(("%s: recording flip on CRTC:%d handle=%d, active_scanout=%d, serial=%d\n",
+ __FUNCTION__, sna_crtc->id, sna_crtc->flip_bo->handle, sna_crtc->flip_bo->active_scanout, sna_crtc->flip_serial));
}
}
}
@@ -7331,6 +7349,9 @@ void sna_mode_redisplay(struct sna *sna)
if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_PAGE_FLIP, &arg)) {
if (sna_crtc_flip(sna, sna_crtc, bo, 0, 0)) {
+ DBG(("%s: removing handle=%d [active_scanout=%d] from scanout, installing handle=%d [active_scanout=%d]\n",
+ __FUNCTION__, sna_crtc->bo->handle, sna_crtc->bo->active_scanout - 1,
+ bo->handle, bo->active_scanout));
assert(sna_crtc->bo->active_scanout);
assert(sna_crtc->bo->refcnt >= sna_crtc->bo->active_scanout);
sna_crtc->bo->active_scanout--;
@@ -7383,6 +7404,8 @@ disable1:
sna_crtc->flip_pending = true;
sna_crtc->client_bo = kgem_bo_reference(sna_crtc->bo);
+ DBG(("%s: recording flip on CRTC:%d handle=%d, active_scanout=%d, serial=%d\n",
+ __FUNCTION__, sna_crtc->id, sna_crtc->flip_bo->handle, sna_crtc->flip_bo->active_scanout, sna_crtc->flip_serial));
} else {
sna_crtc_redisplay(crtc, &damage, sna_crtc->bo);
kgem_scanout_flush(&sna->kgem, sna_crtc->bo);
@@ -7478,6 +7501,9 @@ fixup_shadow:
y << 16 | x, crtc->offset));
fixup_flip:
if (sna_crtc_flip(sna, crtc, flip_bo, x, y)) {
+ DBG(("%s: removing handle=%d [active_scanout=%d] from scanout, installing handle=%d [active_scanout=%d]\n",
+ __FUNCTION__, crtc->bo->handle, crtc->bo->active_scanout-1,
+ flip_bo->handle, flip_bo->active_scanout));
assert(flip_bo != crtc->bo);
assert(crtc->bo->active_scanout);
assert(crtc->bo->refcnt >= crtc->bo->active_scanout);
@@ -7524,6 +7550,9 @@ fixup_flip:
crtc->flip_serial = crtc->mode_serial;
crtc->flip_pending = true;
+ DBG(("%s: recording flip on CRTC:%d handle=%d, active_scanout=%d, serial=%d\n",
+ __FUNCTION__, crtc->id, crtc->flip_bo->handle, crtc->flip_bo->active_scanout, crtc->flip_serial));
+
{
struct drm_i915_gem_busy busy = { flip_bo->handle };
if (drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_GEM_BUSY, &busy) == 0) {
@@ -7617,8 +7646,9 @@ again:
assert(crtc->flip_bo->refcnt >= crtc->flip_bo->active_scanout);
if (crtc->flip_serial == crtc->mode_serial) {
- DBG(("%s: removing handle=%d from scanout, installing handle=%d\n",
- __FUNCTION__, crtc->bo->handle, crtc->flip_bo->handle));
+ DBG(("%s: removing handle=%d [active_scanout=%d] from scanout, installing handle=%d [active_scanout=%d]\n",
+ __FUNCTION__, crtc->bo->handle, crtc->bo->active_scanout - 1,
+ crtc->flip_bo->handle, crtc->flip_bo->active_scanout));
assert(crtc->bo->active_scanout);
assert(crtc->bo->refcnt >= crtc->bo->active_scanout);
crtc->bo->active_scanout--;
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index e639f9d..1ce3c8e 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -98,6 +98,7 @@ struct dri_bo {
struct list link;
struct kgem_bo *bo;
uint32_t name;
+ int flags;
};
struct sna_dri2_event {
@@ -134,6 +135,7 @@ sna_dri2_get_back(struct sna *sna,
{
struct kgem_bo *bo;
uint32_t name;
+ int flags;
bool reuse;
DBG(("%s: draw size=%dx%d, buffer size=%dx%d\n",
@@ -144,7 +146,7 @@ sna_dri2_get_back(struct sna *sna,
bo = get_private(back)->bo;
assert(bo->refcnt);
DBG(("%s: back buffer handle=%d, scanout?=%d, refcnt=%d\n",
- __FUNCTION__, bo->handle, bo->active_scanout, get_private(back)->refcnt));
+ __FUNCTION__, bo->handle, bo->active_scanout, get_private(back)->refcnt));
if (bo->active_scanout == 0) {
DBG(("%s: reuse unattached back\n", __FUNCTION__));
get_private(back)->stale = false;
@@ -156,13 +158,17 @@ sna_dri2_get_back(struct sna *sna,
if (info) {
struct dri_bo *c;
list_for_each_entry(c, &info->cache, link) {
- if (c->bo && c->bo->scanout == 0) {
+ if (c->bo && c->bo->active_scanout == 0) {
bo = c->bo;
name = c->name;
- DBG(("%s: reuse cache handle=%d\n", __FUNCTION__, bo->handle));
+ flags = c->flags;
+ DBG(("%s: reuse cache handle=%d, name=%d, flags=%d\n", __FUNCTION__, bo->handle, name, flags));
list_move_tail(&c->link, &info->cache);
c->bo = NULL;
+ break;
}
+ DBG(("%s: cache: handle=%d, active=%d\n",
+ __FUNCTION__, c->bo ? c->bo->handle : 0, c->bo ? c->bo->active_scanout : -1));
}
}
if (bo == NULL) {
@@ -179,6 +185,8 @@ sna_dri2_get_back(struct sna *sna,
kgem_bo_destroy(&sna->kgem, bo);
return;
}
+
+ flags = 0;
}
assert(bo->active_scanout == 0);
@@ -198,8 +206,9 @@ sna_dri2_get_back(struct sna *sna,
if (c != NULL) {
c->bo = ref(get_private(back)->bo);
c->name = back->name;
+ c->flags = back->flags;
list_add(&c->link, &info->cache);
- DBG(("%s: cacheing handle=%d (name=%d)\n", __FUNCTION__, c->bo->handle, c->name));
+ DBG(("%s: cacheing handle=%d (name=%d, flags=%d, active_scanout=%d)\n", __FUNCTION__, c->bo->handle, c->name, c->flags, c->bo->active_scanout));
}
}
@@ -210,6 +219,7 @@ sna_dri2_get_back(struct sna *sna,
get_private(back)->size = draw->height << 16 | draw->width;
back->pitch = bo->pitch;
back->name = name;
+ back->flags = flags;
get_private(back)->stale = false;
}
@@ -301,7 +311,9 @@ sna_dri2_reuse_buffer(DrawablePtr draw, DRI2BufferPtr buffer)
assert(kgem_bo_flink(&to_sna_from_drawable(draw)->kgem, get_private(buffer)->bo) == buffer->name);
assert(get_private(buffer)->bo->refcnt);
assert(get_private(buffer)->bo->active_scanout == 0);
+ DBG(("reusing back buffer, age = %d\n", buffer->flags));
}
+
}
static bool swap_limit(DrawablePtr draw, int limit)
@@ -473,7 +485,7 @@ sna_dri2_create_buffer(DrawablePtr draw,
if (buffer) {
private = get_private(buffer);
- DBG(("%s: reusing front buffer attachment, win=%lu %dx%d, pixmap=%ld [%ld] %dx%d, handle=%d, name=%d\n",
+ DBG(("%s: reusing front buffer attachment, win=%lu %dx%d, pixmap=%ld [%ld] %dx%d, handle=%d, name=%d, active_scanout=%d\n",
__FUNCTION__,
draw->type != DRAWABLE_PIXMAP ? (long)draw->id : (long)0,
draw->width, draw->height,
@@ -481,7 +493,8 @@ sna_dri2_create_buffer(DrawablePtr draw,
private->pixmap->drawable.serialNumber,
pixmap->drawable.width,
pixmap->drawable.height,
- private->bo->handle, buffer->name));
+ private->bo->handle, buffer->name,
+ private->bo->active_scanout));
assert(private->pixmap == pixmap);
assert(sna_pixmap(pixmap)->flush);
@@ -3313,8 +3326,10 @@ bool sna_dri2_open(struct sna *sna, ScreenPtr screen)
#endif
#if USE_ASYNC_SWAP
+ DBG(("%s: enabled async swap and buffer age\n", __FUNCTION__));
info.version = 10;
info.scheduleSwap0 = 1;
+ info.bufferAge = 1;
#endif
return DRI2ScreenInit(screen, &info);
More information about the xorg-commit
mailing list