present: Adapt flip mode API hooks for window flip mode

Flipping pixmaps per window needs additional arguments in the
flip mode API. Add these as preperation for window flip mode.

Signed-off-by: Roman Gilg <subdiff@gmail.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Roman Gilg 2018-03-13 16:00:46 +01:00 committed by Adam Jackson
parent 92b91b8cf3
commit 7b071b4e44
5 changed files with 16 additions and 8 deletions

View File

@ -52,6 +52,7 @@ present_execute_wait(present_vblank_ptr vblank, uint64_t crtc_msc)
vblank->requeue = FALSE; vblank->requeue = FALSE;
if (msc_is_after(vblank->target_msc, crtc_msc) && if (msc_is_after(vblank->target_msc, crtc_msc) &&
Success == screen_priv->queue_vblank(screen, Success == screen_priv->queue_vblank(screen,
window,
vblank->crtc, vblank->crtc,
vblank->event_id, vblank->event_id,
vblank->target_msc)) vblank->target_msc))
@ -77,6 +78,7 @@ present_execute_copy(present_vblank_ptr vblank, uint64_t crtc_msc)
/* If present_flip failed, we may have to requeue for the target MSC */ /* If present_flip failed, we may have to requeue for the target MSC */
if (vblank->target_msc == crtc_msc + 1 && if (vblank->target_msc == crtc_msc + 1 &&
Success == screen_priv->queue_vblank(screen, Success == screen_priv->queue_vblank(screen,
window,
vblank->crtc, vblank->crtc,
vblank->event_id, vblank->event_id,
vblank->target_msc)) { vblank->target_msc)) {

View File

@ -87,6 +87,7 @@ struct present_vblank {
}; };
typedef struct present_screen_priv present_screen_priv_rec, *present_screen_priv_ptr; typedef struct present_screen_priv present_screen_priv_rec, *present_screen_priv_ptr;
typedef struct present_window_priv present_window_priv_rec, *present_window_priv_ptr;
/* /*
* Mode hooks * Mode hooks
@ -123,9 +124,11 @@ typedef int (*present_priv_pixmap_ptr)(WindowPtr window,
present_notify_ptr notifies, present_notify_ptr notifies,
int num_notifies); int num_notifies);
typedef void (*present_priv_create_event_id_ptr)(present_vblank_ptr vblank); typedef void (*present_priv_create_event_id_ptr)(present_window_priv_ptr window_priv,
present_vblank_ptr vblank);
typedef int (*present_priv_queue_vblank_ptr)(ScreenPtr screen, typedef int (*present_priv_queue_vblank_ptr)(ScreenPtr screen,
WindowPtr window,
RRCrtcPtr crtc, RRCrtcPtr crtc,
uint64_t event_id, uint64_t event_id,
uint64_t msc); uint64_t msc);
@ -133,6 +136,7 @@ typedef void (*present_priv_flush_ptr)(WindowPtr window);
typedef void (*present_priv_re_execute_ptr)(present_vblank_ptr vblank); typedef void (*present_priv_re_execute_ptr)(present_vblank_ptr vblank);
typedef void (*present_priv_abort_vblank_ptr)(ScreenPtr screen, typedef void (*present_priv_abort_vblank_ptr)(ScreenPtr screen,
WindowPtr window,
RRCrtcPtr crtc, RRCrtcPtr crtc,
uint64_t event_id, uint64_t event_id,
uint64_t msc); uint64_t msc);
@ -206,7 +210,7 @@ typedef struct present_event {
int mask; int mask;
} present_event_rec; } present_event_rec;
typedef struct present_window_priv { struct present_window_priv {
WindowPtr window; WindowPtr window;
present_event_ptr events; present_event_ptr events;
RRCrtcPtr crtc; /* Last reported CRTC from get_ust_msc */ RRCrtcPtr crtc; /* Last reported CRTC from get_ust_msc */
@ -223,7 +227,7 @@ typedef struct present_window_priv {
present_vblank_ptr flip_pending; present_vblank_ptr flip_pending;
present_vblank_ptr flip_active; present_vblank_ptr flip_active;
} present_window_priv_rec, *present_window_priv_ptr; };
#define PresentCrtcNeverSet ((RRCrtcPtr) 1) #define PresentCrtcNeverSet ((RRCrtcPtr) 1)

View File

@ -47,7 +47,8 @@ static void
present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc); present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc);
static void static void
present_scmd_create_event_id(present_vblank_ptr vblank) present_scmd_create_event_id(present_window_priv_ptr window_priv,
present_vblank_ptr vblank)
{ {
vblank->event_id = ++present_event_id; vblank->event_id = ++present_event_id;
} }
@ -204,6 +205,7 @@ present_flush(WindowPtr window)
static int static int
present_queue_vblank(ScreenPtr screen, present_queue_vblank(ScreenPtr screen,
WindowPtr window,
RRCrtcPtr crtc, RRCrtcPtr crtc,
uint64_t event_id, uint64_t event_id,
uint64_t msc) uint64_t msc)
@ -751,7 +753,7 @@ present_scmd_pixmap(WindowPtr window,
xorg_list_append(&vblank->event_queue, &present_exec_queue); xorg_list_append(&vblank->event_queue, &present_exec_queue);
vblank->queued = TRUE; vblank->queued = TRUE;
if (msc_is_after(target_msc, crtc_msc)) { if (msc_is_after(target_msc, crtc_msc)) {
ret = present_queue_vblank(screen, target_crtc, vblank->event_id, target_msc); ret = present_queue_vblank(screen, window, target_crtc, vblank->event_id, target_msc);
if (ret == Success) if (ret == Success)
return Success; return Success;
@ -764,7 +766,7 @@ present_scmd_pixmap(WindowPtr window,
} }
static void static void
present_scmd_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64_t msc) present_scmd_abort_vblank(ScreenPtr screen, WindowPtr window, RRCrtcPtr crtc, uint64_t event_id, uint64_t msc)
{ {
present_vblank_ptr vblank; present_vblank_ptr vblank;

View File

@ -84,7 +84,7 @@ present_free_window_vblank(WindowPtr window)
present_vblank_ptr vblank, tmp; present_vblank_ptr vblank, tmp;
xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->vblank, window_list) { xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->vblank, window_list) {
screen_priv->abort_vblank(window->drawable.pScreen, vblank->crtc, vblank->event_id, vblank->target_msc); screen_priv->abort_vblank(window->drawable.pScreen, window, vblank->crtc, vblank->event_id, vblank->target_msc);
present_vblank_destroy(vblank); present_vblank_destroy(vblank);
} }
} }

View File

@ -77,7 +77,7 @@ present_vblank_create(WindowPtr window,
vblank->window = window; vblank->window = window;
vblank->pixmap = pixmap; vblank->pixmap = pixmap;
screen_priv->create_event_id(vblank); screen_priv->create_event_id(window_priv, vblank);
if (pixmap) { if (pixmap) {
vblank->kind = PresentCompleteKindPixmap; vblank->kind = PresentCompleteKindPixmap;