|
|
1.1 root 1: /*
2: * Copyright (C) 2010 Red Hat, Inc.
3: *
4: * This program is free software; you can redistribute it and/or
5: * modify it under the terms of the GNU General Public License as
6: * published by the Free Software Foundation; either version 2 or
7: * (at your option) version 3 of the License.
8: *
9: * This program is distributed in the hope that it will be useful,
10: * but WITHOUT ANY WARRANTY; without even the implied warranty of
11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12: * GNU General Public License for more details.
13: *
14: * You should have received a copy of the GNU General Public License
15: * along with this program; if not, see <http://www.gnu.org/licenses/>.
16: */
17:
18: #include <spice/ipc_ring.h>
19: #include <spice/enums.h>
20: #include <spice/qxl_dev.h>
21:
1.1.1.2 root 22: #include "qemu-thread.h"
23: #include "console.h"
1.1 root 24: #include "pflib.h"
1.1.1.3 root 25: #include "sysemu.h"
1.1 root 26:
27: #define NUM_MEMSLOTS 8
28: #define MEMSLOT_GENERATION_BITS 8
29: #define MEMSLOT_SLOT_BITS 8
30:
31: #define MEMSLOT_GROUP_HOST 0
32: #define MEMSLOT_GROUP_GUEST 1
33: #define NUM_MEMSLOTS_GROUPS 2
34:
35: #define NUM_SURFACES 1024
36:
1.1.1.3 root 37: /*
38: * Internal enum to differenciate between options for
39: * io calls that have a sync (old) version and an _async (new)
40: * version:
41: * QXL_SYNC: use the old version
42: * QXL_ASYNC: use the new version and make sure there are no two
43: * happening at the same time. This is used for guest initiated
44: * calls
45: */
46: typedef enum qxl_async_io {
47: QXL_SYNC,
48: QXL_ASYNC,
49: } qxl_async_io;
50:
1.1.1.4 ! root 51: enum {
! 52: QXL_COOKIE_TYPE_IO,
! 53: QXL_COOKIE_TYPE_RENDER_UPDATE_AREA,
! 54: };
! 55:
! 56: typedef struct QXLCookie {
! 57: int type;
! 58: uint64_t io;
! 59: union {
! 60: uint32_t surface_id;
! 61: QXLRect area;
! 62: struct {
! 63: QXLRect area;
! 64: int redraw;
! 65: } render;
! 66: } u;
! 67: } QXLCookie;
! 68:
! 69: QXLCookie *qxl_cookie_new(int type, uint64_t io);
! 70:
1.1.1.2 root 71: typedef struct SimpleSpiceDisplay SimpleSpiceDisplay;
72: typedef struct SimpleSpiceUpdate SimpleSpiceUpdate;
73:
74: struct SimpleSpiceDisplay {
1.1 root 75: DisplayState *ds;
76: void *buf;
77: int bufsize;
78: QXLWorker *worker;
79: QXLInstance qxl;
80: uint32_t unique;
81: QemuPfConv *conv;
82:
83: QXLRect dirty;
84: int notify;
85: int running;
86:
1.1.1.2 root 87: /*
88: * All struct members below this comment can be accessed from
89: * both spice server and qemu (iothread) context and any access
90: * to them must be protected by the lock.
91: */
92: QemuMutex lock;
93: SimpleSpiceUpdate *update;
94: QEMUCursor *cursor;
95: int mouse_x, mouse_y;
96: };
97:
98: struct SimpleSpiceUpdate {
1.1 root 99: QXLDrawable drawable;
100: QXLImage image;
101: QXLCommandExt ext;
102: uint8_t *bitmap;
1.1.1.2 root 103: };
1.1 root 104:
105: int qemu_spice_rect_is_empty(const QXLRect* r);
106: void qemu_spice_rect_union(QXLRect *dest, const QXLRect *r);
107:
108: void qemu_spice_destroy_update(SimpleSpiceDisplay *sdpy, SimpleSpiceUpdate *update);
109: void qemu_spice_create_host_memslot(SimpleSpiceDisplay *ssd);
110: void qemu_spice_create_host_primary(SimpleSpiceDisplay *ssd);
111: void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd);
1.1.1.3 root 112: void qemu_spice_vm_change_state_handler(void *opaque, int running,
113: RunState state);
114: void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds);
1.1 root 115:
116: void qemu_spice_display_update(SimpleSpiceDisplay *ssd,
117: int x, int y, int w, int h);
118: void qemu_spice_display_resize(SimpleSpiceDisplay *ssd);
119: void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd);
1.1.1.4 ! root 120: void qemu_spice_cursor_refresh_unlocked(SimpleSpiceDisplay *ssd);
1.1.1.3 root 121:
122: void qemu_spice_add_memslot(SimpleSpiceDisplay *ssd, QXLDevMemSlot *memslot,
123: qxl_async_io async);
124: void qemu_spice_del_memslot(SimpleSpiceDisplay *ssd, uint32_t gid,
125: uint32_t sid);
126: void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id,
127: QXLDevSurfaceCreate *surface,
128: qxl_async_io async);
129: void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd,
130: uint32_t id, qxl_async_io async);
131: void qemu_spice_wakeup(SimpleSpiceDisplay *ssd);
132: void qemu_spice_start(SimpleSpiceDisplay *ssd);
133: void qemu_spice_stop(SimpleSpiceDisplay *ssd);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.