[PATCH 05/19] present: Refactor execute in separate file

Roman Gilg subdiff at gmail.com
Mon Jan 29 13:34:03 UTC 2018


To be shared by multiple flip modes, refactor execute functionality,
such that logical chunks can go in new separate file.

Signed-off-by: Roman Gilg <subdiff at gmail.com>
---
 present/Makefile.am       |   1 +
 present/meson.build       |   1 +
 present/present_execute.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++
 present/present_priv.h    |  12 +++++
 present/present_scmd.c    |  66 +++-----------------------
 5 files changed, 136 insertions(+), 60 deletions(-)
 create mode 100644 present/present_execute.c

diff --git a/present/Makefile.am b/present/Makefile.am
index 3d3d38d..55ad295 100644
--- a/present/Makefile.am
+++ b/present/Makefile.am
@@ -7,6 +7,7 @@ libpresent_la_SOURCES = \
 	present.h \
 	present.c \
 	present_event.c \
+	present_execute.c \
 	present_fake.c \
 	present_fence.c \
 	present_notify.c \
diff --git a/present/meson.build b/present/meson.build
index 801e810..5e1dd3c 100644
--- a/present/meson.build
+++ b/present/meson.build
@@ -1,6 +1,7 @@
 srcs_present = [
     'present.c',
     'present_event.c',
+    'present_execute.c',
     'present_fake.c',
     'present_fence.c',
     'present_notify.c',
diff --git a/present/present_execute.c b/present/present_execute.c
new file mode 100644
index 0000000..e45e547
--- /dev/null
+++ b/present/present_execute.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright © 2013 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "present_priv.h"
+
+/*
+ * Called when the wait fence is triggered; just gets the current msc/ust and
+ * calls the proper execute again. That will re-check the fence and pend the
+ * request again if it's still not actually ready
+ */
+static void
+present_wait_fence_triggered(void *param)
+{
+    present_vblank_ptr      vblank = param;
+    ScreenPtr               screen = vblank->screen;
+    present_screen_priv_ptr screen_priv = present_screen_priv(screen);
+
+    screen_priv->re_execute(vblank);
+}
+
+Bool
+present_execute_wait(present_vblank_ptr vblank, uint64_t crtc_msc)
+{
+    WindowPtr                   window = vblank->window;
+    ScreenPtr                   screen = window->drawable.pScreen;
+    present_screen_priv_ptr screen_priv = present_screen_priv(screen);
+
+    if (vblank->requeue) {
+        vblank->requeue = FALSE;
+        if (msc_is_after(vblank->target_msc, crtc_msc) &&
+            Success == screen_priv->queue_vblank(screen,
+                                                 vblank->crtc,
+                                                 vblank->event_id,
+                                                 vblank->target_msc))
+            return TRUE;
+    }
+
+    if (vblank->wait_fence) {
+        if (!present_fence_check_triggered(vblank->wait_fence)) {
+            present_fence_set_callback(vblank->wait_fence, present_wait_fence_triggered, vblank);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+void
+present_execute_copy(present_vblank_ptr vblank, uint64_t crtc_msc)
+{
+    WindowPtr                   window = vblank->window;
+    ScreenPtr                   screen = window->drawable.pScreen;
+    present_screen_priv_ptr screen_priv = present_screen_priv(screen);
+
+    /* If present_flip failed, we may have to requeue for the target MSC */
+    if (vblank->target_msc == crtc_msc + 1 &&
+        Success == screen_priv->queue_vblank(screen,
+                                             vblank->crtc,
+                                             vblank->event_id,
+                                             vblank->target_msc)) {
+        vblank->queued = TRUE;
+        return;
+    }
+
+    present_copy_region(&window->drawable, vblank->pixmap, vblank->update, vblank->x_off, vblank->y_off);
+
+    /* present_copy_region sticks the region into a scratch GC,
+     * which is then freed, freeing the region
+     */
+    vblank->update = NULL;
+    screen_priv->flush(window);
+
+    present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence);
+}
+
+void
+present_execute_post(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
+{
+    uint8_t mode;
+
+    /* Compute correct CompleteMode
+     */
+    if (vblank->kind == PresentCompleteKindPixmap) {
+        if (vblank->pixmap && vblank->window)
+            mode = PresentCompleteModeCopy;
+        else
+            mode = PresentCompleteModeSkip;
+    }
+    else
+        mode = PresentCompleteModeCopy;
+
+    present_vblank_notify(vblank, vblank->kind, mode, ust, crtc_msc);
+    present_vblank_destroy(vblank);
+}
diff --git a/present/present_priv.h b/present/present_priv.h
index b1dd82d..4e9c6c7 100644
--- a/present/present_priv.h
+++ b/present/present_priv.h
@@ -236,6 +236,18 @@ Bool
 present_event_init(void);
 
 /*
+ * present_execute.c
+ */
+Bool
+present_execute_wait(present_vblank_ptr vblank, uint64_t crtc_msc);
+
+void
+present_execute_copy(present_vblank_ptr vblank, uint64_t crtc_msc);
+
+void
+present_execute_post(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc);
+
+/*
  * present_fake.c
  */
 int
diff --git a/present/present_scmd.c b/present/present_scmd.c
index a64a0c7..22c4e98 100644
--- a/present/present_scmd.c
+++ b/present/present_scmd.c
@@ -537,18 +537,6 @@ present_check_flip_window (WindowPtr window)
 }
 
 /*
- * Called when the wait fence is triggered; just gets the current msc/ust and
- * calls present_execute again. That will re-check the fence and pend the
- * request again if it's still not actually ready
- */
-static void
-present_wait_fence_triggered(void *param)
-{
-    present_vblank_ptr  vblank = param;
-    present_re_execute(vblank);
-}
-
-/*
  * Once the required MSC has been reached, execute the pending request.
  *
  * For requests to actually present something, either blt contents to
@@ -564,24 +552,9 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
     WindowPtr                   window = vblank->window;
     ScreenPtr                   screen = window->drawable.pScreen;
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
-    uint8_t                     mode;
-
-    if (vblank->requeue) {
-        vblank->requeue = FALSE;
-        if (msc_is_after(vblank->target_msc, crtc_msc) &&
-            Success == present_queue_vblank(screen,
-                                            vblank->crtc,
-                                            vblank->event_id,
-                                            vblank->target_msc))
-            return;
-    }
 
-    if (vblank->wait_fence) {
-        if (!present_fence_check_triggered(vblank->wait_fence)) {
-            present_fence_set_callback(vblank->wait_fence, present_wait_fence_triggered, vblank);
-            return;
-        }
-    }
+    if (present_execute_wait(vblank, crtc_msc))
+        return;
 
     if (vblank->flip && vblank->pixmap && vblank->window) {
         if (screen_priv->flip_pending || screen_priv->unflip_event_id) {
@@ -662,44 +635,17 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
                 present_unflip(screen);
         }
 
-        /* If present_flip failed, we may have to requeue for the target MSC */
-        if (vblank->target_msc == crtc_msc + 1 &&
-            Success == present_queue_vblank(screen,
-                                            vblank->crtc,
-                                            vblank->event_id,
-                                            vblank->target_msc)) {
+        present_execute_copy(vblank, crtc_msc);
+
+        if (vblank->queued) {
             xorg_list_add(&vblank->event_queue, &present_exec_queue);
             xorg_list_append(&vblank->window_list,
                              &present_get_window_priv(window, TRUE)->vblank);
-            vblank->queued = TRUE;
             return;
         }
-
-        present_copy_region(&window->drawable, vblank->pixmap, vblank->update, vblank->x_off, vblank->y_off);
-
-        /* present_copy_region sticks the region into a scratch GC,
-         * which is then freed, freeing the region
-         */
-        vblank->update = NULL;
-        present_flush(window);
-
-        present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence);
     }
 
-    /* Compute correct CompleteMode
-     */
-    if (vblank->kind == PresentCompleteKindPixmap) {
-        if (vblank->pixmap && vblank->window)
-            mode = PresentCompleteModeCopy;
-        else
-            mode = PresentCompleteModeSkip;
-    }
-    else
-        mode = PresentCompleteModeCopy;
-
-
-    present_vblank_notify(vblank, vblank->kind, mode, ust, crtc_msc);
-    present_vblank_destroy(vblank);
+    present_execute_post(vblank, ust, crtc_msc);
 }
 
 int
-- 
2.7.4



More information about the xorg-devel mailing list