present_priv.h revision 35c4bbdf
135c4bbdfSmrg/*
235c4bbdfSmrg * Copyright © 2013 Keith Packard
335c4bbdfSmrg *
435c4bbdfSmrg * Permission to use, copy, modify, distribute, and sell this software and its
535c4bbdfSmrg * documentation for any purpose is hereby granted without fee, provided that
635c4bbdfSmrg * the above copyright notice appear in all copies and that both that copyright
735c4bbdfSmrg * notice and this permission notice appear in supporting documentation, and
835c4bbdfSmrg * that the name of the copyright holders not be used in advertising or
935c4bbdfSmrg * publicity pertaining to distribution of the software without specific,
1035c4bbdfSmrg * written prior permission.  The copyright holders make no representations
1135c4bbdfSmrg * about the suitability of this software for any purpose.  It is provided "as
1235c4bbdfSmrg * is" without express or implied warranty.
1335c4bbdfSmrg *
1435c4bbdfSmrg * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
1535c4bbdfSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
1635c4bbdfSmrg * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
1735c4bbdfSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
1835c4bbdfSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
1935c4bbdfSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
2035c4bbdfSmrg * OF THIS SOFTWARE.
2135c4bbdfSmrg */
2235c4bbdfSmrg
2335c4bbdfSmrg#ifndef _PRESENT_PRIV_H_
2435c4bbdfSmrg#define _PRESENT_PRIV_H_
2535c4bbdfSmrg
2635c4bbdfSmrg#include <X11/X.h>
2735c4bbdfSmrg#include "scrnintstr.h"
2835c4bbdfSmrg#include "misc.h"
2935c4bbdfSmrg#include "list.h"
3035c4bbdfSmrg#include "windowstr.h"
3135c4bbdfSmrg#include "dixstruct.h"
3235c4bbdfSmrg#include "present.h"
3335c4bbdfSmrg#include <syncsdk.h>
3435c4bbdfSmrg#include <syncsrv.h>
3535c4bbdfSmrg#include <xfixes.h>
3635c4bbdfSmrg#include <randrstr.h>
3735c4bbdfSmrg
3835c4bbdfSmrgextern int present_request;
3935c4bbdfSmrg
4035c4bbdfSmrgextern DevPrivateKeyRec present_screen_private_key;
4135c4bbdfSmrg
4235c4bbdfSmrgtypedef struct present_fence *present_fence_ptr;
4335c4bbdfSmrg
4435c4bbdfSmrgtypedef struct present_notify present_notify_rec, *present_notify_ptr;
4535c4bbdfSmrg
4635c4bbdfSmrgstruct present_notify {
4735c4bbdfSmrg    struct xorg_list    window_list;
4835c4bbdfSmrg    WindowPtr           window;
4935c4bbdfSmrg    CARD32              serial;
5035c4bbdfSmrg};
5135c4bbdfSmrg
5235c4bbdfSmrgstruct present_vblank {
5335c4bbdfSmrg    struct xorg_list    window_list;
5435c4bbdfSmrg    struct xorg_list    event_queue;
5535c4bbdfSmrg    ScreenPtr           screen;
5635c4bbdfSmrg    WindowPtr           window;
5735c4bbdfSmrg    PixmapPtr           pixmap;
5835c4bbdfSmrg    RegionPtr           valid;
5935c4bbdfSmrg    RegionPtr           update;
6035c4bbdfSmrg    RRCrtcPtr           crtc;
6135c4bbdfSmrg    uint32_t            serial;
6235c4bbdfSmrg    int16_t             x_off;
6335c4bbdfSmrg    int16_t             y_off;
6435c4bbdfSmrg    CARD16              kind;
6535c4bbdfSmrg    uint64_t            event_id;
6635c4bbdfSmrg    uint64_t            target_msc;
6735c4bbdfSmrg    uint64_t            msc_offset;
6835c4bbdfSmrg    present_fence_ptr   idle_fence;
6935c4bbdfSmrg    present_fence_ptr   wait_fence;
7035c4bbdfSmrg    present_notify_ptr  notifies;
7135c4bbdfSmrg    int                 num_notifies;
7235c4bbdfSmrg    Bool                queued;         /* on present_exec_queue */
7335c4bbdfSmrg    Bool                requeue;        /* on queue, but target_msc has changed */
7435c4bbdfSmrg    Bool                flip;           /* planning on using flip */
7535c4bbdfSmrg    Bool                flip_ready;     /* wants to flip, but waiting for previous flip or unflip */
7635c4bbdfSmrg    Bool                sync_flip;      /* do flip synchronous to vblank */
7735c4bbdfSmrg    Bool                abort_flip;     /* aborting this flip */
7835c4bbdfSmrg};
7935c4bbdfSmrg
8035c4bbdfSmrgtypedef struct present_screen_priv {
8135c4bbdfSmrg    CloseScreenProcPtr          CloseScreen;
8235c4bbdfSmrg    ConfigNotifyProcPtr         ConfigNotify;
8335c4bbdfSmrg    DestroyWindowProcPtr        DestroyWindow;
8435c4bbdfSmrg    ClipNotifyProcPtr           ClipNotify;
8535c4bbdfSmrg
8635c4bbdfSmrg    present_vblank_ptr          flip_pending;
8735c4bbdfSmrg    uint64_t                    unflip_event_id;
8835c4bbdfSmrg
8935c4bbdfSmrg    uint32_t                    fake_interval;
9035c4bbdfSmrg
9135c4bbdfSmrg    /* Currently active flipped pixmap and fence */
9235c4bbdfSmrg    RRCrtcPtr                   flip_crtc;
9335c4bbdfSmrg    WindowPtr                   flip_window;
9435c4bbdfSmrg    uint32_t                    flip_serial;
9535c4bbdfSmrg    PixmapPtr                   flip_pixmap;
9635c4bbdfSmrg    present_fence_ptr           flip_idle_fence;
9735c4bbdfSmrg    Bool                        flip_sync;
9835c4bbdfSmrg
9935c4bbdfSmrg    present_screen_info_ptr     info;
10035c4bbdfSmrg} present_screen_priv_rec, *present_screen_priv_ptr;
10135c4bbdfSmrg
10235c4bbdfSmrg#define wrap(priv,real,mem,func) {\
10335c4bbdfSmrg    priv->mem = real->mem; \
10435c4bbdfSmrg    real->mem = func; \
10535c4bbdfSmrg}
10635c4bbdfSmrg
10735c4bbdfSmrg#define unwrap(priv,real,mem) {\
10835c4bbdfSmrg    real->mem = priv->mem; \
10935c4bbdfSmrg}
11035c4bbdfSmrg
11135c4bbdfSmrgstatic inline present_screen_priv_ptr
11235c4bbdfSmrgpresent_screen_priv(ScreenPtr screen)
11335c4bbdfSmrg{
11435c4bbdfSmrg    return (present_screen_priv_ptr)dixLookupPrivate(&(screen)->devPrivates, &present_screen_private_key);
11535c4bbdfSmrg}
11635c4bbdfSmrg
11735c4bbdfSmrg/*
11835c4bbdfSmrg * Each window has a list of clients and event masks
11935c4bbdfSmrg */
12035c4bbdfSmrgtypedef struct present_event *present_event_ptr;
12135c4bbdfSmrg
12235c4bbdfSmrgtypedef struct present_event {
12335c4bbdfSmrg    present_event_ptr next;
12435c4bbdfSmrg    ClientPtr client;
12535c4bbdfSmrg    WindowPtr window;
12635c4bbdfSmrg    XID id;
12735c4bbdfSmrg    int mask;
12835c4bbdfSmrg} present_event_rec;
12935c4bbdfSmrg
13035c4bbdfSmrgtypedef struct present_window_priv {
13135c4bbdfSmrg    present_event_ptr      events;
13235c4bbdfSmrg    RRCrtcPtr              crtc;        /* Last reported CRTC from get_ust_msc */
13335c4bbdfSmrg    uint64_t               msc_offset;
13435c4bbdfSmrg    uint64_t               msc;         /* Last reported MSC from the current crtc */
13535c4bbdfSmrg    struct xorg_list       vblank;
13635c4bbdfSmrg    struct xorg_list       notifies;
13735c4bbdfSmrg} present_window_priv_rec, *present_window_priv_ptr;
13835c4bbdfSmrg
13935c4bbdfSmrg#define PresentCrtcNeverSet     ((RRCrtcPtr) 1)
14035c4bbdfSmrg
14135c4bbdfSmrgextern DevPrivateKeyRec present_window_private_key;
14235c4bbdfSmrg
14335c4bbdfSmrgstatic inline present_window_priv_ptr
14435c4bbdfSmrgpresent_window_priv(WindowPtr window)
14535c4bbdfSmrg{
14635c4bbdfSmrg    return (present_window_priv_ptr)dixGetPrivate(&(window)->devPrivates, &present_window_private_key);
14735c4bbdfSmrg}
14835c4bbdfSmrg
14935c4bbdfSmrgpresent_window_priv_ptr
15035c4bbdfSmrgpresent_get_window_priv(WindowPtr window, Bool create);
15135c4bbdfSmrg
15235c4bbdfSmrg/*
15335c4bbdfSmrg * present.c
15435c4bbdfSmrg */
15535c4bbdfSmrgint
15635c4bbdfSmrgpresent_pixmap(WindowPtr window,
15735c4bbdfSmrg               PixmapPtr pixmap,
15835c4bbdfSmrg               CARD32 serial,
15935c4bbdfSmrg               RegionPtr valid,
16035c4bbdfSmrg               RegionPtr update,
16135c4bbdfSmrg               int16_t x_off,
16235c4bbdfSmrg               int16_t y_off,
16335c4bbdfSmrg               RRCrtcPtr target_crtc,
16435c4bbdfSmrg               SyncFence *wait_fence,
16535c4bbdfSmrg               SyncFence *idle_fence,
16635c4bbdfSmrg               uint32_t options,
16735c4bbdfSmrg               uint64_t target_msc,
16835c4bbdfSmrg               uint64_t divisor,
16935c4bbdfSmrg               uint64_t remainder,
17035c4bbdfSmrg               present_notify_ptr notifies,
17135c4bbdfSmrg               int num_notifies);
17235c4bbdfSmrg
17335c4bbdfSmrgint
17435c4bbdfSmrgpresent_notify_msc(WindowPtr window,
17535c4bbdfSmrg                   CARD32 serial,
17635c4bbdfSmrg                   uint64_t target_msc,
17735c4bbdfSmrg                   uint64_t divisor,
17835c4bbdfSmrg                   uint64_t remainder);
17935c4bbdfSmrg
18035c4bbdfSmrgvoid
18135c4bbdfSmrgpresent_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64_t msc);
18235c4bbdfSmrg
18335c4bbdfSmrgvoid
18435c4bbdfSmrgpresent_vblank_destroy(present_vblank_ptr vblank);
18535c4bbdfSmrg
18635c4bbdfSmrgvoid
18735c4bbdfSmrgpresent_flip_destroy(ScreenPtr screen);
18835c4bbdfSmrg
18935c4bbdfSmrgvoid
19035c4bbdfSmrgpresent_check_flip_window(WindowPtr window);
19135c4bbdfSmrg
19235c4bbdfSmrgRRCrtcPtr
19335c4bbdfSmrgpresent_get_crtc(WindowPtr window);
19435c4bbdfSmrg
19535c4bbdfSmrguint32_t
19635c4bbdfSmrgpresent_query_capabilities(RRCrtcPtr crtc);
19735c4bbdfSmrg
19835c4bbdfSmrgBool
19935c4bbdfSmrgpresent_init(void);
20035c4bbdfSmrg
20135c4bbdfSmrg/*
20235c4bbdfSmrg * present_event.c
20335c4bbdfSmrg */
20435c4bbdfSmrg
20535c4bbdfSmrgvoid
20635c4bbdfSmrgpresent_free_events(WindowPtr window);
20735c4bbdfSmrg
20835c4bbdfSmrgvoid
20935c4bbdfSmrgpresent_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling);
21035c4bbdfSmrg
21135c4bbdfSmrgvoid
21235c4bbdfSmrgpresent_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc);
21335c4bbdfSmrg
21435c4bbdfSmrgvoid
21535c4bbdfSmrgpresent_send_idle_notify(WindowPtr window, CARD32 serial, PixmapPtr pixmap, present_fence_ptr idle_fence);
21635c4bbdfSmrg
21735c4bbdfSmrgint
21835c4bbdfSmrgpresent_select_input(ClientPtr client,
21935c4bbdfSmrg                     CARD32 eid,
22035c4bbdfSmrg                     WindowPtr window,
22135c4bbdfSmrg                     CARD32 event_mask);
22235c4bbdfSmrg
22335c4bbdfSmrgBool
22435c4bbdfSmrgpresent_event_init(void);
22535c4bbdfSmrg
22635c4bbdfSmrg/*
22735c4bbdfSmrg * present_fake.c
22835c4bbdfSmrg */
22935c4bbdfSmrgint
23035c4bbdfSmrgpresent_fake_get_ust_msc(ScreenPtr screen, uint64_t *ust, uint64_t *msc);
23135c4bbdfSmrg
23235c4bbdfSmrgint
23335c4bbdfSmrgpresent_fake_queue_vblank(ScreenPtr screen, uint64_t event_id, uint64_t msc);
23435c4bbdfSmrg
23535c4bbdfSmrgvoid
23635c4bbdfSmrgpresent_fake_abort_vblank(ScreenPtr screen, uint64_t event_id, uint64_t msc);
23735c4bbdfSmrg
23835c4bbdfSmrgvoid
23935c4bbdfSmrgpresent_fake_screen_init(ScreenPtr screen);
24035c4bbdfSmrg
24135c4bbdfSmrgvoid
24235c4bbdfSmrgpresent_fake_queue_init(void);
24335c4bbdfSmrg
24435c4bbdfSmrg/*
24535c4bbdfSmrg * present_fence.c
24635c4bbdfSmrg */
24735c4bbdfSmrgstruct present_fence *
24835c4bbdfSmrgpresent_fence_create(SyncFence *sync_fence);
24935c4bbdfSmrg
25035c4bbdfSmrgvoid
25135c4bbdfSmrgpresent_fence_destroy(struct present_fence *present_fence);
25235c4bbdfSmrg
25335c4bbdfSmrgvoid
25435c4bbdfSmrgpresent_fence_set_triggered(struct present_fence *present_fence);
25535c4bbdfSmrg
25635c4bbdfSmrgBool
25735c4bbdfSmrgpresent_fence_check_triggered(struct present_fence *present_fence);
25835c4bbdfSmrg
25935c4bbdfSmrgvoid
26035c4bbdfSmrgpresent_fence_set_callback(struct present_fence *present_fence,
26135c4bbdfSmrg                           void (*callback)(void *param),
26235c4bbdfSmrg                           void *param);
26335c4bbdfSmrg
26435c4bbdfSmrgXID
26535c4bbdfSmrgpresent_fence_id(struct present_fence *present_fence);
26635c4bbdfSmrg
26735c4bbdfSmrg/*
26835c4bbdfSmrg * present_notify.c
26935c4bbdfSmrg */
27035c4bbdfSmrgvoid
27135c4bbdfSmrgpresent_clear_window_notifies(WindowPtr window);
27235c4bbdfSmrg
27335c4bbdfSmrgvoid
27435c4bbdfSmrgpresent_free_window_notify(present_notify_ptr notify);
27535c4bbdfSmrg
27635c4bbdfSmrgint
27735c4bbdfSmrgpresent_add_window_notify(present_notify_ptr notify);
27835c4bbdfSmrg
27935c4bbdfSmrgint
28035c4bbdfSmrgpresent_create_notifies(ClientPtr client, int num_notifies, xPresentNotify *x_notifies, present_notify_ptr *p_notifies);
28135c4bbdfSmrg
28235c4bbdfSmrgvoid
28335c4bbdfSmrgpresent_destroy_notifies(present_notify_ptr notifies, int num_notifies);
28435c4bbdfSmrg
28535c4bbdfSmrg/*
28635c4bbdfSmrg * present_redirect.c
28735c4bbdfSmrg */
28835c4bbdfSmrg
28935c4bbdfSmrgWindowPtr
29035c4bbdfSmrgpresent_redirect(ClientPtr client, WindowPtr target);
29135c4bbdfSmrg
29235c4bbdfSmrg/*
29335c4bbdfSmrg * present_request.c
29435c4bbdfSmrg */
29535c4bbdfSmrgint
29635c4bbdfSmrgproc_present_dispatch(ClientPtr client);
29735c4bbdfSmrg
29835c4bbdfSmrgint
29935c4bbdfSmrgsproc_present_dispatch(ClientPtr client);
30035c4bbdfSmrg
30135c4bbdfSmrg/*
30235c4bbdfSmrg * present_screen.c
30335c4bbdfSmrg */
30435c4bbdfSmrg
30535c4bbdfSmrg#endif /*  _PRESENT_PRIV_H_ */
306