xf86-video-intel: 4 commits - configure.ac Makefile.am src/sna/sna_display.c src/sna/sna.h src/sna/sna_present.c
Chris Wilson
ickle at kemper.freedesktop.org
Thu Mar 24 11:05:33 UTC 2016
Makefile.am | 4 ++
configure.ac | 3 --
src/sna/sna.h | 2 +
src/sna/sna_display.c | 2 +
src/sna/sna_present.c | 73 ++++++++++++++++++++++++++++++++++++++------------
5 files changed, 63 insertions(+), 21 deletions(-)
New commits:
commit f6316fb6f04a61857995aa9fb757249fe3fbaebd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 24 11:03:07 2016 +0000
configure: Remove ACLOCAL_FLAGS passthrough
Still not working right, remove it to keep the standard build working.
Sorry if you have been relying on ACLOCAL_FLAGS.
Reported-by: Sedat Dilek <sedat.dilek at gmail.com>
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/Makefile.am b/Makefile.am
index c60e8a7..de5fbe1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -18,7 +18,9 @@
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-ACLOCAL_AMFLAGS = $(ACLOCAL_FLAGS) -I m4
+#Having problems passing through user flags as libtool complains
+#ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
+ACLOCAL_AMFLAGS = -I m4
SUBDIRS = man libobj xvmc src tools
commit e4e469a0ede6974e1f916843f9317244516f7674
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 24 11:01:52 2016 +0000
configure: Remove test for strlcat
There's no point in testing for functions we don't use and seem to cause
problems for Clang.
Reported-by: Sedat Dilek <sedat.dilek at gmail.com>
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/configure.ac b/configure.ac
index c18ad96..b121515 100644
--- a/configure.ac
+++ b/configure.ac
@@ -62,9 +62,6 @@ AC_DISABLE_STATIC
AC_PROG_LIBTOOL
AC_SYS_LARGEFILE
-# Check for common libc routines redefined by os.h
-AC_CHECK_FUNCS([strlcpy strlcat strndup], [], [])
-
# Platform specific settings
case $host_os in
*linux*)
commit 02f535e8f3659f1147c6f2e698bd5d8730dec19b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 24 09:39:06 2016 +0000
sna/present: Requeue early vblank completions
If the vblank completes too early (e.g. due to a modeset), try
requeueing it so that it fires at the expected time (and so after the
modeset).
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 ab07894..93c7f06 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -48,6 +48,8 @@ struct sna_present_event {
};
static void sna_present_unflip(ScreenPtr screen, uint64_t event_id);
+static bool sna_present_queue(struct sna_present_event *info,
+ uint64_t last_msc);
static inline struct sna_present_event *
to_present_event(uintptr_t data)
@@ -111,6 +113,13 @@ static void vblank_complete(struct sna_present_event *info,
{
int n;
+ if (msc < info->target_msc) {
+ DBG(("%s: %d too early, now %lld, expected %lld\n",
+ __FUNCTION__, (long long)msc, (long long)info->target_msc));
+ if (sna_present_queue(info, msc))
+ return;
+ }
+
DBG(("%s: %d events complete\n", __FUNCTION__, info->n_event_id));
for (n = 0; n < info->n_event_id; n++) {
DBG(("%s: pipe=%d tv=%d.%06d msc=%lld (target=%lld), event=%lld complete%s\n", __FUNCTION__,
@@ -228,6 +237,36 @@ static bool sna_fake_vblank(struct sna_present_event *info)
return TimerSet(NULL, 0, delay, sna_fake_vblank_handler, info);
}
+static bool sna_present_queue(struct sna_present_event *info,
+ uint64_t last_msc)
+{
+ union drm_wait_vblank vbl;
+
+ DBG(("%s: target msc=%llu, seq=%u (last_msc=%llu)\n",
+ __FUNCTION__,
+ (long long)info->target_msc,
+ (unsigned)info->target_msc,
+ (long long)last_msc));
+ assert(info->target_msc - last_msc < 1ull<<32);
+
+ VG_CLEAR(vbl);
+ vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
+ vbl.request.sequence = info->target_msc;
+ vbl.request.signal = (uintptr_t)MARK_PRESENT(info);
+ if (sna_wait_vblank(info->sna, &vbl, sna_crtc_pipe(info->crtc))) {
+ DBG(("%s: vblank enqueue failed, faking\n", __FUNCTION__));
+ if (!sna_fake_vblank(info))
+ return false;
+ } else {
+ if (info->target_msc - last_msc == 1) {
+ sna_crtc_set_vblank(info->crtc);
+ info->crtc = mark_crtc(info->crtc);
+ }
+ }
+
+ return true;
+}
+
static RRCrtcPtr
sna_present_get_crtc(WindowPtr window)
{
@@ -306,7 +345,6 @@ sna_present_queue_vblank(RRCrtcPtr crtc, uint64_t event_id, uint64_t msc)
struct sna *sna = to_sna_from_screen(crtc->pScreen);
struct sna_present_event *info, *tmp;
const struct ust_msc *swap;
- union drm_wait_vblank vbl;
swap = sna_crtc_last_swap(crtc->devPrivate);
DBG(("%s(pipe=%d, event=%lld, msc=%lld, last swap=%lld)\n",
@@ -367,22 +405,10 @@ sna_present_queue_vblank(RRCrtcPtr crtc, uint64_t event_id, uint64_t msc)
info->n_event_id = 1;
list_add_tail(&info->link, &tmp->link);
- VG_CLEAR(vbl);
- vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT;
- vbl.request.sequence = msc;
- vbl.request.signal = (uintptr_t)MARK_PRESENT(info);
- if (sna_wait_vblank(sna, &vbl, sna_crtc_pipe(info->crtc))) {
- DBG(("%s: vblank enqueue failed, faking\n", __FUNCTION__));
- if (!sna_fake_vblank(info)) {
- list_del(&info->link);
- free(info);
- return BadAlloc;
- }
- } else {
- if (msc - swap->msc == 1) {
- sna_crtc_set_vblank(info->crtc);
- info->crtc = mark_crtc(info->crtc);
- }
+ if (!sna_present_queue(info, swap->msc)) {
+ list_del(&info->link);
+ free(info);
+ return BadAlloc;
}
return Success;
commit 1b82b7b48d17b4b3401e9d82b0fe86df06c8d451
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Mar 24 10:31:02 2016 +0000
sna/present: Cancel pending unflips when resizing the screen
Otherwise we try to flip back before we complete the mode change.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 3c19aa5..755bd8e 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -599,11 +599,13 @@ bool sna_present_open(struct sna *sna, ScreenPtr pScreen);
void sna_present_update(struct sna *sna);
void sna_present_close(struct sna *sna, ScreenPtr pScreen);
void sna_present_vblank_handler(struct drm_event_vblank *event);
+void sna_present_cancel_flip(struct sna *sna);
#else
static inline bool sna_present_open(struct sna *sna, ScreenPtr pScreen) { return false; }
static inline void sna_present_update(struct sna *sna) { }
static inline void sna_present_close(struct sna *sna, ScreenPtr pScreen) { }
static inline void sna_present_vblank_handler(struct drm_event_vblank *event) { }
+void sna_present_cancel_flip(struct sna *sna) { }
#endif
extern bool sna_crtc_set_sprite_rotation(xf86CrtcPtr crtc, uint32_t rotation);
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index ad8690e..6ceb515 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -5346,6 +5346,8 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
assert(sna->mode.shadow_damage == NULL);
assert(sna->mode.shadow == NULL);
+ /* Cancel a pending [un]flip (as the pixmaps no longer match) */
+ sna_present_cancel_flip(sna);
copy_front(sna, sna->front, new_front);
screen->SetScreenPixmap(new_front);
diff --git a/src/sna/sna_present.c b/src/sna/sna_present.c
index 1624063..ab07894 100644
--- a/src/sna/sna_present.c
+++ b/src/sna/sna_present.c
@@ -790,6 +790,19 @@ reset_mode:
goto reset_mode;
}
+void sna_present_cancel_flip(struct sna *sna)
+{
+ if (sna->present.unflip) {
+ const struct ust_msc *swap;
+
+ swap = sna_crtc_last_swap(sna_primary_crtc(sna));
+ present_event_notify(sna->present.unflip,
+ swap_ust(swap), swap->msc);
+
+ sna->present.unflip = 0;
+ }
+}
+
static present_screen_info_rec present_info = {
.version = PRESENT_SCREEN_INFO_VERSION,
More information about the xorg-commit
mailing list