xf86-video-intel: 4 commits - src/sna/sna_display.c src/sna/sna_dri2.c src/sna/sna_present.c
Chris Wilson
ickle at kemper.freedesktop.org
Wed Jun 7 08:51:52 UTC 2017
src/sna/sna_display.c | 19 +++++++++++--------
src/sna/sna_dri2.c | 12 ++++++++++--
src/sna/sna_present.c | 15 +++++++++------
3 files changed, 30 insertions(+), 16 deletions(-)
New commits:
commit 405ca1e74cf531bc7ca111fb7dd4fec6b7a10761
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Jun 7 09:21:45 2017 +0100
sna/present: Move too-late unflip check earlier
Present only unflips after a resize, after it has lost control of the
Screen. It's unflip request is stale and triggers an assert about the
graphical glitch - just reorder the assert to ignore the snafu.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_present.c b/src/sna/sna_present.c
index 2796d972..64f4f008 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -899,10 +899,11 @@ notify:
swap->tv_sec, swap->tv_usec, (long long)swap->msc,
(long long)event_id));
present_event_notify(event_id, swap_ust(swap), swap->msc);
+ assert(!(sna->flags & SNA_TEAR_FREE) ||
+ sna->mode.shadow_enabled);
return;
}
- assert(!sna->mode.shadow_enabled);
if (sna->mode.flip_active) {
DBG(("%s: %d outstanding flips, queueing unflip\n", __FUNCTION__, sna->mode.flip_active));
assert(sna->present.unflip == 0);
@@ -910,13 +911,19 @@ notify:
return;
}
+ bo = get_flip_bo(screen->GetScreenPixmap(screen));
+
+ /* Are we unflipping after a failure that left our ScreenP in place? */
+ if (!sna_needs_page_flip(sna, bo))
+ goto notify;
+
+ assert(!sna->mode.shadow_enabled);
if (sna->flags & SNA_TEAR_FREE) {
DBG(("%s: %s TearFree after Present flips\n",
__FUNCTION__, sna->mode.shadow_damage != NULL ? "enabling" : "disabling"));
sna->mode.shadow_enabled = sna->mode.shadow_damage != NULL;
}
- bo = get_flip_bo(screen->GetScreenPixmap(screen));
if (bo == NULL) {
reset_mode:
DBG(("%s: failed, trying to restore original mode\n", __FUNCTION__));
@@ -924,10 +931,6 @@ reset_mode:
goto notify;
}
- /* Are we unflipping after a failure that left our ScreenP in place? */
- if (!sna_needs_page_flip(sna, bo))
- goto notify;
-
assert(sna_pixmap(screen->GetScreenPixmap(screen))->pinned & PIN_SCANOUT);
if (sna->flags & SNA_HAS_ASYNC_FLIP) {
commit 1fc7841c792008bfbf18643f5fd4e16a29d6041b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Jun 7 09:28:26 2017 +0100
sna: Check active_scanout flag across TearFree exchange
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 201d224f..d1f01218 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1885,6 +1885,7 @@ static bool wait_for_shadow(struct sna *sna,
sna_pixmap_unmap(pixmap, priv);
DBG(("%s: setting front pixmap to handle=%d\n", __FUNCTION__, bo->handle));
+ assert(sna->mode.shadow->active_scanout);
sna->mode.shadow->active_scanout--;
tmp = priv->gpu_bo;
priv->gpu_bo = bo;
@@ -1892,6 +1893,7 @@ static bool wait_for_shadow(struct sna *sna,
kgem_bo_destroy(&sna->kgem, sna->mode.shadow);
sna->mode.shadow = tmp;
sna->mode.shadow->active_scanout++;
+ assert(sna->mode.shadow->active_scanout);
sna_dri2_pixmap_update_bo(sna, pixmap, bo);
@@ -1906,6 +1908,7 @@ done:
assert(!sna->mode.shadow_wait);
flush_events(sna);
+ assert(sna->mode.shadow->active_scanout);
return ret;
}
commit 8eed38e03a057bb1a7517b22a3b5557bcc4d3b84
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Jun 7 09:20:53 2017 +0100
sna/dri2: Check active state on front/back before swap
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index d89525cc..714595d8 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -3295,7 +3295,7 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
CARD64 current_msc;
bool immediate;
- DBG(("%s: draw=%lu %dx%d, pixmap=%ld %dx%d, back=%u (refs=%d/%d, flush=%d) , front=%u (refs=%d/%d, flush=%d)\n",
+ DBG(("%s: draw=%lu %dx%d, pixmap=%ld %dx%d, back=%u (refs=%d/%d, flush=%d, active=%d) , front=%u (refs=%d/%d, flush=%d, active=%d)\n",
__FUNCTION__,
(long)draw->id, draw->width, draw->height,
get_drawable_pixmap(draw)->drawable.serialNumber,
@@ -3305,10 +3305,12 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
get_private(back)->refcnt,
get_private(back)->bo->refcnt,
get_private(back)->bo->flush,
+ get_private(back)->bo->active_scanout,
get_private(front)->bo->handle,
get_private(front)->refcnt,
get_private(front)->bo->refcnt,
- get_private(front)->bo->flush));
+ get_private(front)->bo->flush,
+ get_private(front)->bo->active_scanout));
DBG(("%s(target_msc=%llu, divisor=%llu, remainder=%llu)\n",
__FUNCTION__,
@@ -3316,6 +3318,9 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
(long long)divisor,
(long long)remainder));
+ assert(front != back);
+ assert(get_private(front) != get_private(back));
+
assert(get_private(front)->refcnt);
assert(get_private(back)->refcnt);
@@ -3323,6 +3328,9 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
assert(get_private(front)->bo->refcnt);
assert(get_private(back)->bo->refcnt);
+ assert(get_private(front)->bo->active_scanout);
+ assert(!get_private(back)->bo->active_scanout);
+
if (get_private(front)->pixmap != get_drawable_pixmap(draw)) {
DBG(("%s: decoupled DRI2 front pixmap=%ld, actual pixmap=%ld\n",
__FUNCTION__,
commit abbc59087995fd6394003c67d4eb2bd55b74b778
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Jun 7 09:28:48 2017 +0100
sna: Squash compiler warning for mismatched pointers
No harm, just noise about a missing cast.
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 795d099b..201d224f 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3294,9 +3294,9 @@ static int plane_details(struct sna *sna, struct plane *p)
{
#define N_STACK_PROPS 32 /* must be a multiple of 2 */
struct local_mode_obj_get_properties arg;
- uint64_t stack_props[N_STACK_PROPS + N_STACK_PROPS/2];
- uint32_t *props = (uint32_t *)stack_props;
- uint64_t *values = props + N_STACK_PROPS;
+ uint64_t stack[N_STACK_PROPS + N_STACK_PROPS/2];
+ uint64_t *values = stack;
+ uint32_t *props = (uint32_t *)(values + N_STACK_PROPS);
int i, type = DRM_PLANE_TYPE_OVERLAY;
memset(&arg, 0, sizeof(struct local_mode_obj_get_properties));
@@ -3314,11 +3314,11 @@ static int plane_details(struct sna *sna, struct plane *p)
p->id, LOCAL_MODE_OBJECT_PLANE, arg.count_props));
if (arg.count_props > N_STACK_PROPS) {
- props = malloc(2*sizeof(uint64_t)*arg.count_props);
- if (props == NULL)
+ values = malloc(2*sizeof(uint64_t)*arg.count_props);
+ if (values == NULL)
return -1;
- values = (uint64_t *)props + arg.count_props;
+ props = (uint32_t *)(values + arg.count_props);
arg.props_ptr = (uintptr_t)props;
arg.prop_values_ptr = (uintptr_t)values;
@@ -3381,8 +3381,8 @@ static int plane_details(struct sna *sna, struct plane *p)
if (!xf86ReturnOptValBool(sna->Options, OPTION_ROTATION, TRUE))
p->rotation.supported = RR_Rotate_0;
- if (props != (uint32_t *)stack_props)
- free(props);
+ if (values != stack)
+ free(values);
DBG(("%s: plane=%d type=%d\n", __FUNCTION__, p->id, type));
return type;
More information about the xorg-commit
mailing list