spice: server: add memslots support.

Signed-off-by: Izik Eidus <ieidus@redhat.com>
This commit is contained in:
Izik Eidus 2009-11-21 22:42:38 +02:00 committed by Marc-André Lureau
parent ee15aef4bc
commit 8d3823c46a
9 changed files with 84 additions and 58 deletions

View File

@ -1569,18 +1569,10 @@ cairo_t *canvas_get_cairo(CairoCanvas *canvas)
}
#ifdef CAIRO_CANVAS_ACCESS_TEST
void canvas_set_access_params(CairoCanvas *canvas, ADDRESS delta, unsigned long base,
unsigned long max)
void canvas_set_access_params(CairoCanvas *canvas, unsigned long base, unsigned long max)
{
__canvas_set_access_params(&canvas->base, delta, base, max);
__canvas_set_access_params(&canvas->base, base, max);
}
#else
void canvas_set_access_params(CairoCanvas *canvas, ADDRESS delta)
{
__canvas_set_access_params(&canvas->base, delta);
}
#endif
void canvas_destroy(CairoCanvas *canvas)
@ -1613,6 +1605,10 @@ CairoCanvas *canvas_create(cairo_t *cairo, int bits
#endif
#ifdef USE_GLZ
, void *glz_decoder_opaque, glz_decode_fn_t glz_decode
#endif
#ifndef CAIRO_CANVAS_NO_CHUNKS
, void *get_virt_opaque, get_virt_fn_t get_virt,
void *validate_virt_opaque, validate_virt_fn_t validate_virt
#endif
)
{
@ -1644,6 +1640,13 @@ CairoCanvas *canvas_create(cairo_t *cairo, int bits
,
glz_decoder_opaque,
glz_decode
#endif
#ifndef CAIRO_CANVAS_NO_CHUNKS
,
get_virt_opaque,
get_virt,
validate_virt_opaque,
validate_virt
#endif
);
canvas->cairo = cairo;

View File

@ -55,10 +55,7 @@ void canvas_group_start(CairoCanvas *canvas, int n_clip_rects, Rect *clip_rects)
void canvas_group_end(CairoCanvas *canvas);
void canvas_set_addr_delta(CairoCanvas *canvas, ADDRESS delta);
#ifdef CAIRO_CANVAS_ACCESS_TEST
void canvas_set_access_params(CairoCanvas *canvas, ADDRESS delta, unsigned long base,
unsigned long max);
#else
void canvas_set_access_params(CairoCanvas *canvas, ADDRESS delta);
void canvas_set_access_params(CairoCanvas *canvas, unsigned long base, unsigned long max);
#endif
cairo_t *canvas_get_cairo(CairoCanvas *canvas);
@ -77,6 +74,10 @@ CairoCanvas *canvas_create(cairo_t *cairo, int bits
#endif
#ifdef USE_GLZ
, void *glz_decoder_opaque, glz_decode_fn_t glz_decode
#endif
#ifndef CAIRO_CANVAS_NO_CHUNKS
, void *get_virt_opaque, get_virt_fn_t get_virt,
void *validate_virt_opaque, validate_virt_fn_t validate_virt
#endif
);
void canvas_destroy(CairoCanvas *canvas);

View File

@ -151,7 +151,10 @@ typedef struct QuicData {
jmp_buf jmp_env;
#ifndef CAIRO_CANVAS_NO_CHUNKS
ADDRESS next;
ADDRESS address_delta;
get_virt_fn_t get_virt;
void *get_virt_opaque;
validate_virt_fn_t validate_virt;
void *validate_virt_opaque;
#endif
char message_buf[512];
} QuicData;
@ -160,7 +163,6 @@ typedef struct CanvasBase {
uint32_t color_shift;
uint32_t color_mask;
QuicData quic_data;
ADDRESS address_delta;
#ifdef CAIRO_CANVAS_ACCESS_TEST
unsigned long base;
unsigned long max;
@ -256,7 +258,6 @@ static cairo_surface_t *canvas_get_quic(CanvasBase *canvas, QUICImage *image, in
tmp = (DataChunk **)image->quic.data;
chunk = *tmp;
quic_data->next = chunk->next;
quic_data->address_delta = canvas->address_delta;
if (quic_decode_begin(quic_data->quic, (uint32_t *)chunk->data, chunk->size >> 2,
&type, &width, &height) == QUIC_ERROR) {
CANVAS_ERROR("quic decode begin failed");
@ -1486,14 +1487,20 @@ static int quic_usr_more_space(QuicUsrContext *usr, uint32_t **io_ptr, int rows_
{
QuicData *quic_data = (QuicData *)usr;
DataChunk *chunk;
uint32_t size;
if (!quic_data->next) {
return 0;
}
chunk = (DataChunk *)GET_ADDRESS(quic_data->next + quic_data->address_delta);
chunk = (DataChunk *)quic_data->get_virt(quic_data->get_virt_opaque, quic_data->next,
sizeof(DataChunk));
size = chunk->size;
quic_data->validate_virt(quic_data->validate_virt_opaque, (unsigned long)chunk->data,
quic_data->next, size);
quic_data->next = chunk->next;
*io_ptr = (uint32_t *)chunk->data;
return chunk->size >> 2;
return size >> 2;
}
#endif
@ -1504,20 +1511,11 @@ static int quic_usr_more_lines(QuicUsrContext *usr, uint8_t **lines)
}
#ifdef CAIRO_CANVAS_ACCESS_TEST
static void __canvas_set_access_params(CanvasBase *canvas, ADDRESS delta, unsigned long base,
unsigned long max)
static void __canvas_set_access_params(CanvasBase *canvas, unsigned long base, unsigned long max)
{
canvas->address_delta = delta;
canvas->base = base;
canvas->max = max;
}
#else
static void __canvas_set_access_params(CanvasBase *canvas, ADDRESS delta)
{
canvas->address_delta = delta;
}
#endif
static void canvas_base_destroy(CanvasBase *canvas)
@ -1550,6 +1548,10 @@ static int canvas_base_init(CanvasBase *canvas, int depth
#endif
#ifdef USE_GLZ
, void *glz_decoder_opaque, glz_decode_fn_t glz_decode
#endif
#ifndef CAIRO_CANVAS_NO_CHUNKS
, void *get_virt_opaque, get_virt_fn_t get_virt,
void *validate_virt_opaque, validate_virt_fn_t validate_virt
#endif
)
{
@ -1560,6 +1562,12 @@ static int canvas_base_init(CanvasBase *canvas, int depth
canvas->quic_data.usr.free = quic_usr_free;
canvas->quic_data.usr.more_space = quic_usr_more_space;
canvas->quic_data.usr.more_lines = quic_usr_more_lines;
#ifndef CAIRO_CANVAS_NO_CHUNKS
canvas->quic_data.get_virt_opaque = get_virt_opaque;
canvas->quic_data.get_virt = get_virt;
canvas->quic_data.validate_virt_opaque = validate_virt_opaque;
canvas->quic_data.validate_virt = validate_virt;
#endif
if (!(canvas->quic_data.quic = quic_create(&canvas->quic_data.usr))) {
return 0;
}

View File

@ -35,6 +35,11 @@ typedef void (*palette_cache_release_fn_t)(Palette *palette);
typedef void (*glz_decode_fn_t)(void *glz_decoder_opaque, uint8_t *data,
Palette *plt, void *usr_data);
#ifndef CAIRO_CANVAS_NO_CHUNKS
typedef void *(*get_virt_fn_t)(void *get_virt_opaque, unsigned long addr, uint32_t add_size);
typedef void (*validate_virt_fn_t)(void *validate_virt_opaque, unsigned long virt,
unsigned long from_addr, uint32_t add_size);
#endif
#endif

View File

@ -1668,18 +1668,10 @@ void gdi_canvas_clear(GdiCanvas *canvas)
}
#ifdef CAIRO_CANVAS_ACCESS_TEST
void gdi_canvas_set_access_params(GdiCanvas *canvas, ADDRESS delta, unsigned long base,
unsigned long max)
void gdi_canvas_set_access_params(GdiCanvas *canvas, unsigned long base, unsigned long max)
{
__canvas_set_access_params(&canvas->base, delta, base, max);
__canvas_set_access_params(&canvas->base, base, max);
}
#else
void gdi_canvas_set_access_params(GdiCanvas *canvas, ADDRESS delta)
{
__gdi_canvas_set_access_params(&canvas->base, delta);
}
#endif
void gdi_canvas_destroy(GdiCanvas *canvas)

View File

@ -54,10 +54,7 @@ void gdi_canvas_put_image(GdiCanvas *canvas, HDC dc, const Rect *dest, const uin
void gdi_canvas_clear(GdiCanvas *canvas);
#ifdef CAIRO_CANVAS_ACCESS_TEST
void gdi_canvas_set_access_params(GdiCanvas *canvas, ADDRESS delta, unsigned long base,
unsigned long max);
#else
void gdi_canvas_set_access_params(GdiCanvas *canvas, ADDRESS delta);
void gdi_canvas_set_access_params(GdiCanvas *canvas, unsigned long base, unsigned long max);
#endif

View File

@ -770,16 +770,9 @@ void gl_canvas_clear_top_mask(GLCanvas *canvas)
}
#ifdef CAIRO_CANVAS_ACCESS_TEST
void gl_canvas_set_access_params(GLCanvas *canvas, ADDRESS delta, unsigned long base,
unsigned long max)
void gl_canvas_set_access_params(GLCanvas *canvas, unsigned long base, unsigned long max)
{
__canvas_set_access_params(&canvas->base, delta, base, max);
}
#else
void gl_canvas_set_access_params(GLCanvas *canvas, ADDRESS delta)
{
__canvas_set_access_params(&canvas->base, delta);
__canvas_set_access_params(&canvas->base, base, max);
}
#endif
@ -810,6 +803,10 @@ GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth
#endif
#ifdef USE_GLZ
, void *glz_decoder_opaque, glz_decode_fn_t glz_decode
#endif
#ifndef CAIRO_CANVAS_NO_CHUNKS
, void *get_virt_opaque, get_virt_fn_t get_virt,
void *validate_virt_opaque, validate_virt_fn_t validate_virt
#endif
)
{
@ -847,6 +844,13 @@ GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth
,
glz_decoder_opaque,
glz_decode
#endif
#ifndef CAIRO_CANVAS_NO_CHUNKS
,
get_virt_opaque,
get_virt,
validate_virt_opaque,
validate_virt
#endif
);
if (!init_ok) {
@ -882,5 +886,5 @@ void gl_canvas_init() //unsafe global function
return;
}
need_init = 0;
rop3_init();
rop3_init();
}

View File

@ -48,10 +48,7 @@ void gl_canvas_set_top_mask(GLCanvas *canvas, int num_rect, const Rect *rects);
void gl_canvas_clear_top_mask(GLCanvas *canvas);
#ifdef CAIRO_CANVAS_ACCESS_TEST
void gl_canvas_set_access_params(GLCanvas *canvas, ADDRESS delta, unsigned long base,
unsigned long max);
#else
void gl_canvas_set_access_params(GLCanvas *canvas, ADDRESS delta);
void gl_canvas_set_access_params(GLCanvas *canvas, unsigned long base, unsigned long max);
#endif
void *gl_canvas_get_usr_data(GLCanvas *canvas);
@ -75,6 +72,10 @@ GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth
#endif
#ifdef USE_GLZ
, void *glz_decoder_opaque, glz_decode_fn_t glz_decode
#endif
#ifndef CAIRO_CANVAS_NO_CHUNKS
, void *get_virt_opaque, get_virt_fn_t get_virt,
void *validate_virt_opaque, validate_virt_fn_t validate_virt
#endif
);
void gl_canvas_destroy(GLCanvas *, int);

View File

@ -52,7 +52,7 @@
#define REDHAT_PCI_VENDOR_ID 0x1b36
#define QXL_DEVICE_ID 0x0100 /* 0x100-0x11f reserved for spice */
#define QXL_REVISION 0x01
#define QXL_REVISION 0x02
#define QXL_ROM_MAGIC (*(UINT32*)"QXRO")
#define QXL_RAM_MAGIC (*(UINT32*)"QXRA")
@ -75,6 +75,8 @@ enum {
QXL_IO_RESET,
QXL_IO_SET_MODE,
QXL_IO_LOG,
QXL_IO_MEMSLOT_ADD,
QXL_IO_MEMSLOT_DEL,
QXL_IO_RANGE_SIZE
};
@ -93,6 +95,12 @@ typedef struct ATTR_PACKED QXLRom {
UINT32 draw_area_size;
UINT32 ram_header_offset;
UINT32 mm_clock;
UINT64 flags;
UINT8 slots_start;
UINT8 slots_end;
UINT8 slot_gen_bits;
UINT8 slot_id_bits;
UINT8 slot_generation;
} QXLRom;
typedef struct ATTR_PACKED QXLMode {
@ -129,6 +137,11 @@ typedef struct ATTR_PACKED QXLCommand {
} QXLCommand;
typedef struct ATTR_PACKED QXLMemSlot {
UINT64 mem_start;
UINT64 mem_end;
} QXLMemSlot;
RING_DECLARE(QXLCommandRing, QXLCommand, 32);
RING_DECLARE(QXLCursorRing, QXLCommand, 32);
@ -148,6 +161,8 @@ typedef struct ATTR_PACKED QXLRam {
QXLCursorRing cursor_ring;
QXLReleaseRing release_ring;
Rect update_area;
QXLMemSlot mem_slot;
UINT64 flags;
} QXLRam;
typedef union QXLReleaseInfo {