--- src/qxl.h | 1 - src/qxl_driver.c | 29 ++++++----------------------- src/qxl_surface.c | 16 +++++++--------- src/qxlhw.c | 5 +++++ src/qxlhw.h | 5 +++++ src/qxlhw_pci.c | 23 +++++++++++++++++++++++ 6 files changed, 46 insertions(+), 33 deletions(-)
diff --git a/src/qxl.h b/src/qxl.h index 929a5de..96144d6 100644 --- a/src/qxl.h +++ b/src/qxl.h @@ -373,7 +373,6 @@ int qxl_garbage_collect (qxl_screen_t *qxl); /* * I/O port commands */ -void qxl_update_area(qxl_screen_t *qxl); void qxl_memslot_add(qxl_screen_t *qxl, uint8_t id); void qxl_create_primary(qxl_screen_t *qxl); void qxl_notify_oom(qxl_screen_t *qxl); diff --git a/src/qxl_driver.c b/src/qxl_driver.c index f56a43e..a39d8c7 100644 --- a/src/qxl_driver.c +++ b/src/qxl_driver.c @@ -145,20 +145,6 @@ static void qxl_wait_for_io_command(qxl_screen_t *qxl) } #endif -void qxl_update_area(qxl_screen_t *qxl) -{ -#ifndef XSPICE - if (qxl->pci->revision >= 3) { - ioport_write(qxl, QXL_IO_UPDATE_AREA_ASYNC, 0); - qxl_wait_for_io_command(qxl); - } else { - ioport_write(qxl, QXL_IO_UPDATE_AREA, 0); - } -#else - ioport_write(qxl, QXL_IO_UPDATE_AREA, 0); -#endif -} - void qxl_create_primary(qxl_screen_t *qxl) { #ifndef XSPICE @@ -284,6 +270,7 @@ qxl_allocnf (qxl_screen_t *qxl, unsigned long size) { void *result; int n_attempts = 0; + struct QXLRect rect; #if 0 static int nth_oom = 1; #endif @@ -292,18 +279,14 @@ qxl_allocnf (qxl_screen_t *qxl, unsigned long size) while (!(result = qxl_alloc (qxl->mem, size))) { - struct QXLRam *ram_header = qxlhw_pci_get_ram_header(qxl->hw); - /* Rather than go out of memory, we simply tell the * device to dump everything */ - ram_header->update_area.top = 0; - ram_header->update_area.bottom = qxl->virtual_y; - ram_header->update_area.left = 0; - ram_header->update_area.right = qxl->virtual_x; - ram_header->update_surface = 0; /* Only primary for now */ - - qxl_update_area(qxl); + rect.top = 0; + rect.bottom = qxl->virtual_y; + rect.left = 0; + rect.right = qxl->virtual_x; + qxlhw_update_area(qxl->hw, 0 /* Only primary for now */, rect); #if 0 ErrorF ("eliminated memory (%d)\n", nth_oom++); diff --git a/src/qxl_surface.c b/src/qxl_surface.c index 6343337..2ae7124 100644 --- a/src/qxl_surface.c +++ b/src/qxl_surface.c @@ -821,16 +821,14 @@ qxl_surface_flush (qxl_surface_t *surface) static void download_box (qxl_surface_t *surface, int x1, int y1, int x2, int y2) { - struct QXLRam *ram_header = qxlhw_pci_get_ram_header (surface->cache->qxl->hw); - - ram_header->update_area.top = y1; - ram_header->update_area.bottom = y2; - ram_header->update_area.left = x1; - ram_header->update_area.right = x2; - - ram_header->update_surface = surface->id; + QXLRect update_area; + + update_area.top = y1; + update_area.bottom = y2; + update_area.left = x1; + update_area.right = x2; - qxl_update_area(surface->cache->qxl); + qxlhw_update_area(surface->cache->qxl->hw, surface->id, update_area); pixman_image_composite (PIXMAN_OP_SRC, surface->dev_image, diff --git a/src/qxlhw.c b/src/qxlhw.c index a335ee7..d9617e7 100644 --- a/src/qxlhw.c +++ b/src/qxlhw.c @@ -37,3 +37,8 @@ void qxlhw_unmap_memory(struct qxlhw *base, int scrnIndex) { base->unmap_memory(base, scrnIndex); } + +void qxlhw_update_area(struct qxlhw *base, int surface_id, struct QXLRect rect) +{ + base->update_area(base, surface_id, rect); +} diff --git a/src/qxlhw.h b/src/qxlhw.h index c943cc8..28a1e70 100644 --- a/src/qxlhw.h +++ b/src/qxlhw.h @@ -13,6 +13,9 @@ struct qxlhw { void (*reset)(struct qxlhw *base); Bool (*map_memory)(struct qxlhw *base, int scrnIndex); void (*unmap_memory)(struct qxlhw *base, int scrnIndex); + + /* memory handling callbacks */ + void (*update_area)(struct qxlhw *base, int surface_id, struct QXLRect rect); }; void qxlhw_init(struct qxlhw *base, qxl_screen_t *qxl); @@ -21,6 +24,8 @@ void qxlhw_init(struct qxlhw *base, qxl_screen_t *qxl); * to use. currently just PCI. */ struct qxlhw *qxlhw_create(qxl_screen_t *qxl, ScrnInfoPtr pScrn); +void qxlhw_update_area(struct qxlhw *base, int surface_id, struct QXLRect rect); + /* reset vs device_reset - device_reset is just the io / drm call, * reset does -- what? (definition, not contents) */ void qxlhw_device_reset(struct qxlhw *base); diff --git a/src/qxlhw_pci.c b/src/qxlhw_pci.c index d671498..f25b792 100644 --- a/src/qxlhw_pci.c +++ b/src/qxlhw_pci.c @@ -367,6 +367,28 @@ static void qxlhw_pci_reset(struct qxlhw *base) base->qxl->vram_mem_slot = hw->vram_mem_slot; } +static void qxlhw_pci_update_area(struct qxlhw *base, int surface_id, struct QXLRect rect) +{ + struct qxlhw_pci *hw = (struct qxlhw_pci *)base; + struct QXLRam *ram_header = qxlhw_pci_get_ram_header (base); +#ifndef XSPICE + qxl_screen_t *qxl = base->qxl; +#endif + + ram_header->update_area = rect; + ram_header->update_surface = surface_id; +#ifndef XSPICE + if (qxl->pci->revision >= 3) { + qxlhw_pci_ioport_write(hw, QXL_IO_UPDATE_AREA_ASYNC, 0); + qxlhw_pci_wait_for_io_command(hw); + } else { + qxlhw_pci_ioport_write(hw, QXL_IO_UPDATE_AREA, 0); + } +#else + qxlhw_pci_ioport_write(hw, QXL_IO_UPDATE_AREA, 0); +#endif +} + /* public entry point */ struct qxlhw *create_qxlhw_pci(qxl_screen_t *qxl, ScrnInfoPtr pScrn) { @@ -378,6 +400,7 @@ struct qxlhw *create_qxlhw_pci(qxl_screen_t *qxl, ScrnInfoPtr pScrn) base->reset = qxlhw_pci_reset; base->map_memory = qxlhw_pci_map_memory; base->unmap_memory = qxlhw_pci_unmap_memory; + base->update_area = qxlhw_pci_update_area; return base; } -- 1.7.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel