Commit 3cbd14b9 authored by Jeremy White's avatar Jeremy White

Make the Deferred FPS mode available in all cases, not just XSPICE.

parent f6aebb14
......@@ -56,6 +56,7 @@ qxl_drv_la_SOURCES = \
qxl_uxa.c \
qxl_ums_mode.c \
qxl_io.c \
dfps.c \
compat-api.h
endif
......
......@@ -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);
}
......
......@@ -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);
}
......@@ -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;
};
......
......@@ -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");
......
......@@ -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))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment