cursor commands are now allocated on the stack in qxl_cursor.c and only allocated on the pci bar in qxlhw_pci. --- src/qxl.h | 1 - src/qxl_cursor.c | 58 ++++++++++++++++++++++-------------------------------- src/qxlhw.c | 5 +++++ src/qxlhw.h | 4 ++++ src/qxlhw_pci.c | 33 ++++++++++++++++++++++++++++++- 5 files changed, 64 insertions(+), 37 deletions(-)
diff --git a/src/qxl.h b/src/qxl.h index 4ca68a3..d72f64f 100644 --- a/src/qxl.h +++ b/src/qxl.h @@ -128,7 +128,6 @@ struct _qxl_screen_t /* These are the names QXL uses */ struct qxl_ring * command_ring; - struct qxl_ring * cursor_ring; struct qxl_ring * release_ring; int num_modes; diff --git a/src/qxl_cursor.c b/src/qxl_cursor.c index 68ea3ce..5d8134f 100644 --- a/src/qxl_cursor.c +++ b/src/qxl_cursor.c @@ -29,50 +29,35 @@ #endif #include <string.h> +#include <cursorstr.h> #include "qxl.h" #include "qxl_ring.h" -#include <cursorstr.h> +#include "qxlhw.h" static void push_cursor (qxl_screen_t *qxl, struct QXLCursorCmd *cursor) { - struct QXLCommand cmd; - /* See comment on push_command() in qxl_driver.c */ if (qxl->pScrn->vtSema) { - cmd.type = QXL_CMD_CURSOR; - cmd.data = physical_address (qxl, cursor, qxl->main_mem_slot); - - qxl_ring_push (qxl->cursor_ring, &cmd); + qxlhw_push_cursor (qxl->hw, cursor); } } -static struct QXLCursorCmd * -qxl_alloc_cursor_cmd(qxl_screen_t *qxl) -{ - struct QXLCursorCmd *cmd = - qxl_allocnf (qxl, sizeof(struct QXLCursorCmd)); - - cmd->release_info.id = pointer_to_u64 (cmd) | 1; - - return cmd; -} - static void qxl_set_cursor_position(ScrnInfoPtr pScrn, int x, int y) { qxl_screen_t *qxl = pScrn->driverPrivate; - struct QXLCursorCmd *cmd = qxl_alloc_cursor_cmd(qxl); + struct QXLCursorCmd cmd; qxl->cur_x = x; qxl->cur_y = y; - cmd->type = QXL_CURSOR_MOVE; - cmd->u.position.x = qxl->cur_x + qxl->hot_x; - cmd->u.position.y = qxl->cur_y + qxl->hot_y; + cmd.type = QXL_CURSOR_MOVE; + cmd.u.position.x = qxl->cur_x + qxl->hot_x; + cmd.u.position.y = qxl->cur_y + qxl->hot_y; - push_cursor(qxl, cmd); + push_cursor(qxl, &cmd); } static void @@ -94,10 +79,11 @@ qxl_load_cursor_argb (ScrnInfoPtr pScrn, CursorPtr pCurs) int h = pCurs->bits->height; int size = w * h * sizeof (CARD32); - struct QXLCursorCmd *cmd = qxl_alloc_cursor_cmd (qxl); + struct QXLCursorCmd cmd; struct QXLCursor *cursor = - qxl_allocnf(qxl, sizeof(struct QXLCursor) + size); + qxlhw_data_alloc(qxl->hw, sizeof(struct QXLCursor) + size); + memset(&cmd, 0, sizeof(cmd)); cursor->header.unique = 0; cursor->header.type = SPICE_CURSOR_TYPE_ALPHA; cursor->header.width = w; @@ -133,14 +119,14 @@ qxl_load_cursor_argb (ScrnInfoPtr pScrn, CursorPtr pCurs) qxl->hot_x = pCurs->bits->xhot; qxl->hot_y = pCurs->bits->yhot; - cmd->type = QXL_CURSOR_SET; - cmd->u.set.position.x = qxl->cur_x + qxl->hot_x; - cmd->u.set.position.y = qxl->cur_y + qxl->hot_y; - cmd->u.set.shape = physical_address (qxl, cursor, qxl->main_mem_slot); - cmd->u.set.visible = TRUE; + cmd.type = QXL_CURSOR_SET; + cmd.u.set.position.x = qxl->cur_x + qxl->hot_x; + cmd.u.set.position.y = qxl->cur_y + qxl->hot_y; + cmd.u.set.shape = pointer_to_u64(cursor); + cmd.u.set.visible = TRUE; - push_cursor(qxl, cmd); -} + push_cursor(qxl, &cmd); +} static Bool qxl_use_hw_cursor (ScreenPtr pScrn, CursorPtr pCurs) @@ -161,11 +147,13 @@ static void qxl_hide_cursor(ScrnInfoPtr pScrn) { qxl_screen_t *qxl = pScrn->driverPrivate; - struct QXLCursorCmd *cursor = qxl_alloc_cursor_cmd(qxl); + struct QXLCursorCmd cursor; + + memset(&cursor, 0, sizeof(cursor)); - cursor->type = QXL_CURSOR_HIDE; + cursor.type = QXL_CURSOR_HIDE; - push_cursor(qxl, cursor); + push_cursor(qxl, &cursor); } static void diff --git a/src/qxlhw.c b/src/qxlhw.c index 9706141..184cd7b 100644 --- a/src/qxlhw.c +++ b/src/qxlhw.c @@ -63,6 +63,11 @@ void qxlhw_update_area(struct qxlhw *base, int surface_id, struct QXLRect rect) base->update_area(base, surface_id, rect); } +void qxlhw_push_cursor(struct qxlhw *base, struct QXLCursorCmd *base_cmd) +{ + base->push_cursor(base, base_cmd); +} + /* tried to avoid this. but qxl_surface.c wants to check when failing to find * a surface in the free list, which it populates using qxl_surface_alloc (should) */ Bool qxlhw_handle_oom(struct qxlhw *base) diff --git a/src/qxlhw.h b/src/qxlhw.h index 741d951..730a623 100644 --- a/src/qxlhw.h +++ b/src/qxlhw.h @@ -21,6 +21,7 @@ struct qxlhw { void (*data_free)(struct qxlhw *base, void *p); void (*create_primary_surface)(struct qxlhw *base, QXLSurfaceCreate *create); void (*update_area)(struct qxlhw *base, int surface_id, struct QXLRect rect); + void (*push_cursor)(struct qxlhw *base, struct QXLCursorCmd *base_cmd); /* tried to avoid this. but qxl_surface.c wants to check when failing to * find a surface in the free list, which it populates using * qxl_surface_alloc (should) */ @@ -53,4 +54,7 @@ void qxlhw_data_free(struct qxlhw *base, void *p); Bool qxlhw_handle_oom(struct qxlhw *base); +/* cursor */ +void qxlhw_push_cursor(struct qxlhw *base, QXLCursorCmd *base_cmd); + #endif // QXLHW_H diff --git a/src/qxlhw_pci.c b/src/qxlhw_pci.c index ac8b6f8..d4b34c2 100644 --- a/src/qxlhw_pci.c +++ b/src/qxlhw_pci.c @@ -525,7 +525,6 @@ static void qxlhw_pci_reset(struct qxlhw *base) #endif base->qxl->mem_slots = hw->mem_slots; base->qxl->command_ring = hw->command_ring; - base->qxl->cursor_ring = hw->cursor_ring; base->qxl->release_ring = hw->release_ring; base->qxl->n_mem_slots = hw->n_mem_slots; base->qxl->slot_gen_bits = hw->slot_gen_bits; @@ -618,6 +617,37 @@ static void qxlhw_pci_update_area(struct qxlhw *base, int surface_id, struct QXL #endif } +static struct QXLCursorCmd * +qxlhw_pci_alloc_cursor_cmd(struct qxlhw_pci *hw, QXLCursorCmd *base) +{ + struct QXLCursorCmd *cmd = + qxlhw_pci_allocnf (hw, hw->mem, sizeof(struct QXLCursorCmd)); + + memcpy(cmd, base, sizeof(*base)); + + cmd->release_info.id = pointer_to_u64 (cmd) | 1; + + switch (cmd->type) { + case QXL_CURSOR_SET: + cmd->u.set.shape = qxlhw_physical_address (hw, (void *)cmd->u.set.shape, + hw->main_mem_slot); + break; + } + return cmd; +} + +static void qxlhw_pci_push_cursor(struct qxlhw *base, QXLCursorCmd *base_cmd) +{ + struct qxlhw_pci *hw = (struct qxlhw_pci *)base; + struct QXLCursorCmd *cursor = qxlhw_pci_alloc_cursor_cmd(hw, base_cmd); + struct QXLCommand cmd; + + cmd.type = QXL_CMD_CURSOR; + cmd.data = qxlhw_physical_address (hw, cursor, hw->main_mem_slot); + + qxl_ring_push (hw->cursor_ring, &cmd); +} + /* public entry point */ struct qxlhw *create_qxlhw_pci(qxl_screen_t *qxl, ScrnInfoPtr pScrn) { @@ -635,6 +665,7 @@ struct qxlhw *create_qxlhw_pci(qxl_screen_t *qxl, ScrnInfoPtr pScrn) base->data_free = qxlhw_pci_data_free; base->create_primary_surface = qxlhw_pci_create_primary_surface; base->update_area = qxlhw_pci_update_area; + base->push_cursor = qxlhw_pci_push_cursor; return base; } -- 1.7.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel