 a19cbfb346
			
		
	
	
		a19cbfb346
		
	
	
	
	
		
			
			qxl is a paravirtual graphics card. The qxl device is the bridge between the guest and the spice server (aka libspice-server). The spice server will send the rendering commands to the spice client, which will actually render them. The spice server is also able to render locally, which is done in case the guest wants read something from video memory. Local rendering is also used to support display over vnc and sdl. qxl is activated using "-vga qxl". qxl supports multihead, additional cards can be added via '-device qxl". [ v2: add copyright to files ] [ v2: use qemu-common.h for standard includes ] [ v2: create separate qxl-vga device for primary ] Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
		
			
				
	
	
		
			113 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "qemu-common.h"
 | |
| 
 | |
| #include "console.h"
 | |
| #include "hw.h"
 | |
| #include "pci.h"
 | |
| #include "vga_int.h"
 | |
| 
 | |
| #include "ui/qemu-spice.h"
 | |
| #include "ui/spice-display.h"
 | |
| 
 | |
| enum qxl_mode {
 | |
|     QXL_MODE_UNDEFINED,
 | |
|     QXL_MODE_VGA,
 | |
|     QXL_MODE_COMPAT, /* spice 0.4.x */
 | |
|     QXL_MODE_NATIVE,
 | |
| };
 | |
| 
 | |
| typedef struct PCIQXLDevice {
 | |
|     PCIDevice          pci;
 | |
|     SimpleSpiceDisplay ssd;
 | |
|     int                id;
 | |
|     uint32_t           debug;
 | |
|     uint32_t           guestdebug;
 | |
|     uint32_t           cmdlog;
 | |
|     enum qxl_mode      mode;
 | |
|     uint32_t           cmdflags;
 | |
|     int                generation;
 | |
|     uint32_t           revision;
 | |
| 
 | |
|     int32_t            num_memslots;
 | |
|     int32_t            num_surfaces;
 | |
| 
 | |
|     struct guest_slots {
 | |
|         QXLMemSlot     slot;
 | |
|         void           *ptr;
 | |
|         uint64_t       size;
 | |
|         uint64_t       delta;
 | |
|         uint32_t       active;
 | |
|     } guest_slots[NUM_MEMSLOTS];
 | |
| 
 | |
|     struct guest_primary {
 | |
|         QXLSurfaceCreate surface;
 | |
|         uint32_t       commands;
 | |
|         uint32_t       resized;
 | |
|         int32_t        stride;
 | |
|         uint32_t       bits_pp;
 | |
|         uint32_t       bytes_pp;
 | |
|         uint8_t        *data, *flipped;
 | |
|     } guest_primary;
 | |
| 
 | |
|     struct surfaces {
 | |
|         QXLPHYSICAL    cmds[NUM_SURFACES];
 | |
|         uint32_t       count;
 | |
|         uint32_t       max;
 | |
|     } guest_surfaces;
 | |
|     QXLPHYSICAL        guest_cursor;
 | |
| 
 | |
|     /* thread signaling */
 | |
|     pthread_t          main;
 | |
|     int                pipe[2];
 | |
| 
 | |
|     /* ram pci bar */
 | |
|     QXLRam             *ram;
 | |
|     VGACommonState     vga;
 | |
|     uint32_t           num_free_res;
 | |
|     QXLReleaseInfo     *last_release;
 | |
|     uint32_t           last_release_offset;
 | |
|     uint32_t           oom_running;
 | |
| 
 | |
|     /* rom pci bar */
 | |
|     QXLRom             shadow_rom;
 | |
|     QXLRom             *rom;
 | |
|     QXLModes           *modes;
 | |
|     uint32_t           rom_size;
 | |
|     uint64_t           rom_offset;
 | |
| 
 | |
|     /* vram pci bar */
 | |
|     uint32_t           vram_size;
 | |
|     uint64_t           vram_offset;
 | |
| 
 | |
|     /* io bar */
 | |
|     uint32_t           io_base;
 | |
| 
 | |
|     /* spice 0.4 loadvm compatibility */
 | |
|     void               *worker_data;
 | |
|     uint32_t           worker_data_size;
 | |
| } PCIQXLDevice;
 | |
| 
 | |
| #define PANIC_ON(x) if ((x)) {                         \
 | |
|     printf("%s: PANIC %s failed\n", __FUNCTION__, #x); \
 | |
|     exit(-1);                                          \
 | |
| }
 | |
| 
 | |
| #define dprint(_qxl, _level, _fmt, ...)                                 \
 | |
|     do {                                                                \
 | |
|         if (_qxl->debug >= _level) {                                    \
 | |
|             fprintf(stderr, "qxl-%d: ", _qxl->id);                      \
 | |
|             fprintf(stderr, _fmt, ## __VA_ARGS__);                      \
 | |
|         }                                                               \
 | |
|     } while (0)
 | |
| 
 | |
| /* qxl.c */
 | |
| void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id);
 | |
| 
 | |
| /* qxl-logger.c */
 | |
| void qxl_log_cmd_cursor(PCIQXLDevice *qxl, QXLCursorCmd *cmd, int group_id);
 | |
| void qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext);
 | |
| 
 | |
| /* qxl-render.c */
 | |
| void qxl_render_resize(PCIQXLDevice *qxl);
 | |
| void qxl_render_update(PCIQXLDevice *qxl);
 | |
| void qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext);
 |