diff options
author | Roman Gilg <subdiff@gmail.com> | 2018-03-13 16:00:38 +0100 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2018-03-28 14:36:20 -0400 |
commit | 679ffbf5f39822ea508e50f1b7c92a2a9e79f7bb (patch) | |
tree | 8d8e78d137377a4cac33824f9fbfd51a3a52dd05 /present | |
parent | 1e7d8902bfe7cfb79c41b14fc6b50bcbe4f7c800 (diff) |
present: Refactor execute in separate file
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@gmail.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Diffstat (limited to 'present')
-rw-r--r-- | present/Makefile.am | 1 | ||||
-rw-r--r-- | present/meson.build | 1 | ||||
-rw-r--r-- | present/present_execute.c | 120 | ||||
-rw-r--r-- | present/present_priv.h | 12 | ||||
-rw-r--r-- | present/present_scmd.c | 70 |
5 files changed, 140 insertions, 64 deletions
diff --git a/present/Makefile.am b/present/Makefile.am index 3d3d38d76..55ad2950e 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 d22cd09a7..84bea9ba4 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 000000000..c9b5678c5 --- /dev/null +++ b/present/present_execute.c @@ -0,0 +1,120 @@ +/* + * 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) { + if (vblank->has_suboptimal && vblank->reason == PRESENT_FLIP_REASON_BUFFER_FORMAT) + mode = PresentCompleteModeSuboptimalCopy; + else + 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 971bce505..05c793d21 100644 --- a/present/present_priv.h +++ b/present/present_priv.h @@ -245,6 +245,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 0376b4e75..4582887d7 100644 --- a/present/present_scmd.c +++ b/present/present_scmd.c @@ -551,18 +551,6 @@ present_can_window_flip(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 @@ -578,24 +566,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) { @@ -676,48 +649,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) { - if (vblank->has_suboptimal && vblank->reason == PRESENT_FLIP_REASON_BUFFER_FORMAT) - mode = PresentCompleteModeSuboptimalCopy; - else - 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 |