summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIzik Eidus <ieidus@redhat.com>2010-03-31 01:45:49 +0300
committerIzik Eidus <ieidus@redhat.com>2010-04-03 05:21:42 +0300
commiteed5c5031ab1accdaec8997b62e1d4f586450c15 (patch)
tree672ed190cc555451ee196168c22ecd1e00343fc6
parent62acb84aa14e81e26953a0986b4e5cb929070667 (diff)
qxl device add off screen support
Signed-off-by: Izik Eidus <ieidus@redhat.com>
-rw-r--r--qemu/hw/qxl.c35
-rw-r--r--qemu/hw/qxl_dev.h8
-rw-r--r--qemu/hw/qxl_interface.h2
3 files changed, 34 insertions, 11 deletions
diff --git a/qemu/hw/qxl.c b/qemu/hw/qxl.c
index 890d521c..5e06880c 100644
--- a/qemu/hw/qxl.c
+++ b/qemu/hw/qxl.c
@@ -19,7 +19,7 @@
//#define QXL_IO_MEM
-#define QXL_VRAM_SIZE 4096
+#define QXL_VRAM_SIZE 1024 * 1024 * 128
#define QXL_DEFAULT_COMPRESSION_LEVEL 0
#define QXL_SHARED_VGA_MODE FALSE
#define QXL_SAVE_VERSION 3
@@ -345,6 +345,7 @@ static void _qxl_get_init_info(PCIQXLDevice *d, QXLDevInitInfo *info)
info->num_memslots_groups = NUM_MEMSLOTS_GROUPS;
info->internal_groupslot_id = 0;
info->qxl_ram_size = d->state.rom->num_pages << TARGET_PAGE_BITS;
+ info->n_surfaces = 10000;
}
static int qxl_get_ring_command(PCIQXLDevice *d, QXLCommandExt *cmd_ext, QXLCommandRing *ring,
@@ -413,9 +414,10 @@ static int _qxl_get_cursor_command(PCIQXLDevice *d, QXLCommandExt *cmd_ext)
return 1;
}
-static const Rect *_qxl_get_update_area(PCIQXLDevice *d)
+static void _qxl_get_update_area(PCIQXLDevice *d, const Rect **rect, UINT32 **surface_id)
{
- return &d->state.ram->update_area;
+ *rect = &d->state.ram->update_area;
+ *surface_id = &d->state.ram->update_surface;
}
static int _qxl_req_cmd_notification(PCIQXLDevice *d)
@@ -1197,6 +1199,9 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
case QXL_IO_DESTROY_SURFACE_WAIT:
d->worker->destroy_surface_wait(d->worker, val);
break;
+ case QXL_IO_DESTROY_ALL_SURFACES:
+ d->worker->destroy_surfaces(d->worker);
+ break;
default:
printf("%s: unexpected addr 0x%x val 0x%x\n", __FUNCTION__, addr, val);
}
@@ -1269,6 +1274,10 @@ static void vram_map(PCIDevice *d, int region_num,
#else
cpu_register_physical_memory(addr, size, s->vram_offset | IO_MEM_RAM);
#endif
+ s->address_ranges[1].virt_start = (unsigned long)s->vram;
+ s->address_ranges[1].virt_end = s->address_ranges[1].virt_start + size;
+ s->address_ranges[1].phys_start = addr;
+ s->address_ranges[1].phys_end = s->address_ranges[1].phys_start + size;
}
@@ -1342,6 +1351,8 @@ static uint32_t init_qxl_rom(PCIQXLDevice *d, uint8_t *buf, uint32_t vram_size,
rom->slots_start = 1;
rom->slots_end = NUM_MEMSLOTS - 1;
+ rom->n_surfaces = 10000;
+
*max_fb = 0;
modes->n_modes = sizeof(qxl_modes) / sizeof(QXLMode);
@@ -1468,6 +1479,10 @@ static void qxl_vga_update(void)
}
image = (QXLImage *)(drawable + 1);
+ drawable->surface_id = 0;
+ drawable->surfaces_dest[0] = -1;
+ drawable->surfaces_dest[1] = -1;
+ drawable->surfaces_dest[2] = -1;
drawable->bbox = *dirty_rect;
drawable->clip.type = CLIP_TYPE_NONE;
drawable->clip.data = 0;
@@ -1795,9 +1810,9 @@ int qxl_has_command(QXLDevRef dev_ref)
return _qxl_has_command((PCIQXLDevice *)dev_ref);
}
-const Rect *qxl_get_update_area(QXLDevRef dev_ref)
+void qxl_get_update_area(QXLDevRef dev_ref, const Rect **rect, UINT32 **surface_id)
{
- return _qxl_get_update_area((PCIQXLDevice *)dev_ref);
+ _qxl_get_update_area((PCIQXLDevice *)dev_ref, rect, surface_id);
}
int qxl_flush_resources(QXLDevRef dev_ref)
@@ -1879,9 +1894,9 @@ static int interface_req_cursor_notification(QXLInterface *qxl)
return _qxl_req_cursor_notification(((Interface *)qxl)->d);
}
-static const struct Rect *interface_get_update_area(QXLInterface *qxl)
+static void interface_get_update_area(QXLInterface *qxl, const Rect **rect, UINT32 **surface_id)
{
- return _qxl_get_update_area(((Interface *)qxl)->d);
+ _qxl_get_update_area(((Interface *)qxl)->d, rect, surface_id);
}
static void interface_notify_update(QXLInterface *qxl, uint32_t update_id)
@@ -2204,13 +2219,13 @@ void qxl_init(PCIBus *bus, uint8_t *vram, unsigned long vram_offset,
d->state.vram_offset = vram_offset + rom_size + qxl_ram_size;
d->state.vram_size = msb_mask(vram_size - (qxl_ram_size + rom_size));
- d->state.address_ranges = (QXLAddressRange *)malloc(sizeof(QXLAddressRange) * (num_ranges + 1));
+ d->state.address_ranges = (QXLAddressRange *)malloc(sizeof(QXLAddressRange) * (num_ranges + 2));
PANIC_ON(!d->state.address_ranges);
qxl_reset_device_address_ranges(d);
for (i = 0; i < num_ranges; ++i) {
- d->state.address_ranges[i + 1] = address_ranges[i];
+ d->state.address_ranges[i + 2] = address_ranges[i];
}
- d->state.num_ranges = num_ranges + 1;
+ d->state.num_ranges = num_ranges + 2;
d->state.group_ids_flip[0] = 0;
d->state.group_ids_flip[1] = 1;
diff --git a/qemu/hw/qxl_dev.h b/qemu/hw/qxl_dev.h
index cba9e3e9..122b8a29 100644
--- a/qemu/hw/qxl_dev.h
+++ b/qemu/hw/qxl_dev.h
@@ -50,6 +50,8 @@ enum {
QXL_IO_CREATE_PRIMARY,
QXL_IO_DESTROY_PRIMARY,
QXL_IO_DESTROY_SURFACE_WAIT,
+ QXL_IO_DESTROY_ALL_SURFACES,
+ QXL_IO_NOTIFY_SURFACES_OOM,
QXL_IO_RANGE_SIZE
};
@@ -71,6 +73,7 @@ typedef struct ATTR_PACKED QXLRom {
UINT8 slot_gen_bits;
UINT8 slot_id_bits;
UINT8 slot_generation;
+ UINT32 n_surfaces;
} QXLRom;
typedef struct ATTR_PACKED QXLMode {
@@ -149,6 +152,7 @@ typedef struct ATTR_PACKED QXLRam {
QXLCursorRing cursor_ring;
QXLReleaseRing release_ring;
Rect update_area;
+ UINT32 update_surface;
QXLMemSlot mem_slot;
QXLSurfaceCreate create_surface;
UINT64 flags;
@@ -180,6 +184,7 @@ typedef struct ATTR_PACKED QXLUpdateCmd {
QXLReleaseInfo release_info;
Rect area;
UINT32 update_id;
+ UINT32 surface_id;
} QXLUpdateCmd;
typedef struct ATTR_PACKED QXLCursor {
@@ -254,6 +259,7 @@ typedef struct ATTR_PACKED QXLCopyBits {
typedef struct ATTR_PACKED QXLDrawable {
QXLReleaseInfo release_info;
+ uint32_t surface_id;
UINT8 effect;
UINT8 type;
UINT8 self_bitmap;
@@ -261,6 +267,8 @@ typedef struct ATTR_PACKED QXLDrawable {
Rect bbox;
Clip clip;
UINT32 mm_time;
+ INT32 surfaces_dest[3];
+ Rect surfaces_rects[3];
union {
Fill fill;
Opaque opaque;
diff --git a/qemu/hw/qxl_interface.h b/qemu/hw/qxl_interface.h
index 8d372191..1de7e25c 100644
--- a/qemu/hw/qxl_interface.h
+++ b/qemu/hw/qxl_interface.h
@@ -95,7 +95,7 @@ int qxl_req_cmd_notification(QXLDevRef dev_ref);
int qxl_get_cursor_command(QXLDevRef dev_ref, QXLCommandExt *cmd);
int qxl_req_cursor_notification(QXLDevRef dev_ref);
int qxl_has_command(QXLDevRef dev_ref);
-const Rect *qxl_get_update_area(QXLDevRef dev_ref);
+void qxl_get_update_area(QXLDevRef dev_ref, const Rect **rect, uint32_t **surface_id);
int qxl_flush_resources(QXLDevRef dev_ref);
void qxl_set_save_data(QXLDevRef dev_ref, void *data, int size);
void *qxl_get_save_data(QXLDevRef dev_ref);