[Spice-devel] [xf86-video-qxl (take 2)] Make the Deferred FPS mode available in all cases, not just XSPICE.

Hans de Goede hdegoede at redhat.com
Wed Mar 27 12:59:06 PDT 2013


Hi,

Looks good, ack.

Regards,

Hans


On 03/27/2013 07:39 PM, Jeremy White wrote:
> Signed-off-by: Jeremy White <jwhite at codeweavers.com>
> ---
>
> This time without the spice-server build requirements of the prior version.
>
>
>   src/Makefile.am  |    1 +
>   src/dfps.c       |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++---
>   src/dfps.h       |   17 +---------------
>   src/qxl.h        |   11 +++++++----
>   src/qxl_driver.c |   23 +++++++---------------
>   src/qxl_uxa.c    |    4 ----
>   6 files changed, 70 insertions(+), 43 deletions(-)
>
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 8632297..5a48a4d 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -56,6 +56,7 @@ qxl_drv_la_SOURCES =				\
>   	qxl_uxa.c			\
>   	qxl_ums_mode.c                  \
>   	qxl_io.c                        \
> +	dfps.c				\
>   	compat-api.h
>   endif
>
> diff --git a/src/dfps.c b/src/dfps.c
> index 6ac29f9..5cc1890 100644
> --- a/src/dfps.c
> +++ b/src/dfps.c
> @@ -44,14 +44,65 @@
>   #include "qxl.h"
>   #include "dfps.h"
>
> -struct dfps_info_t
> +typedef struct _dfps_info_t
>   {
>       RegionRec   updated_region;
>
>       PixmapPtr   copy_src;
>       Pixel       solid_pixel;
>       GCPtr       pgc;
> -};
> +} dfps_info_t;
> +
> +static inline dfps_info_t *dfps_get_info (PixmapPtr pixmap)
> +{
> +#if HAS_DEVPRIVATEKEYREC
> +    return dixGetPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
> +#else
> +    return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
> +#endif
> +}
> +
> +static inline void dfps_set_info (PixmapPtr pixmap, dfps_info_t *info)
> +{
> +    dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, info);
> +}
> +typedef struct FrameTimer {
> +    OsTimerPtr xorg_timer;
> +    FrameTimerFunc func;
> +    void *opaque; // also stored in xorg_timer, but needed for timer_start
> +} Timer;
> +
> +static CARD32 xorg_timer_callback(
> +    OsTimerPtr xorg_timer,
> +    CARD32 time,
> +    pointer arg)
> +{
> +    FrameTimer *timer = (FrameTimer*)arg;
> +
> +    timer->func(timer->opaque);
> +    return 0; // if non zero xorg does a TimerSet, we don't want that.
> +}
> +
> +static FrameTimer* timer_add(FrameTimerFunc func, void *opaque)
> +{
> +    FrameTimer *timer = calloc(sizeof(FrameTimer), 1);
> +
> +    timer->xorg_timer = TimerSet(NULL, 0, 1e9 /* TODO: infinity? */, xorg_timer_callback, timer);
> +    timer->func = func;
> +    timer->opaque = opaque;
> +    return timer;
> +}
> +
> +static void timer_start(FrameTimer *timer, uint32_t ms)
> +{
> +    TimerSet(timer->xorg_timer, 0 /* flags */, ms, xorg_timer_callback, timer);
> +}
> +
> +void dfps_start_ticker(qxl_screen_t *qxl)
> +{
> +    qxl->frames_timer = timer_add(dfps_ticker, qxl);
> +    timer_start(qxl->frames_timer, 1000 / qxl->deferred_fps);
> +}
>
>   void dfps_ticker(void *opaque)
>   {
> @@ -68,7 +119,7 @@ void dfps_ticker(void *opaque)
>           RegionUninit(&info->updated_region);
>           RegionInit(&info->updated_region, NULL, 0);
>       }
> -    qxl->core->timer_start(qxl->frames_timer, 1000 / qxl->deferred_fps);
> +    timer_start(qxl->frames_timer, 1000 / qxl->deferred_fps);
>   }
>
>
> diff --git a/src/dfps.h b/src/dfps.h
> index ea38a46..b5ce88c 100644
> --- a/src/dfps.h
> +++ b/src/dfps.h
> @@ -22,21 +22,6 @@
>    *
>    */
>
> -typedef struct dfps_info_t dfps_info_t;
> -
> +void dfps_start_ticker(qxl_screen_t *qxl);
>   void dfps_ticker(void *opaque);
>   void dfps_set_uxa_functions(qxl_screen_t *qxl, ScreenPtr screen);
> -
> -static inline dfps_info_t *dfps_get_info (PixmapPtr pixmap)
> -{
> -#if HAS_DEVPRIVATEKEYREC
> -    return dixGetPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
> -#else
> -    return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
> -#endif
> -}
> -
> -static inline void dfps_set_info (PixmapPtr pixmap, dfps_info_t *info)
> -{
> -    dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, info);
> -}
> diff --git a/src/qxl.h b/src/qxl.h
> index c26ea8f..2d170a9 100644
> --- a/src/qxl.h
> +++ b/src/qxl.h
> @@ -105,6 +105,7 @@ enum {
>       OPTION_ENABLE_FALLBACK_CACHE,
>       OPTION_ENABLE_SURFACES,
>       OPTION_NUM_HEADS,
> +    OPTION_SPICE_DEFERRED_FPS,
>   #ifdef XSPICE
>       OPTION_SPICE_PORT,
>       OPTION_SPICE_TLS_PORT,
> @@ -128,7 +129,6 @@ enum {
>       OPTION_SPICE_TLS_CIPHERS,
>       OPTION_SPICE_CACERT_FILE,
>       OPTION_SPICE_DH_FILE,
> -    OPTION_SPICE_DEFERRED_FPS,
>       OPTION_SPICE_EXIT_ON_DISCONNECT,
>       OPTION_SPICE_PLAYBACK_FIFO_DIR,
>   #endif
> @@ -177,6 +177,9 @@ void qxl_ums_setup_funcs(qxl_screen_t *qxl);
>   struct qxl_bo *qxl_ums_surf_mem_alloc(qxl_screen_t *qxl, uint32_t size);
>   struct qxl_bo *qxl_ums_lookup_phy_addr(qxl_screen_t *qxl, uint64_t phy_addr);
>
> +typedef struct FrameTimer FrameTimer;
> +typedef void (*FrameTimerFunc)(void *opaque);
> +
>   struct _qxl_screen_t
>   {
>       /* These are the names QXL uses */
> @@ -275,12 +278,13 @@ struct _qxl_screen_t
>       int				enable_fallback_cache;
>       int				enable_surfaces;
>
> +    FrameTimer *        frames_timer;
> +
>   #ifdef XSPICE
>       /* XSpice specific */
>       struct QXLRom		shadow_rom;    /* Parameter RAM */
>       SpiceServer *       spice_server;
>       SpiceCoreInterface *core;
> -    SpiceTimer *        frames_timer;
>
>       QXLWorker *         worker;
>       int                 worker_running;
> @@ -307,11 +311,10 @@ struct _qxl_screen_t
>           uint8_t        *data, *flipped;
>       } guest_primary;
>
> -    uint32_t           deferred_fps;
> -
>       char playback_fifo_dir[PATH_MAX];
>   #endif /* XSPICE */
>
> +    uint32_t deferred_fps;
>       struct xorg_list ums_bos;
>       struct qxl_bo_funcs *bo_funcs;
>   };
> diff --git a/src/qxl_driver.c b/src/qxl_driver.c
> index f1f6592..ae898b6 100644
> --- a/src/qxl_driver.c
> +++ b/src/qxl_driver.c
> @@ -54,10 +54,11 @@
>   #include "spiceqxl_inputs.h"
>   #include "spiceqxl_io_port.h"
>   #include "spiceqxl_spice_server.h"
> -#include "dfps.h"
>   #include "spiceqxl_audio.h"
>   #endif /* XSPICE */
>
> +#include "dfps.h"
> +
>   extern void compat_init_scrn (ScrnInfoPtr);
>
>   #define BREAKPOINT()   do { __asm__ __volatile__ ("int $03"); } while (0)
> @@ -78,6 +79,8 @@ const OptionInfoRec DefaultOptions[] =
>         "EnableSurfaces",           OPTV_BOOLEAN, { 1 }, FALSE },
>       { OPTION_NUM_HEADS,
>         "NumHeads",                 OPTV_INTEGER, { 4 }, FALSE },
> +    { OPTION_SPICE_DEFERRED_FPS,
> +      "SpiceDeferredFPS",         OPTV_INTEGER, { 0 }, FALSE},
>   #ifdef XSPICE
>       { OPTION_SPICE_PORT,
>         "SpicePort",                OPTV_INTEGER,   {5900}, FALSE },
> @@ -124,8 +127,6 @@ const OptionInfoRec DefaultOptions[] =
>         "SpiceCacertFile",          OPTV_STRING,    {0}, FALSE},
>       { OPTION_SPICE_DH_FILE,
>         "SpiceDhFile",              OPTV_STRING,    {0}, FALSE},
> -    { OPTION_SPICE_DEFERRED_FPS,
> -      "SpiceDeferredFPS",         OPTV_INTEGER,   {0}, FALSE},
>       { OPTION_SPICE_EXIT_ON_DISCONNECT,
>         "SpiceExitOnDisconnect",    OPTV_BOOLEAN,   {0}, FALSE},
>       { OPTION_SPICE_PLAYBACK_FIFO_DIR,
> @@ -543,9 +544,7 @@ qxl_resize_primary_to_virtual (qxl_screen_t *qxl)
>       {
>   	PixmapPtr root = pScreen->GetScreenPixmap (pScreen);
>
> -#ifdef XSPICE
>           if (qxl->deferred_fps <= 0)
> -#endif
>           {
>               qxl_surface_t *surf;
>
> @@ -606,9 +605,7 @@ qxl_create_screen_resources (ScreenPtr pScreen)
>
>       pPixmap = pScreen->GetScreenPixmap (pScreen);
>
> -#ifdef XSPICE
>       if (qxl->deferred_fps <= 0)
> -#endif
>       {
>           set_screen_pixmap_header (pScreen);
>
> @@ -640,11 +637,6 @@ spiceqxl_screen_init (ScrnInfoPtr pScrn, qxl_screen_t *qxl)
>   	qxl_add_spice_playback_interface (qxl);
>   	qxl->worker->start (qxl->worker);
>   	qxl->worker_running = TRUE;
> -        if (qxl->deferred_fps)
> -        {
> -            qxl->frames_timer = qxl->core->timer_add(dfps_ticker, qxl);
> -            qxl->core->timer_start(qxl->frames_timer, 1000 / qxl->deferred_fps);
> -        }
>       }
>       qxl->spice_server = qxl->spice_server;
>   }
> @@ -802,6 +794,9 @@ qxl_screen_init (SCREEN_INIT_ARGS_DECL)
>       /* bounds" */
>       xf86RandR12SetTransformSupport (pScreen, TRUE);
>
> +    if (qxl->deferred_fps)
> +        dfps_start_ticker(qxl);
> +
>       return TRUE;
>
>   out:
> @@ -854,9 +849,7 @@ qxl_leave_vt (VT_FUNC_ARGS_DECL)
>
>       pScrn->EnableDisableFBAccess (XF86_SCRN_ARG (pScrn), FALSE);
>
> -#ifdef XSPICE
>       if (qxl->deferred_fps <= 0)
> -#endif
>           qxl->vt_surfaces = qxl_surface_cache_evacuate_all (qxl->surface_cache);
>
>       ioport_write (qxl, QXL_IO_RESET, 0);
> @@ -977,13 +970,11 @@ qxl_pre_init_common(ScrnInfoPtr pScrn)
>       qxl->num_heads =
>           get_int_option (qxl->options, OPTION_NUM_HEADS, "QXL_NUM_HEADS");
>
> -#ifdef XSPICE
>       qxl->deferred_fps = get_int_option(qxl->options, OPTION_SPICE_DEFERRED_FPS, "XSPICE_DEFERRED_FPS");
>       if (qxl->deferred_fps > 0)
>           xf86DrvMsg(scrnIndex, X_INFO, "Deferred FPS: %d\n", qxl->deferred_fps);
>       else
>           xf86DrvMsg(scrnIndex, X_INFO, "Deferred Frames: Disabled\n");
> -#endif
>
>       xf86DrvMsg (scrnIndex, X_INFO, "Offscreen Surfaces: %s\n",
>                   qxl->enable_surfaces ? "Enabled" : "Disabled");
> diff --git a/src/qxl_uxa.c b/src/qxl_uxa.c
> index 1810181..9ac78ee 100644
> --- a/src/qxl_uxa.c
> +++ b/src/qxl_uxa.c
> @@ -34,9 +34,7 @@
>   #endif
>
>   #include "qxl.h"
> -#ifdef XSPICE
>   #include "dfps.h"
> -#endif
>   #include <spice/protocol.h>
>
>   #if HAS_DEVPRIVATEKEYREC
> @@ -490,11 +488,9 @@ qxl_uxa_init (qxl_screen_t *qxl, ScreenPtr screen)
>       qxl->uxa->uxa_major = 1;
>       qxl->uxa->uxa_minor = 0;
>
> -#ifdef XSPICE
>       if (qxl->deferred_fps)
>           dfps_set_uxa_functions(qxl, screen);
>       else
> -#endif
>           set_uxa_functions(qxl, screen);
>
>       if (!uxa_driver_init (screen, qxl->uxa))
>


More information about the Spice-devel mailing list