summaryrefslogtreecommitdiffstats
path: root/server/tests
diff options
context:
space:
mode:
Diffstat (limited to 'server/tests')
-rw-r--r--server/tests/test_display_no_ssl.c165
1 files changed, 145 insertions, 20 deletions
diff --git a/server/tests/test_display_no_ssl.c b/server/tests/test_display_no_ssl.c
index 54e9949b..de89949f 100644
--- a/server/tests/test_display_no_ssl.c
+++ b/server/tests/test_display_no_ssl.c
@@ -9,15 +9,22 @@
#include "test_util.h"
#include "basic_event_loop.h"
+#define MEM_SLOT_GROUP_ID 0
+
/* Parts cribbed from spice-display.h/.c/qxl.c */
typedef struct SimpleSpiceUpdate {
+ QXLCommandExt ext; // first
QXLDrawable drawable;
QXLImage image;
- QXLCommandExt ext;
uint8_t *bitmap;
} SimpleSpiceUpdate;
+typedef struct SimpleSurfaceCmd {
+ QXLCommandExt ext; // first
+ QXLSurfaceCmd surface_cmd;
+} SimpleSurfaceCmd;
+
void test_spice_destroy_update(SimpleSpiceUpdate *update)
{
if (!update) {
@@ -30,28 +37,47 @@ void test_spice_destroy_update(SimpleSpiceUpdate *update)
#define WIDTH 320
#define HEIGHT 320
-static int angle_parts = 64;
+#define SINGLE_PART 8
+static const int angle_parts = 64 / SINGLE_PART;
static int angle = 0;
static int unique = 1;
-static int color = 0;
+static int color = -1;
static int c_i = 0;
-SimpleSpiceUpdate *test_spice_create_update()
+void set_cmd(QXLCommandExt *ext, uint32_t type, QXLPHYSICAL data)
+{
+ ext->cmd.type = type;
+ ext->cmd.data = data;
+ ext->cmd.padding = 0;
+ ext->group_id = MEM_SLOT_GROUP_ID;
+ ext->flags = 0;
+}
+
+void simple_set_release_info(QXLReleaseInfo *info, intptr_t ptr)
+{
+ info->id = ptr;
+ //info->group_id = MEM_SLOT_GROUP_ID;
+}
+
+SimpleSpiceUpdate *test_spice_create_update(uint32_t surface_id)
{
SimpleSpiceUpdate *update;
QXLDrawable *drawable;
QXLImage *image;
- QXLCommand *cmd;
QXLRect bbox = {
+#ifdef CIRCLE
.top = HEIGHT/2 + (HEIGHT/3)*cos(angle*2*M_PI/angle_parts),
.left = WIDTH/2 + (WIDTH/3)*sin(angle*2*M_PI/angle_parts),
+#else
+ .top = HEIGHT*(angle % SINGLE_PART)/SINGLE_PART,
+ .left = ((WIDTH/SINGLE_PART)*(angle / SINGLE_PART)) % WIDTH,
+#endif
};
uint8_t *dst;
int bw, bh;
int i;
- angle++;
- if ((angle % angle_parts) == 0) {
+ if ((angle++ % angle_parts) == 0) {
c_i++;
}
color = (color + 1) % 2;
@@ -60,19 +86,20 @@ SimpleSpiceUpdate *test_spice_create_update()
update = calloc(sizeof(*update), 1);
drawable = &update->drawable;
image = &update->image;
- cmd = &update->ext.cmd;
- bw = 64;
+ bw = WIDTH/SINGLE_PART;
bh = 48;
bbox.right = bbox.left + bw;
bbox.bottom = bbox.top + bh;
update->bitmap = malloc(bw * bh * 4);
//printf("allocated %p, %p\n", update, update->bitmap);
+ drawable->surface_id = surface_id;
+
drawable->bbox = bbox;
drawable->clip.type = SPICE_CLIP_TYPE_NONE;
drawable->effect = QXL_EFFECT_OPAQUE;
- drawable->release_info.id = (intptr_t)update;
+ simple_set_release_info(&drawable->release_info, (intptr_t)update);
drawable->type = QXL_DRAW_COPY;
drawable->surfaces_dest[0] = -1;
drawable->surfaces_dest[1] = -1;
@@ -101,13 +128,53 @@ SimpleSpiceUpdate *test_spice_create_update()
*(dst+((3+c_i)%3)) = 0;
}
- cmd->type = QXL_CMD_DRAW;
- cmd->data = (intptr_t)drawable;
+ set_cmd(&update->ext, QXL_CMD_DRAW, (intptr_t)drawable);
return update;
}
-#define MEM_SLOT_GROUP_ID 0
+/*
+void dispatch_update_area(QXLWorker *worker)
+{
+ worker->update_area();
+}
+
+ update_area()
+{
+ QXL_CMD_UPDATE
+}
+*/
+
+SimpleSurfaceCmd *create_surface(int surface_id, int width, int height, uint8_t *data)
+{
+ SimpleSurfaceCmd *simple_cmd = calloc(sizeof(SimpleSurfaceCmd), 1);
+ QXLSurfaceCmd *surface_cmd = &simple_cmd->surface_cmd;
+
+ set_cmd(&simple_cmd->ext, QXL_CMD_SURFACE, (intptr_t)surface_cmd);
+ simple_set_release_info(&surface_cmd->release_info, (intptr_t)simple_cmd);
+ surface_cmd->type = QXL_SURFACE_CMD_CREATE;
+ surface_cmd->flags = 0; // ?
+ surface_cmd->surface_id = surface_id;
+ surface_cmd->u.surface_create.format = SPICE_SURFACE_FMT_32_xRGB;
+ surface_cmd->u.surface_create.width = width;
+ surface_cmd->u.surface_create.height = height;
+ surface_cmd->u.surface_create.stride = -width * 4;
+ surface_cmd->u.surface_create.data = (intptr_t)data;
+ return simple_cmd;
+}
+
+SimpleSurfaceCmd *destroy_surface(int surface_id)
+{
+ SimpleSurfaceCmd *simple_cmd = calloc(sizeof(SimpleSurfaceCmd), 1);
+ QXLSurfaceCmd *surface_cmd = &simple_cmd->surface_cmd;
+
+ set_cmd(&simple_cmd->ext, QXL_CMD_SURFACE, (intptr_t)surface_cmd);
+ simple_set_release_info(&surface_cmd->release_info, (intptr_t)simple_cmd);
+ surface_cmd->type = QXL_SURFACE_CMD_DESTROY;
+ surface_cmd->flags = 0; // ?
+ surface_cmd->surface_id = surface_id;
+ return simple_cmd;
+}
static QXLWorker *qxl_worker = NULL;
static uint8_t primary_surface[HEIGHT * WIDTH * 4];
@@ -162,6 +229,9 @@ void set_mm_time(QXLInstance *qin, uint32_t mm_time)
{
}
+// we now have a secondary surface
+#define MAX_SURFACE_NUM 2
+
void get_init_info(QXLInstance *qin, QXLDevInitInfo *info)
{
bzero(info, sizeof(*info));
@@ -169,31 +239,75 @@ void get_init_info(QXLInstance *qin, QXLDevInitInfo *info)
info->num_memslots_groups = 1;
info->memslot_id_bits = 1;
info->memslot_gen_bits = 1;
- info->n_surfaces = 1;
+ info->n_surfaces = MAX_SURFACE_NUM;
}
-#define NOTIFY_DISPLAY_BATCH 10
+#define NOTIFY_DISPLAY_BATCH (SINGLE_PART*2)
#define NOTIFY_CURSOR_BATCH 0
int notify = NOTIFY_DISPLAY_BATCH;
int cursor_notify = NOTIFY_CURSOR_BATCH;
+// simple queue for commands
+enum {
+ SIMPLE_CREATE_SURFACE,
+ SIMPLE_DRAW,
+ SIMPLE_DESTROY_SURFACE
+};
+
+int commands[] = {
+ //SIMPLE_CREATE_SURFACE,
+ //SIMPLE_DRAW,
+ //SIMPLE_DESTROY_SURFACE,
+ SIMPLE_DRAW,
+};
+
+#define NUM_COMMANDS (sizeof(commands)/sizeof(commands[0]))
+
+#define SURF_WIDTH 320
+#define SURF_HEIGHT 240
+uint8_t secondary_surface[SURF_WIDTH * SURF_HEIGHT * 4];
+
+// called from spice_server thread (i.e. red_worker thread)
int get_command(QXLInstance *qin, struct QXLCommandExt *ext)
{
- SimpleSpiceUpdate *update;
+ static int cmd_index = 0;
+ static uint32_t target_surface = 0;
if (!notify) {
return FALSE;
}
notify--;
- update = test_spice_create_update();
- *ext = update->ext;
+ switch (commands[cmd_index]) {
+ case SIMPLE_DRAW: {
+ SimpleSpiceUpdate *update;
+ update = test_spice_create_update(target_surface);
+ *ext = update->ext;
+ break;
+ }
+ case SIMPLE_CREATE_SURFACE: {
+ SimpleSurfaceCmd *update;
+ target_surface = MAX_SURFACE_NUM - 1;
+ update = create_surface(target_surface, SURF_WIDTH, SURF_HEIGHT,
+ secondary_surface);
+ *ext = update->ext;
+ break;
+ }
+ case SIMPLE_DESTROY_SURFACE: {
+ SimpleSurfaceCmd *update;
+ update = destroy_surface(target_surface);
+ target_surface = 0;
+ *ext = update->ext;
+ break;
+ }
+ }
+ cmd_index = (cmd_index + 1) % NUM_COMMANDS;
return TRUE;
}
SpiceTimer *wakeup_timer;
-int wakeup_ms = 100;
+int wakeup_ms = 500;
int req_cmd_notification(QXLInstance *qin)
{
@@ -211,9 +325,19 @@ void do_wakeup()
void release_resource(QXLInstance *qin, struct QXLReleaseInfoExt release_info)
{
+ QXLCommandExt *ext = (void*)release_info.info->id;
//printf("%s\n", __func__);
ASSERT(release_info.group_id == MEM_SLOT_GROUP_ID);
- test_spice_destroy_update((void*)release_info.info->id);
+ switch (ext->cmd.type) {
+ case QXL_CMD_DRAW:
+ test_spice_destroy_update((void*)ext);
+ break;
+ case QXL_CMD_SURFACE:
+ free(ext);
+ break;
+ default:
+ abort();
+ }
}
#define CURSOR_WIDTH 32
@@ -340,6 +464,7 @@ int main()
core = basic_event_loop_init();
server = spice_server_new();
bzero(primary_surface, sizeof(primary_surface));
+ bzero(secondary_surface, sizeof(secondary_surface));
spice_server_set_port(server, 5912);
spice_server_set_noauth(server);
spice_server_init(server, core);