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