diff --git a/present/present.c b/present/present.c index 8ba864772..37cbf0720 100644 --- a/present/present.c +++ b/present/present.c @@ -38,6 +38,34 @@ msc_is_equal_or_after(uint64_t test, uint64_t reference) return (int64_t)(test - reference) >= 0; } +uint32_t +present_query_capabilities(RRCrtcPtr crtc) +{ + present_screen_priv_ptr screen_priv; + + if (!crtc) + return 0; + + screen_priv = present_screen_priv(crtc->pScreen); + + if (!screen_priv) + return 0; + + return screen_priv->query_capabilities(screen_priv); +} + +RRCrtcPtr +present_get_crtc(WindowPtr window) +{ + ScreenPtr screen = window->drawable.pScreen; + present_screen_priv_ptr screen_priv = present_screen_priv(screen); + + if (!screen_priv) + return NULL; + + return screen_priv->get_crtc(screen_priv, window); +} + /* * Copies the update region from a pixmap to the target drawable */ diff --git a/present/present_priv.h b/present/present_priv.h index 261f0e4fa..ba607e279 100644 --- a/present/present_priv.h +++ b/present/present_priv.h @@ -85,9 +85,15 @@ struct present_vblank { Bool has_suboptimal; /* whether client can support SuboptimalCopy mode */ }; +typedef struct present_screen_priv present_screen_priv_rec, *present_screen_priv_ptr; + /* * Mode hooks */ +typedef uint32_t (*present_priv_query_capabilities_ptr)(present_screen_priv_ptr screen_priv); +typedef RRCrtcPtr (*present_priv_get_crtc_ptr)(present_screen_priv_ptr screen_priv, + WindowPtr window); + typedef Bool (*present_priv_check_flip_ptr)(RRCrtcPtr crtc, WindowPtr window, PixmapPtr pixmap, @@ -125,7 +131,13 @@ typedef int (*present_priv_queue_vblank_ptr)(ScreenPtr screen, typedef void (*present_priv_flush_ptr)(WindowPtr window); typedef void (*present_priv_re_execute_ptr)(present_vblank_ptr vblank); -typedef struct present_screen_priv { +typedef void (*present_priv_abort_vblank_ptr)(ScreenPtr screen, + RRCrtcPtr crtc, + uint64_t event_id, + uint64_t msc); +typedef void (*present_priv_flip_destroy_ptr)(ScreenPtr screen); + +struct present_screen_priv { CloseScreenProcPtr CloseScreen; ConfigNotifyProcPtr ConfigNotify; DestroyWindowProcPtr DestroyWindow; @@ -147,6 +159,9 @@ typedef struct present_screen_priv { present_screen_info_ptr info; /* Mode hooks */ + present_priv_query_capabilities_ptr query_capabilities; + present_priv_get_crtc_ptr get_crtc; + present_priv_check_flip_ptr check_flip; present_priv_check_flip_window_ptr check_flip_window; present_priv_can_window_flip_ptr can_window_flip; @@ -158,7 +173,9 @@ typedef struct present_screen_priv { present_priv_flush_ptr flush; present_priv_re_execute_ptr re_execute; -} present_screen_priv_rec, *present_screen_priv_ptr; + present_priv_abort_vblank_ptr abort_vblank; + present_priv_flip_destroy_ptr flip_destroy; +}; #define wrap(priv,real,mem,func) {\ priv->mem = real->mem; \ @@ -224,6 +241,12 @@ msc_is_after(uint64_t test, uint64_t reference) /* * present.c */ +uint32_t +present_query_capabilities(RRCrtcPtr crtc); + +RRCrtcPtr +present_get_crtc(WindowPtr window); + void present_copy_region(DrawablePtr drawable, PixmapPtr pixmap, @@ -398,12 +421,6 @@ present_restore_screen_pixmap(ScreenPtr screen); void present_set_abort_flip(ScreenPtr screen); -RRCrtcPtr -present_get_crtc(WindowPtr window); - -uint32_t -present_query_capabilities(RRCrtcPtr crtc); - Bool present_init(void); diff --git a/present/present_scmd.c b/present/present_scmd.c index 71c8fb9cc..18ce619a6 100644 --- a/present/present_scmd.c +++ b/present/present_scmd.c @@ -158,34 +158,18 @@ present_flip(RRCrtcPtr crtc, return (*screen_priv->info->flip) (crtc, event_id, target_msc, pixmap, sync_flip); } -RRCrtcPtr -present_get_crtc(WindowPtr window) +static RRCrtcPtr +present_scmd_get_crtc(present_screen_priv_ptr screen_priv, WindowPtr window) { - ScreenPtr screen = window->drawable.pScreen; - present_screen_priv_ptr screen_priv = present_screen_priv(screen); - - if (!screen_priv) - return NULL; - if (!screen_priv->info) return NULL; return (*screen_priv->info->get_crtc)(window); } -uint32_t -present_query_capabilities(RRCrtcPtr crtc) +static uint32_t +present_scmd_query_capabilities(present_screen_priv_ptr screen_priv) { - present_screen_priv_ptr screen_priv; - - if (!crtc) - return 0; - - screen_priv = present_screen_priv(crtc->pScreen); - - if (!screen_priv) - return 0; - if (!screen_priv->info) return 0; @@ -779,8 +763,8 @@ present_scmd_pixmap(WindowPtr window, return Success; } -void -present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64_t msc) +static void +present_scmd_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64_t msc) { present_vblank_ptr vblank; @@ -810,8 +794,8 @@ present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64 } } -void -present_flip_destroy(ScreenPtr screen) +static void +present_scmd_flip_destroy(ScreenPtr screen) { present_screen_priv_ptr screen_priv = present_screen_priv(screen); @@ -826,6 +810,9 @@ present_flip_destroy(ScreenPtr screen) void present_scmd_init_mode_hooks(present_screen_priv_ptr screen_priv) { + screen_priv->query_capabilities = &present_scmd_query_capabilities; + screen_priv->get_crtc = &present_scmd_get_crtc; + screen_priv->check_flip = &present_check_flip; screen_priv->check_flip_window = &present_check_flip_window; screen_priv->can_window_flip = &present_scmd_can_window_flip; @@ -836,6 +823,9 @@ present_scmd_init_mode_hooks(present_screen_priv_ptr screen_priv) screen_priv->queue_vblank = &present_queue_vblank; screen_priv->flush = &present_flush; screen_priv->re_execute = &present_re_execute; + + screen_priv->abort_vblank = &present_scmd_abort_vblank; + screen_priv->flip_destroy = &present_scmd_flip_destroy; } Bool diff --git a/present/present_screen.c b/present/present_screen.c index 454cc533c..98f701ab8 100644 --- a/present/present_screen.c +++ b/present/present_screen.c @@ -58,7 +58,7 @@ present_close_screen(ScreenPtr screen) { present_screen_priv_ptr screen_priv = present_screen_priv(screen); - present_flip_destroy(screen); + screen_priv->flip_destroy(screen); unwrap(screen_priv, screen, CloseScreen); (*screen->CloseScreen) (screen); @@ -72,11 +72,13 @@ present_close_screen(ScreenPtr screen) static void present_free_window_vblank(WindowPtr window) { + ScreenPtr screen = window->drawable.pScreen; + present_screen_priv_ptr screen_priv = present_screen_priv(screen); present_window_priv_ptr window_priv = present_window_priv(window); present_vblank_ptr vblank, tmp; xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->vblank, window_list) { - present_abort_vblank(window->drawable.pScreen, vblank->crtc, vblank->event_id, vblank->target_msc); + screen_priv->abort_vblank(window->drawable.pScreen, vblank->crtc, vblank->event_id, vblank->target_msc); present_vblank_destroy(vblank); } }