|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From 95dbf6b19e8f25e28224b954ef99d96225b4e6e7 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From: David Herrmann <dh.herrmann@gmail.com>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Date: Sat, 20 Sep 2014 11:10:04 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Subject: [PATCH] terminal: split grdrm_crtc_commit() apart
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
This helper is quite huge, split it apart to make it easier to follow.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/libsystemd-terminal/grdev-drm.c | 228 ++++++++++++++++++++----------------
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
1 file changed, 129 insertions(+), 99 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/libsystemd-terminal/grdev-drm.c b/src/libsystemd-terminal/grdev-drm.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index f0f0448635..00aac292d2 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/libsystemd-terminal/grdev-drm.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/libsystemd-terminal/grdev-drm.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -1083,15 +1083,136 @@ static void grdrm_crtc_expose(grdrm_crtc *crtc) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
grdev_pipe_ready(&crtc->pipe->base, true);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-static void grdrm_crtc_commit(grdrm_crtc *crtc) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static void grdrm_crtc_commit_deep(grdrm_crtc *crtc, grdev_fb **slot) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ struct drm_mode_crtc set_crtc = { .crtc_id = crtc->object.id };
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_card *card = crtc->object.card;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_pipe *pipe = crtc->pipe;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_fb *fb = fb_from_base(*slot);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ size_t i;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(crtc);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(slot);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(*slot);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(pipe);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ set_crtc.set_connectors_ptr = PTR_TO_UINT64(crtc->set.connectors);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ set_crtc.count_connectors = crtc->set.n_connectors;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ set_crtc.fb_id = fb->id;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ set_crtc.x = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ set_crtc.y = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ set_crtc.mode_valid = 1;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ set_crtc.mode = crtc->set.mode;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = ioctl(card->fd, DRM_IOCTL_MODE_SETCRTC, &set_crtc);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_debug("grdrm: %s: cannot set crtc %" PRIu32 ": %m",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ card->base.name, crtc->object.id);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_card_async(card, r);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!crtc->applied) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_debug("grdrm: %s: crtc %" PRIu32 " applied via deep modeset",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ card->base.name, crtc->object.id);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ crtc->applied = true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ *slot = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ pipe->base.front = &fb->base;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ fb->flipid = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ ++pipe->counter;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ pipe->base.flipping = false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ pipe->base.flip = false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!pipe->base.back) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ for (i = 0; i < pipe->base.max_fbs; ++i) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!pipe->base.fbs[i])
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ fb = fb_from_base(pipe->base.fbs[i]);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (&fb->base == pipe->base.front)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ fb->flipid = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ pipe->base.back = &fb->base;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static int grdrm_crtc_commit_flip(grdrm_crtc *crtc, grdev_fb **slot) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
struct drm_mode_crtc_page_flip page_flip = { .crtc_id = crtc->object.id };
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_card *card = crtc->object.card;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_pipe *pipe = crtc->pipe;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_fb *fb = fb_from_base(*slot);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ uint32_t cnt;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ size_t i;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(crtc);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(slot);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(*slot);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(pipe);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!crtc->applied && !grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode))
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ cnt = ++pipe->counter ? : ++pipe->counter;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ page_flip.fb_id = fb->id;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ page_flip.flags = DRM_MODE_PAGE_FLIP_EVENT;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ page_flip.user_data = grdrm_encode_vblank_data(crtc->object.id, cnt);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = ioctl(card->fd, DRM_IOCTL_MODE_PAGE_FLIP, &page_flip);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_debug("grdrm: %s: cannot schedule page-flip on crtc %" PRIu32 ": %m",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ card->base.name, crtc->object.id);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (grdrm_card_async(card, r))
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!crtc->applied) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ log_debug("grdrm: %s: crtc %" PRIu32 " applied via page flip",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ card->base.name, crtc->object.id);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ crtc->applied = true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ pipe->base.flipping = true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ pipe->base.flip = false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ pipe->counter = cnt;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ fb->flipid = cnt;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ *slot = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!pipe->base.back) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ for (i = 0; i < pipe->base.max_fbs; ++i) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!pipe->base.fbs[i])
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ fb = fb_from_base(pipe->base.fbs[i]);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (&fb->base == pipe->base.front)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (fb->flipid)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ pipe->base.back = &fb->base;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return 1;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static void grdrm_crtc_commit(grdrm_crtc *crtc) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
struct drm_mode_crtc set_crtc = { .crtc_id = crtc->object.id };
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
grdrm_card *card = crtc->object.card;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
grdrm_pipe *pipe;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
grdev_fb **slot;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- grdrm_fb *fb;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- uint32_t cnt;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- size_t i;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(crtc);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -1141,102 +1262,11 @@ static void grdrm_crtc_commit(grdrm_crtc *crtc) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (!*slot)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- fb = fb_from_base(*slot);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (crtc->applied || grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode)) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- cnt = ++pipe->counter ? : ++pipe->counter;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- page_flip.fb_id = fb->id;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- page_flip.flags = DRM_MODE_PAGE_FLIP_EVENT;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- page_flip.user_data = grdrm_encode_vblank_data(crtc->object.id, cnt);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = ioctl(card->fd, DRM_IOCTL_MODE_PAGE_FLIP, &page_flip);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- log_debug("grdrm: %s: cannot schedule page-flip on crtc %" PRIu32 ": %m",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- card->base.name, crtc->object.id);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (grdrm_card_async(card, r))
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- /* fall through to deep modeset */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- } else {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (!crtc->applied) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- log_debug("grdrm: %s: crtc %" PRIu32 " applied via page flip",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- card->base.name, crtc->object.id);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- crtc->applied = true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- pipe->base.flipping = true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- pipe->counter = cnt;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- fb->flipid = cnt;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- *slot = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (!pipe->base.back) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- for (i = 0; i < pipe->base.max_fbs; ++i) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (!pipe->base.fbs[i])
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- fb = fb_from_base(pipe->base.fbs[i]);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (&fb->base == pipe->base.front)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (fb->flipid)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- pipe->base.back = &fb->base;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (!crtc->applied) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- set_crtc.set_connectors_ptr = PTR_TO_UINT64(crtc->set.connectors);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- set_crtc.count_connectors = crtc->set.n_connectors;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- set_crtc.fb_id = fb->id;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- set_crtc.x = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- set_crtc.y = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- set_crtc.mode_valid = 1;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- set_crtc.mode = crtc->set.mode;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = ioctl(card->fd, DRM_IOCTL_MODE_SETCRTC, &set_crtc);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- r = -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- log_debug("grdrm: %s: cannot set crtc %" PRIu32 ": %m",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- card->base.name, crtc->object.id);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- grdrm_card_async(card, r);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (!crtc->applied) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- log_debug("grdrm: %s: crtc %" PRIu32 " applied via deep modeset",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- card->base.name, crtc->object.id);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- crtc->applied = true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- *slot = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- pipe->base.front = &fb->base;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- fb->flipid = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- ++pipe->counter;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- pipe->base.flipping = false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (!pipe->base.back) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- for (i = 0; i < pipe->base.max_fbs; ++i) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (!pipe->base.fbs[i])
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- fb = fb_from_base(pipe->base.fbs[i]);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (&fb->base == pipe->base.front)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- continue;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- fb->flipid = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- pipe->base.back = &fb->base;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- break;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = grdrm_crtc_commit_flip(crtc, slot);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r == 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* in case we couldn't page-flip, perform deep modeset */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_crtc_commit_deep(crtc, slot);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- pipe->base.flip = false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
static void grdrm_crtc_restore(grdrm_crtc *crtc) {
|