mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-09 05:51:00 +00:00
Make virt mapping an interface
This commit is contained in:
parent
f7a77f9881
commit
05697e502d
@ -2157,8 +2157,7 @@ CairoCanvas *canvas_create(pixman_image_t *image, int bits
|
||||
#endif
|
||||
, SpiceGlzDecoder *glz_decoder
|
||||
#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
|
||||
, SpiceVirtMapping *virt_mapping
|
||||
#endif
|
||||
)
|
||||
{
|
||||
@ -2181,11 +2180,7 @@ CairoCanvas *canvas_create(pixman_image_t *image, int bits
|
||||
#endif
|
||||
, glz_decoder
|
||||
#ifndef CAIRO_CANVAS_NO_CHUNKS
|
||||
,
|
||||
get_virt_opaque,
|
||||
get_virt,
|
||||
validate_virt_opaque,
|
||||
validate_virt
|
||||
, virt_mapping
|
||||
#endif
|
||||
);
|
||||
canvas->private_data = NULL;
|
||||
|
||||
@ -71,8 +71,7 @@ CairoCanvas *canvas_create(pixman_image_t *image, int bits
|
||||
#endif
|
||||
, SpiceGlzDecoder *glz_decoder
|
||||
#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
|
||||
, SpiceVirtMapping *virt_mapping
|
||||
#endif
|
||||
);
|
||||
void canvas_destroy(CairoCanvas *canvas);
|
||||
|
||||
@ -164,10 +164,7 @@ typedef struct QuicData {
|
||||
jmp_buf jmp_env;
|
||||
#ifndef CAIRO_CANVAS_NO_CHUNKS
|
||||
SPICE_ADDRESS next;
|
||||
get_virt_fn_t get_virt;
|
||||
void *get_virt_opaque;
|
||||
validate_virt_fn_t validate_virt;
|
||||
void *validate_virt_opaque;
|
||||
SpiceVirtMapping *virt_mapping;
|
||||
#endif
|
||||
char message_buf[512];
|
||||
} QuicData;
|
||||
@ -1506,11 +1503,11 @@ static int quic_usr_more_space(QuicUsrContext *usr, uint32_t **io_ptr, int rows_
|
||||
if (!quic_data->next) {
|
||||
return 0;
|
||||
}
|
||||
chunk = (DataChunk *)quic_data->get_virt(quic_data->get_virt_opaque, quic_data->next,
|
||||
sizeof(DataChunk));
|
||||
chunk = (DataChunk *)quic_data->virt_mapping->ops->get_virt(quic_data->virt_mapping, 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->virt_mapping->ops->validate_virt(quic_data->virt_mapping, (unsigned long)chunk->data,
|
||||
quic_data->next, size);
|
||||
|
||||
quic_data->next = chunk->next;
|
||||
*io_ptr = (uint32_t *)chunk->data;
|
||||
@ -1555,8 +1552,7 @@ static int canvas_base_init(CanvasBase *canvas, int depth
|
||||
#endif
|
||||
, SpiceGlzDecoder *glz_decoder
|
||||
#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
|
||||
, SpiceVirtMapping *virt_mapping
|
||||
#endif
|
||||
)
|
||||
{
|
||||
@ -1568,10 +1564,7 @@ static int canvas_base_init(CanvasBase *canvas, int depth
|
||||
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;
|
||||
canvas->quic_data.virt_mapping = virt_mapping;
|
||||
#endif
|
||||
if (!(canvas->quic_data.quic = quic_create(&canvas->quic_data.usr))) {
|
||||
return 0;
|
||||
|
||||
@ -27,6 +27,7 @@
|
||||
typedef struct _SpiceImageCache SpiceImageCache;
|
||||
typedef struct _SpicePaletteCache SpicePaletteCache;
|
||||
typedef struct _SpiceGlzDecoder SpiceGlzDecoder;
|
||||
typedef struct _SpiceVirtMapping SpiceVirtMapping;
|
||||
|
||||
typedef struct {
|
||||
void (*put)(SpiceImageCache *cache,
|
||||
@ -64,11 +65,15 @@ struct _SpiceGlzDecoder {
|
||||
SpiceGlzDecoderOps *ops;
|
||||
};
|
||||
|
||||
#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
|
||||
typedef struct {
|
||||
void *(*get_virt)(SpiceVirtMapping *mapping, unsigned long addr, uint32_t add_size);
|
||||
void (*validate_virt)(SpiceVirtMapping *mapping, unsigned long virt,
|
||||
unsigned long from_addr, uint32_t add_size);
|
||||
} SpiceVirtMappingOps;
|
||||
|
||||
struct _SpiceVirtMapping {
|
||||
SpiceVirtMappingOps *ops;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@ -813,8 +813,7 @@ GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth
|
||||
#endif
|
||||
, SpiceGlzDecoder *glz_decoder
|
||||
#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
|
||||
, SpiceVirtMapping *virt_mapping
|
||||
#endif
|
||||
)
|
||||
{
|
||||
@ -843,11 +842,7 @@ GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth
|
||||
#endif
|
||||
, glz_decoder
|
||||
#ifndef CAIRO_CANVAS_NO_CHUNKS
|
||||
,
|
||||
get_virt_opaque,
|
||||
get_virt,
|
||||
validate_virt_opaque,
|
||||
validate_virt
|
||||
, virt_mapping
|
||||
#endif
|
||||
);
|
||||
if (!init_ok) {
|
||||
|
||||
@ -66,8 +66,7 @@ GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth
|
||||
#endif
|
||||
, SpiceGlzDecoder *glz_decoder
|
||||
#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
|
||||
, SpiceVirtMapping *virt_mapping
|
||||
#endif
|
||||
);
|
||||
void gl_canvas_destroy(GLCanvas *, int);
|
||||
|
||||
@ -1007,6 +1007,7 @@ typedef struct RedWorker {
|
||||
uint64_t *wakeup_counter;
|
||||
uint64_t *command_counter;
|
||||
#endif
|
||||
SpiceVirtMapping preload_group_virt_mapping;
|
||||
} RedWorker;
|
||||
|
||||
pthread_mutex_t avcodec_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
@ -1217,18 +1218,20 @@ static void cb_validate_virt(void *opaque, unsigned long virt, unsigned long fro
|
||||
validate_virt((RedWorker *)opaque, virt, slot_id, add_size, group_id);
|
||||
}
|
||||
|
||||
static void *cb_get_virt_preload_group(void *opaque, unsigned long addr, uint32_t add_size)
|
||||
static void *op_get_virt_preload_group(SpiceVirtMapping *mapping, unsigned long addr, uint32_t add_size)
|
||||
{
|
||||
return (void *)get_virt((RedWorker *)opaque, addr, add_size,
|
||||
((RedWorker *)opaque)->preload_group_id);
|
||||
RedWorker *worker = CONTAINEROF(mapping, RedWorker, preload_group_virt_mapping);
|
||||
return (void *)get_virt(worker, addr, add_size,
|
||||
worker->preload_group_id);
|
||||
}
|
||||
|
||||
static void cb_validate_virt_preload_group(void *opaque, unsigned long virt,
|
||||
static void op_validate_virt_preload_group(SpiceVirtMapping *mapping, unsigned long virt,
|
||||
unsigned long from_addr, uint32_t add_size)
|
||||
{
|
||||
int slot_id = get_memslot_id((RedWorker *)opaque, from_addr);
|
||||
validate_virt((RedWorker *)opaque, virt, slot_id, add_size,
|
||||
((RedWorker *)opaque)->preload_group_id);
|
||||
RedWorker *worker = CONTAINEROF(mapping, RedWorker, preload_group_virt_mapping);
|
||||
int slot_id = get_memslot_id(worker, from_addr);
|
||||
validate_virt(worker, virt, slot_id, add_size,
|
||||
worker->preload_group_id);
|
||||
}
|
||||
|
||||
char *draw_type_to_str(uint8_t type)
|
||||
@ -7491,8 +7494,7 @@ static CairoCanvas *create_cairo_context(RedWorker *worker, uint32_t width, uint
|
||||
red_error("create cairo surface failed");
|
||||
}
|
||||
canvas = canvas_create(surface, depth, &worker->image_cache.base, NULL,
|
||||
worker, cb_get_virt_preload_group, worker,
|
||||
cb_validate_virt_preload_group);
|
||||
&worker->preload_group_virt_mapping);
|
||||
pixman_image_unref (surface);
|
||||
return canvas;
|
||||
}
|
||||
@ -7555,8 +7557,7 @@ static GLCanvas *create_ogl_context_common(RedWorker *worker, OGLCtx *ctx, uint3
|
||||
|
||||
oglctx_make_current(ctx);
|
||||
if (!(canvas = gl_canvas_create(ctx, width, height, depth, &worker->image_cache.base, NULL,
|
||||
worker, cb_get_virt_preload_group,
|
||||
worker, cb_validate_virt_preload_group))) {
|
||||
&worker->preload_group_virt_mapping))) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -9028,6 +9029,10 @@ static void red_init(RedWorker *worker, WorkerInitData *init_data)
|
||||
struct epoll_event event;
|
||||
RedWorkeMessage message;
|
||||
int epoll;
|
||||
static SpiceVirtMappingOps preload_group_virt_mapping_ops = {
|
||||
op_get_virt_preload_group,
|
||||
op_validate_virt_preload_group
|
||||
};
|
||||
|
||||
ASSERT(sizeof(CursorItem) <= QXL_CURSUR_DEVICE_DATA_SIZE);
|
||||
|
||||
@ -9081,6 +9086,8 @@ static void red_init(RedWorker *worker, WorkerInitData *init_data)
|
||||
worker->internal_groupslot_id = init_data->internal_groupslot_id;
|
||||
red_create_mem_slots(worker);
|
||||
|
||||
worker->preload_group_virt_mapping.ops = &preload_group_virt_mapping_ops;
|
||||
|
||||
message = RED_WORKER_MESSAGE_READY;
|
||||
write_message(worker->channel, &message);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user