mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pixman-pull-request' of https://gitlab.com/marcandre.lureau/qemu into staging
Make Pixman an optional dependency # -----BEGIN PGP SIGNATURE----- # # iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmVKDhkcHG1hcmNhbmRy # ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5f8CD/0YX5sXR3IwUfTp8B51 # iIwgOlVunzcT9oDYegIekaHdvggv3B39+gjC/khcehQ30qV6MDowj3ZagIeLavU2 # ZpHJMUkg1YRDHMiJ8aJmDhOyZHINCETWV2YoJX1ACllKOOMSXHC3mWKZd/eIqAPJ # EBMlSWBP1rRtwfaX+p1Y65XappJewzzb9SqFn8s5deowEAM3aK7xafHQOBWSVx9z # 5adhIWn3HMVnbYolVXlcHsPurfI86sqCl7QAqkFdwAvGIKghhqMT6pFfvu3BalHN # nz8GqpSvjlj/WNFABi00piXKx4kkqBJSsYMP8owZQZIeepT5RXuKAB15BA1Cc5N7 # wTkuLe7zXLUST32yAHLa2UZY8Gv/a6C+dH1EFRd7vMMczBPrzwuqzWChRTZPQaX6 # e4uhXnhuu8Io11TnkmwWeWtrLOf+6EmVOjxNwhUUXOqPXPxd7LGMh/ZIc1SuXh0a # k7khpXez4MoBWGftjCEUNlLZ13rcrqnkUWAZeOwjjaqxnYK+Lz32OGS3BtjRYvov # WgogC2c2vVHrSHxRxuytCHiM+7NY0Tf2B6PxZJKOQUtfFxvHjWkHghnJWwHH2OP/ # lMnJUU+XAaAxsiEiDN4BSd0DSA6jn6/vg8SgXXEDyIDExq5jELVMgw2q1cbQJK1s # mOgr8FZZfnxvwYIFvH7PFiDm3A== # =bLPz # -----END PGP SIGNATURE----- # gpg: Signature made Tue 07 Nov 2023 18:14:49 HKT # gpg: using RSA key 87A9BD933F87C606D276F62DDAE8E10975969CE5 # gpg: issuer "marcandre.lureau@redhat.com" # gpg: Good signature from "Marc-André Lureau <marcandre.lureau@redhat.com>" [full] # gpg: aka "Marc-André Lureau <marcandre.lureau@gmail.com>" [full] # Primary key fingerprint: 87A9 BD93 3F87 C606 D276 F62D DAE8 E109 7596 9CE5 * tag 'pixman-pull-request' of https://gitlab.com/marcandre.lureau/qemu: (25 commits) build-sys: make pixman actually optional hw/display/ati: allow compiling without PIXMAN hw/mips: FULOONG depends on VT82C686 hw/sm501: allow compiling without PIXMAN hw/arm: XLNX_VERSAL depends on XLNX_CSU_DMA arm/kconfig: XLNX_ZYNQMP_ARM depends on PIXMAN ui/dbus: do not require PIXMAN ui/gtk: -display gtk requires PIXMAN ui/spice: SPICE/QXL requires PIXMAN ui/vnc: VNC requires PIXMAN ui/gl: opengl doesn't require PIXMAN vhost-user-gpu: skip VHOST_USER_GPU_UPDATE when !PIXMAN ui/console: when PIXMAN is unavailable, don't draw placeholder msg virtio-gpu: replace PIXMAN for region/rect test qmp/hmp: disable screendump if PIXMAN is missing ui/vc: console-vc requires PIXMAN ui/console: allow to override the default VC vl: move display early init before default devices vl: simplify display_remote logic qemu-options: define -vnc only #ifdef CONFIG_VNC ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
@@ -11,6 +11,9 @@ config OPENGL
|
||||
config X11
|
||||
bool
|
||||
|
||||
config PIXMAN
|
||||
bool
|
||||
|
||||
config SPICE
|
||||
bool
|
||||
|
||||
|
||||
@@ -252,6 +252,7 @@ SRST
|
||||
|
||||
ERST
|
||||
|
||||
#ifdef CONFIG_PIXMAN
|
||||
{
|
||||
.name = "screendump",
|
||||
.args_type = "filename:F,format:-fs,device:s?,head:i?",
|
||||
@@ -267,6 +268,7 @@ SRST
|
||||
``screendump`` *filename*
|
||||
Save screen into PPM image *filename*.
|
||||
ERST
|
||||
#endif
|
||||
|
||||
{
|
||||
.name = "logfile",
|
||||
|
||||
+3
-1
@@ -450,7 +450,7 @@ config STM32F405_SOC
|
||||
|
||||
config XLNX_ZYNQMP_ARM
|
||||
bool
|
||||
default y
|
||||
default y if PIXMAN
|
||||
depends on TCG && AARCH64
|
||||
select AHCI
|
||||
select ARM_GIC
|
||||
@@ -463,6 +463,7 @@ config XLNX_ZYNQMP_ARM
|
||||
select XILINX_AXI
|
||||
select XILINX_SPIPS
|
||||
select XLNX_CSU_DMA
|
||||
select XLNX_DISPLAYPORT
|
||||
select XLNX_ZYNQMP
|
||||
select XLNX_ZDMA
|
||||
select USB_DWC3
|
||||
@@ -483,6 +484,7 @@ config XLNX_VERSAL
|
||||
select XLNX_EFUSE_VERSAL
|
||||
select XLNX_USB_SUBSYS
|
||||
select XLNX_VERSAL_TRNG
|
||||
select XLNX_CSU_DMA
|
||||
|
||||
config NPCM7XX
|
||||
bool
|
||||
|
||||
+6
-1
@@ -93,7 +93,7 @@ config VGA
|
||||
|
||||
config QXL
|
||||
bool
|
||||
depends on SPICE && PCI
|
||||
depends on SPICE && PCI && PIXMAN
|
||||
select VGA
|
||||
|
||||
config VIRTIO_GPU
|
||||
@@ -134,3 +134,8 @@ config MACFB
|
||||
bool
|
||||
select FRAMEBUFFER
|
||||
depends on NUBUS
|
||||
|
||||
config XLNX_DISPLAYPORT
|
||||
bool
|
||||
# defaults to "N", enabled by specific boards
|
||||
depends on PIXMAN
|
||||
|
||||
+14
-1
@@ -32,6 +32,12 @@
|
||||
|
||||
#define ATI_DEBUG_HW_CURSOR 0
|
||||
|
||||
#ifdef CONFIG_PIXMAN
|
||||
#define DEFAULT_X_PIXMAN 3
|
||||
#else
|
||||
#define DEFAULT_X_PIXMAN 0
|
||||
#endif
|
||||
|
||||
static const struct {
|
||||
const char *name;
|
||||
uint16_t dev_id;
|
||||
@@ -946,6 +952,12 @@ static void ati_vga_realize(PCIDevice *dev, Error **errp)
|
||||
ATIVGAState *s = ATI_VGA(dev);
|
||||
VGACommonState *vga = &s->vga;
|
||||
|
||||
#ifndef CONFIG_PIXMAN
|
||||
if (s->use_pixman != 0) {
|
||||
warn_report("x-pixman != 0, not effective without PIXMAN");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (s->model) {
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(ati_model_aliases); i++) {
|
||||
@@ -1033,7 +1045,8 @@ static Property ati_vga_properties[] = {
|
||||
DEFINE_PROP_UINT16("x-device-id", ATIVGAState, dev_id,
|
||||
PCI_DEVICE_ID_ATI_RAGE128_PF),
|
||||
DEFINE_PROP_BOOL("guest_hwcursor", ATIVGAState, cursor_guest_mode, false),
|
||||
DEFINE_PROP_UINT8("x-pixman", ATIVGAState, use_pixman, 3),
|
||||
/* this is a debug option, prefer PROP_UINT over PROP_BIT for simplicity */
|
||||
DEFINE_PROP_UINT8("x-pixman", ATIVGAState, use_pixman, DEFAULT_X_PIXMAN),
|
||||
DEFINE_PROP_END_OF_LIST()
|
||||
};
|
||||
|
||||
|
||||
+8
-2
@@ -123,6 +123,7 @@ void ati_2d_blt(ATIVGAState *s)
|
||||
src_bits, dst_bits, src_stride, dst_stride, bpp, bpp,
|
||||
src_x, src_y, dst_x, dst_y,
|
||||
s->regs.dst_width, s->regs.dst_height);
|
||||
#ifdef CONFIG_PIXMAN
|
||||
if ((s->use_pixman & BIT(1)) &&
|
||||
s->regs.dp_cntl & DST_X_LEFT_TO_RIGHT &&
|
||||
s->regs.dp_cntl & DST_Y_TOP_TO_BOTTOM) {
|
||||
@@ -147,7 +148,9 @@ void ati_2d_blt(ATIVGAState *s)
|
||||
s->regs.dst_width, s->regs.dst_height);
|
||||
}
|
||||
g_free(tmp);
|
||||
} else {
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
fallback = true;
|
||||
}
|
||||
if (fallback) {
|
||||
@@ -206,9 +209,12 @@ void ati_2d_blt(ATIVGAState *s)
|
||||
DPRINTF("pixman_fill(%p, %d, %d, %d, %d, %d, %d, %x)\n",
|
||||
dst_bits, dst_stride, bpp, dst_x, dst_y,
|
||||
s->regs.dst_width, s->regs.dst_height, filler);
|
||||
#ifdef CONFIG_PIXMAN
|
||||
if (!(s->use_pixman & BIT(0)) ||
|
||||
!pixman_fill((uint32_t *)dst_bits, dst_stride, bpp, dst_x, dst_y,
|
||||
s->regs.dst_width, s->regs.dst_height, filler)) {
|
||||
s->regs.dst_width, s->regs.dst_height, filler))
|
||||
#endif
|
||||
{
|
||||
/* fallback when pixman failed or we don't want to call it */
|
||||
unsigned int x, y, i, bypp = bpp / 8;
|
||||
unsigned int dst_pitch = dst_stride * sizeof(uint32_t);
|
||||
|
||||
@@ -58,11 +58,11 @@ if config_all_devices.has_key('CONFIG_QXL')
|
||||
endif
|
||||
|
||||
system_ss.add(when: 'CONFIG_DPCD', if_true: files('dpcd.c'))
|
||||
system_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx_dp.c'))
|
||||
system_ss.add(when: 'CONFIG_XLNX_DISPLAYPORT', if_true: files('xlnx_dp.c'))
|
||||
|
||||
system_ss.add(when: 'CONFIG_ARTIST', if_true: files('artist.c'))
|
||||
|
||||
system_ss.add(when: [pixman, 'CONFIG_ATI_VGA'], if_true: files('ati.c', 'ati_2d.c', 'ati_dbg.c'))
|
||||
system_ss.add(when: 'CONFIG_ATI_VGA', if_true: [files('ati.c', 'ati_2d.c', 'ati_dbg.c'), pixman])
|
||||
|
||||
|
||||
if config_all_devices.has_key('CONFIG_VIRTIO_GPU')
|
||||
|
||||
+32
-13
@@ -438,6 +438,12 @@
|
||||
#define SM501_HWC_WIDTH 64
|
||||
#define SM501_HWC_HEIGHT 64
|
||||
|
||||
#ifdef CONFIG_PIXMAN
|
||||
#define DEFAULT_X_PIXMAN 7
|
||||
#else
|
||||
#define DEFAULT_X_PIXMAN 0
|
||||
#endif
|
||||
|
||||
/* SM501 local memory size taken from "linux/drivers/mfd/sm501.c" */
|
||||
static const uint32_t sm501_mem_local_size[] = {
|
||||
[0] = 4 * MiB,
|
||||
@@ -730,7 +736,6 @@ static void sm501_2d_operation(SM501State *s)
|
||||
switch (cmd) {
|
||||
case 0: /* BitBlt */
|
||||
{
|
||||
static uint32_t tmp_buf[16384];
|
||||
unsigned int src_x = (s->twoD_source >> 16) & 0x01FFF;
|
||||
unsigned int src_y = s->twoD_source & 0xFFFF;
|
||||
uint32_t src_base = s->twoD_source_base & 0x03FFFFFF;
|
||||
@@ -828,9 +833,11 @@ static void sm501_2d_operation(SM501State *s)
|
||||
de = db + (width + (height - 1) * dst_pitch) * bypp;
|
||||
overlap = (db < se && sb < de);
|
||||
}
|
||||
#ifdef CONFIG_PIXMAN
|
||||
if (overlap && (s->use_pixman & BIT(2))) {
|
||||
/* pixman can't do reverse blit: copy via temporary */
|
||||
int tmp_stride = DIV_ROUND_UP(width * bypp, sizeof(uint32_t));
|
||||
static uint32_t tmp_buf[16384];
|
||||
uint32_t *tmp = tmp_buf;
|
||||
|
||||
if (tmp_stride * sizeof(uint32_t) * height > sizeof(tmp_buf)) {
|
||||
@@ -860,7 +867,9 @@ static void sm501_2d_operation(SM501State *s)
|
||||
dst_pitch * bypp / sizeof(uint32_t),
|
||||
8 * bypp, 8 * bypp, src_x, src_y,
|
||||
dst_x, dst_y, width, height);
|
||||
} else {
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
fallback = true;
|
||||
}
|
||||
if (fallback) {
|
||||
@@ -894,20 +903,23 @@ static void sm501_2d_operation(SM501State *s)
|
||||
color = cpu_to_le16(color);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PIXMAN
|
||||
if (!(s->use_pixman & BIT(0)) || (width == 1 && height == 1) ||
|
||||
!pixman_fill((uint32_t *)&s->local_mem[dst_base],
|
||||
dst_pitch * bypp / sizeof(uint32_t), 8 * bypp,
|
||||
dst_x, dst_y, width, height, color)) {
|
||||
/* fallback when pixman failed or we don't want to call it */
|
||||
uint8_t *d = s->local_mem + dst_base;
|
||||
unsigned int x, y, i;
|
||||
for (y = 0; y < height; y++) {
|
||||
i = (dst_x + (dst_y + y) * dst_pitch) * bypp;
|
||||
for (x = 0; x < width; x++, i += bypp) {
|
||||
stn_he_p(&d[i], bypp, color);
|
||||
dst_x, dst_y, width, height, color))
|
||||
#endif
|
||||
{
|
||||
/* fallback when pixman failed or we don't want to call it */
|
||||
uint8_t *d = s->local_mem + dst_base;
|
||||
unsigned int x, y, i;
|
||||
for (y = 0; y < height; y++) {
|
||||
i = (dst_x + (dst_y + y) * dst_pitch) * bypp;
|
||||
for (x = 0; x < width; x++, i += bypp) {
|
||||
stn_he_p(&d[i], bypp, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -1878,6 +1890,12 @@ static void sm501_reset(SM501State *s)
|
||||
static void sm501_init(SM501State *s, DeviceState *dev,
|
||||
uint32_t local_mem_bytes)
|
||||
{
|
||||
#ifndef CONFIG_PIXMAN
|
||||
if (s->use_pixman != 0) {
|
||||
warn_report("x-pixman != 0, not effective without PIXMAN");
|
||||
}
|
||||
#endif
|
||||
|
||||
s->local_mem_size_index = get_local_mem_size_index(local_mem_bytes);
|
||||
|
||||
/* local memory */
|
||||
@@ -2038,7 +2056,8 @@ static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
|
||||
|
||||
static Property sm501_sysbus_properties[] = {
|
||||
DEFINE_PROP_UINT32("vram-size", SM501SysBusState, vram_size, 0),
|
||||
DEFINE_PROP_UINT8("x-pixman", SM501SysBusState, state.use_pixman, 7),
|
||||
/* this a debug option, prefer PROP_UINT over PROP_BIT for simplicity */
|
||||
DEFINE_PROP_UINT8("x-pixman", SM501SysBusState, state.use_pixman, DEFAULT_X_PIXMAN),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
@@ -2126,7 +2145,7 @@ static void sm501_realize_pci(PCIDevice *dev, Error **errp)
|
||||
|
||||
static Property sm501_pci_properties[] = {
|
||||
DEFINE_PROP_UINT32("vram-size", SM501PCIState, vram_size, 64 * MiB),
|
||||
DEFINE_PROP_UINT8("x-pixman", SM501PCIState, state.use_pixman, 7),
|
||||
DEFINE_PROP_UINT8("x-pixman", SM501PCIState, state.use_pixman, DEFAULT_X_PIXMAN),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
||||
@@ -307,6 +307,7 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, VhostUserGpuMsg *msg)
|
||||
dpy_gl_update(con, m->x, m->y, m->width, m->height);
|
||||
break;
|
||||
}
|
||||
#ifdef CONFIG_PIXMAN
|
||||
case VHOST_USER_GPU_UPDATE: {
|
||||
VhostUserGpuUpdate *m = &msg->payload.update;
|
||||
|
||||
@@ -334,6 +335,7 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, VhostUserGpuMsg *msg)
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
g_warning("unhandled message %d %d", msg->request, msg->size);
|
||||
}
|
||||
|
||||
+11
-19
@@ -16,6 +16,7 @@
|
||||
#include "qemu/iov.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "ui/console.h"
|
||||
#include "ui/rect.h"
|
||||
#include "trace.h"
|
||||
#include "sysemu/dma.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
@@ -503,7 +504,7 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
|
||||
struct virtio_gpu_simple_resource *res;
|
||||
struct virtio_gpu_resource_flush rf;
|
||||
struct virtio_gpu_scanout *scanout;
|
||||
pixman_region16_t flush_region;
|
||||
QemuRect flush_rect;
|
||||
bool within_bounds = false;
|
||||
bool update_submitted = false;
|
||||
int i;
|
||||
@@ -565,34 +566,25 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
|
||||
return;
|
||||
}
|
||||
|
||||
pixman_region_init_rect(&flush_region,
|
||||
rf.r.x, rf.r.y, rf.r.width, rf.r.height);
|
||||
qemu_rect_init(&flush_rect, rf.r.x, rf.r.y, rf.r.width, rf.r.height);
|
||||
for (i = 0; i < g->parent_obj.conf.max_outputs; i++) {
|
||||
pixman_region16_t region, finalregion;
|
||||
pixman_box16_t *extents;
|
||||
QemuRect rect;
|
||||
|
||||
if (!(res->scanout_bitmask & (1 << i))) {
|
||||
continue;
|
||||
}
|
||||
scanout = &g->parent_obj.scanout[i];
|
||||
|
||||
pixman_region_init(&finalregion);
|
||||
pixman_region_init_rect(®ion, scanout->x, scanout->y,
|
||||
scanout->width, scanout->height);
|
||||
qemu_rect_init(&rect, scanout->x, scanout->y,
|
||||
scanout->width, scanout->height);
|
||||
|
||||
pixman_region_intersect(&finalregion, &flush_region, ®ion);
|
||||
pixman_region_translate(&finalregion, -scanout->x, -scanout->y);
|
||||
extents = pixman_region_extents(&finalregion);
|
||||
/* work out the area we need to update for each console */
|
||||
dpy_gfx_update(g->parent_obj.scanout[i].con,
|
||||
extents->x1, extents->y1,
|
||||
extents->x2 - extents->x1,
|
||||
extents->y2 - extents->y1);
|
||||
|
||||
pixman_region_fini(®ion);
|
||||
pixman_region_fini(&finalregion);
|
||||
if (qemu_rect_intersect(&flush_rect, &rect, &rect)) {
|
||||
qemu_rect_translate(&rect, -scanout->x, -scanout->y);
|
||||
dpy_gfx_update(g->parent_obj.scanout[i].con,
|
||||
rect.x, rect.y, rect.width, rect.height);
|
||||
}
|
||||
}
|
||||
pixman_region_fini(&flush_region);
|
||||
}
|
||||
|
||||
static void virtio_unref_resource(pixman_image_t *image, void *data)
|
||||
|
||||
@@ -33,6 +33,7 @@ config JAZZ
|
||||
config FULOONG
|
||||
bool
|
||||
select PCI_BONITO
|
||||
select VT82C686
|
||||
|
||||
config LOONGSON3V
|
||||
bool
|
||||
|
||||
@@ -462,12 +462,14 @@ struct QemuDisplay {
|
||||
DisplayType type;
|
||||
void (*early_init)(DisplayOptions *opts);
|
||||
void (*init)(DisplayState *ds, DisplayOptions *opts);
|
||||
const char *vc;
|
||||
};
|
||||
|
||||
void qemu_display_register(QemuDisplay *ui);
|
||||
bool qemu_display_find_default(DisplayOptions *opts);
|
||||
void qemu_display_early_init(DisplayOptions *opts);
|
||||
void qemu_display_init(DisplayState *ds, DisplayOptions *opts);
|
||||
const char *qemu_display_get_vc(DisplayOptions *opts);
|
||||
void qemu_display_help(void);
|
||||
|
||||
/* vnc.c */
|
||||
|
||||
@@ -0,0 +1,195 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Tiny subset of PIXMAN API commonly used by QEMU.
|
||||
*
|
||||
* Copyright 1987, 1988, 1989, 1998 The Open Group
|
||||
* Copyright 1987, 1988, 1989 Digital Equipment Corporation
|
||||
* Copyright 1999, 2004, 2008 Keith Packard
|
||||
* Copyright 2000 SuSE, Inc.
|
||||
* Copyright 2000 Keith Packard, member of The XFree86 Project, Inc.
|
||||
* Copyright 2004, 2005, 2007, 2008, 2009, 2010 Red Hat, Inc.
|
||||
* Copyright 2004 Nicholas Miell
|
||||
* Copyright 2005 Lars Knoll & Zack Rusin, Trolltech
|
||||
* Copyright 2005 Trolltech AS
|
||||
* Copyright 2007 Luca Barbato
|
||||
* Copyright 2008 Aaron Plattner, NVIDIA Corporation
|
||||
* Copyright 2008 Rodrigo Kumpera
|
||||
* Copyright 2008 André Tupinambá
|
||||
* Copyright 2008 Mozilla Corporation
|
||||
* Copyright 2008 Frederic Plourde
|
||||
* Copyright 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright 2009, 2010 Nokia Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef PIXMAN_MINIMAL_H
|
||||
#define PIXMAN_MINIMAL_H
|
||||
|
||||
#define PIXMAN_TYPE_OTHER 0
|
||||
#define PIXMAN_TYPE_ARGB 2
|
||||
#define PIXMAN_TYPE_ABGR 3
|
||||
#define PIXMAN_TYPE_BGRA 8
|
||||
#define PIXMAN_TYPE_RGBA 9
|
||||
|
||||
#define PIXMAN_FORMAT(bpp, type, a, r, g, b) (((bpp) << 24) | \
|
||||
((type) << 16) | \
|
||||
((a) << 12) | \
|
||||
((r) << 8) | \
|
||||
((g) << 4) | \
|
||||
((b)))
|
||||
|
||||
#define PIXMAN_FORMAT_RESHIFT(val, ofs, num) \
|
||||
(((val >> (ofs)) & ((1 << (num)) - 1)) << ((val >> 22) & 3))
|
||||
|
||||
#define PIXMAN_FORMAT_BPP(f) PIXMAN_FORMAT_RESHIFT(f, 24, 8)
|
||||
#define PIXMAN_FORMAT_TYPE(f) (((f) >> 16) & 0x3f)
|
||||
#define PIXMAN_FORMAT_A(f) PIXMAN_FORMAT_RESHIFT(f, 12, 4)
|
||||
#define PIXMAN_FORMAT_R(f) PIXMAN_FORMAT_RESHIFT(f, 8, 4)
|
||||
#define PIXMAN_FORMAT_G(f) PIXMAN_FORMAT_RESHIFT(f, 4, 4)
|
||||
#define PIXMAN_FORMAT_B(f) PIXMAN_FORMAT_RESHIFT(f, 0, 4)
|
||||
#define PIXMAN_FORMAT_DEPTH(f) (PIXMAN_FORMAT_A(f) + \
|
||||
PIXMAN_FORMAT_R(f) + \
|
||||
PIXMAN_FORMAT_G(f) + \
|
||||
PIXMAN_FORMAT_B(f))
|
||||
|
||||
typedef enum {
|
||||
/* 32bpp formats */
|
||||
PIXMAN_a8r8g8b8 = PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 8, 8, 8, 8),
|
||||
PIXMAN_x8r8g8b8 = PIXMAN_FORMAT(32, PIXMAN_TYPE_ARGB, 0, 8, 8, 8),
|
||||
PIXMAN_a8b8g8r8 = PIXMAN_FORMAT(32, PIXMAN_TYPE_ABGR, 8, 8, 8, 8),
|
||||
PIXMAN_x8b8g8r8 = PIXMAN_FORMAT(32, PIXMAN_TYPE_ABGR, 0, 8, 8, 8),
|
||||
PIXMAN_b8g8r8a8 = PIXMAN_FORMAT(32, PIXMAN_TYPE_BGRA, 8, 8, 8, 8),
|
||||
PIXMAN_b8g8r8x8 = PIXMAN_FORMAT(32, PIXMAN_TYPE_BGRA, 0, 8, 8, 8),
|
||||
PIXMAN_r8g8b8a8 = PIXMAN_FORMAT(32, PIXMAN_TYPE_RGBA, 8, 8, 8, 8),
|
||||
PIXMAN_r8g8b8x8 = PIXMAN_FORMAT(32, PIXMAN_TYPE_RGBA, 0, 8, 8, 8),
|
||||
/* 24bpp formats */
|
||||
PIXMAN_r8g8b8 = PIXMAN_FORMAT(24, PIXMAN_TYPE_ARGB, 0, 8, 8, 8),
|
||||
PIXMAN_b8g8r8 = PIXMAN_FORMAT(24, PIXMAN_TYPE_ABGR, 0, 8, 8, 8),
|
||||
/* 16bpp formats */
|
||||
PIXMAN_r5g6b5 = PIXMAN_FORMAT(16, PIXMAN_TYPE_ARGB, 0, 5, 6, 5),
|
||||
PIXMAN_a1r5g5b5 = PIXMAN_FORMAT(16, PIXMAN_TYPE_ARGB, 1, 5, 5, 5),
|
||||
PIXMAN_x1r5g5b5 = PIXMAN_FORMAT(16, PIXMAN_TYPE_ARGB, 0, 5, 5, 5),
|
||||
} pixman_format_code_t;
|
||||
|
||||
typedef struct pixman_image pixman_image_t;
|
||||
|
||||
typedef void (*pixman_image_destroy_func_t)(pixman_image_t *image, void *data);
|
||||
|
||||
struct pixman_image {
|
||||
int ref_count;
|
||||
pixman_format_code_t format;
|
||||
int width;
|
||||
int height;
|
||||
int stride;
|
||||
uint32_t *data;
|
||||
uint32_t *free_me;
|
||||
pixman_image_destroy_func_t destroy_func;
|
||||
void *destroy_data;
|
||||
};
|
||||
|
||||
typedef struct pixman_color {
|
||||
uint16_t red;
|
||||
uint16_t green;
|
||||
uint16_t blue;
|
||||
uint16_t alpha;
|
||||
} pixman_color_t;
|
||||
|
||||
static inline pixman_image_t *pixman_image_create_bits(pixman_format_code_t format,
|
||||
int width,
|
||||
int height,
|
||||
uint32_t *bits,
|
||||
int rowstride_bytes)
|
||||
{
|
||||
pixman_image_t *i = g_new0(pixman_image_t, 1);
|
||||
|
||||
i->width = width;
|
||||
i->height = height;
|
||||
i->stride = rowstride_bytes ?: width * DIV_ROUND_UP(PIXMAN_FORMAT_BPP(format), 8);
|
||||
i->format = format;
|
||||
if (bits) {
|
||||
i->data = bits;
|
||||
} else {
|
||||
i->free_me = i->data = g_malloc0(rowstride_bytes * height);
|
||||
}
|
||||
i->ref_count = 1;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline pixman_image_t *pixman_image_ref(pixman_image_t *i)
|
||||
{
|
||||
i->ref_count++;
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline bool pixman_image_unref(pixman_image_t *i)
|
||||
{
|
||||
i->ref_count--;
|
||||
|
||||
if (i->ref_count == 0) {
|
||||
if (i->destroy_func) {
|
||||
i->destroy_func(i, i->destroy_data);
|
||||
}
|
||||
g_free(i->free_me);
|
||||
g_free(i);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void pixman_image_set_destroy_function(pixman_image_t *i,
|
||||
pixman_image_destroy_func_t func,
|
||||
void *data)
|
||||
|
||||
{
|
||||
i->destroy_func = func;
|
||||
i->destroy_data = data;
|
||||
}
|
||||
|
||||
static inline uint32_t *pixman_image_get_data(pixman_image_t *i)
|
||||
{
|
||||
return i->data;
|
||||
}
|
||||
|
||||
static inline int pixman_image_get_height(pixman_image_t *i)
|
||||
{
|
||||
return i->height;
|
||||
}
|
||||
|
||||
static inline int pixman_image_get_width(pixman_image_t *i)
|
||||
{
|
||||
return i->width;
|
||||
}
|
||||
|
||||
static inline int pixman_image_get_stride(pixman_image_t *i)
|
||||
{
|
||||
return i->stride;
|
||||
}
|
||||
|
||||
static inline pixman_format_code_t pixman_image_get_format(pixman_image_t *i)
|
||||
{
|
||||
return i->format;
|
||||
}
|
||||
|
||||
#endif /* PIXMAN_MINIMAL_H */
|
||||
@@ -6,11 +6,11 @@
|
||||
#ifndef QEMU_PIXMAN_H
|
||||
#define QEMU_PIXMAN_H
|
||||
|
||||
/* pixman-0.16.0 headers have a redundant declaration */
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wredundant-decls"
|
||||
#ifdef CONFIG_PIXMAN
|
||||
#include <pixman.h>
|
||||
#pragma GCC diagnostic pop
|
||||
#else
|
||||
#include "pixman-minimal.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* pixman image formats are defined to be native endian,
|
||||
@@ -74,17 +74,17 @@ pixman_format_code_t qemu_default_pixman_format(int bpp, bool native_endian);
|
||||
pixman_format_code_t qemu_drm_format_to_pixman(uint32_t drm_format);
|
||||
uint32_t qemu_pixman_to_drm_format(pixman_format_code_t pixman);
|
||||
int qemu_pixman_get_type(int rshift, int gshift, int bshift);
|
||||
pixman_format_code_t qemu_pixman_get_format(PixelFormat *pf);
|
||||
bool qemu_pixman_check_format(DisplayChangeListener *dcl,
|
||||
pixman_format_code_t format);
|
||||
|
||||
#ifdef CONFIG_PIXMAN
|
||||
pixman_format_code_t qemu_pixman_get_format(PixelFormat *pf);
|
||||
pixman_image_t *qemu_pixman_linebuf_create(pixman_format_code_t format,
|
||||
int width);
|
||||
void qemu_pixman_linebuf_fill(pixman_image_t *linebuf, pixman_image_t *fb,
|
||||
int width, int x, int y);
|
||||
pixman_image_t *qemu_pixman_mirror_create(pixman_format_code_t format,
|
||||
pixman_image_t *image);
|
||||
void qemu_pixman_image_unref(pixman_image_t *image);
|
||||
|
||||
pixman_image_t *qemu_pixman_glyph_from_vgafont(int height, const uint8_t *font,
|
||||
unsigned int ch);
|
||||
@@ -93,6 +93,9 @@ void qemu_pixman_glyph_render(pixman_image_t *glyph,
|
||||
pixman_color_t *fgcol,
|
||||
pixman_color_t *bgcol,
|
||||
int x, int y, int cw, int ch);
|
||||
#endif
|
||||
|
||||
void qemu_pixman_image_unref(pixman_image_t *image);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(pixman_image_t, qemu_pixman_image_unref)
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
#ifndef QEMU_RECT_H
|
||||
#define QEMU_RECT_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct QemuRect {
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
uint16_t width;
|
||||
uint16_t height;
|
||||
} QemuRect;
|
||||
|
||||
static inline void qemu_rect_init(QemuRect *rect,
|
||||
int16_t x, int16_t y,
|
||||
uint16_t width, uint16_t height)
|
||||
{
|
||||
rect->x = x;
|
||||
rect->y = x;
|
||||
rect->width = width;
|
||||
rect->height = height;
|
||||
}
|
||||
|
||||
static inline void qemu_rect_translate(QemuRect *rect,
|
||||
int16_t dx, int16_t dy)
|
||||
{
|
||||
rect->x += dx;
|
||||
rect->y += dy;
|
||||
}
|
||||
|
||||
static inline bool qemu_rect_intersect(const QemuRect *a, const QemuRect *b,
|
||||
QemuRect *res)
|
||||
{
|
||||
int16_t x1, x2, y1, y2;
|
||||
|
||||
x1 = MAX(a->x, b->x);
|
||||
y1 = MAX(a->y, b->y);
|
||||
x2 = MIN(a->x + a->width, b->x + b->width);
|
||||
y2 = MIN(a->y + a->height, b->y + b->height);
|
||||
|
||||
if (x1 >= x2 || y1 >= y2) {
|
||||
if (res) {
|
||||
qemu_rect_init(res, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (res) {
|
||||
qemu_rect_init(res, x1, y1, x2 - x1, y2 - y1);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
+20
-5
@@ -813,10 +813,11 @@ if 'ust' in get_option('trace_backends')
|
||||
method: 'pkg-config')
|
||||
endif
|
||||
pixman = not_found
|
||||
if have_system or have_tools
|
||||
pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
|
||||
if not get_option('pixman').auto() or have_system or have_tools
|
||||
pixman = dependency('pixman-1', required: get_option('pixman'), version:'>=0.21.8',
|
||||
method: 'pkg-config')
|
||||
endif
|
||||
|
||||
zlib = dependency('zlib', required: true)
|
||||
|
||||
libaio = not_found
|
||||
@@ -1011,7 +1012,11 @@ if not get_option('spice_protocol').auto() or have_system
|
||||
method: 'pkg-config')
|
||||
endif
|
||||
spice = not_found
|
||||
if not get_option('spice').auto() or have_system
|
||||
if get_option('spice') \
|
||||
.disable_auto_if(not have_system) \
|
||||
.require(pixman.found(),
|
||||
error_message: 'cannot enable SPICE if pixman is not available') \
|
||||
.allowed()
|
||||
spice = dependency('spice-server', version: '>=0.14.0',
|
||||
required: get_option('spice'),
|
||||
method: 'pkg-config')
|
||||
@@ -1523,7 +1528,11 @@ gtkx11 = not_found
|
||||
vte = not_found
|
||||
have_gtk_clipboard = get_option('gtk_clipboard').enabled()
|
||||
|
||||
if not get_option('gtk').auto() or have_system
|
||||
if get_option('gtk') \
|
||||
.disable_auto_if(not have_system) \
|
||||
.require(pixman.found(),
|
||||
error_message: 'cannot enable GTK if pixman is not available') \
|
||||
.allowed()
|
||||
gtk = dependency('gtk+-3.0', version: '>=3.22.0',
|
||||
method: 'pkg-config',
|
||||
required: get_option('gtk'))
|
||||
@@ -1556,7 +1565,11 @@ endif
|
||||
vnc = not_found
|
||||
jpeg = not_found
|
||||
sasl = not_found
|
||||
if get_option('vnc').allowed() and have_system
|
||||
if get_option('vnc') \
|
||||
.disable_auto_if(not have_system) \
|
||||
.require(pixman.found(),
|
||||
error_message: 'cannot enable VNC if pixman is not available') \
|
||||
.allowed()
|
||||
vnc = declare_dependency() # dummy dependency
|
||||
jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
|
||||
method: 'pkg-config')
|
||||
@@ -2149,6 +2162,7 @@ config_host_data.set('CONFIG_SECCOMP', seccomp.found())
|
||||
if seccomp.found()
|
||||
config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
|
||||
endif
|
||||
config_host_data.set('CONFIG_PIXMAN', pixman.found())
|
||||
config_host_data.set('CONFIG_SNAPPY', snappy.found())
|
||||
config_host_data.set('CONFIG_SOLARIS', targetos == 'sunos')
|
||||
if get_option('tcg').allowed()
|
||||
@@ -2868,6 +2882,7 @@ have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
|
||||
host_kconfig = \
|
||||
(get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
|
||||
(have_tpm ? ['CONFIG_TPM=y'] : []) + \
|
||||
(pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
|
||||
(spice.found() ? ['CONFIG_SPICE=y'] : []) + \
|
||||
(have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
|
||||
(opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
|
||||
|
||||
@@ -226,6 +226,8 @@ option('l2tpv3', type : 'feature', value : 'auto',
|
||||
description: 'l2tpv3 network backend support')
|
||||
option('netmap', type : 'feature', value : 'auto',
|
||||
description: 'netmap network backend support')
|
||||
option('pixman', type : 'feature', value : 'auto',
|
||||
description: 'pixman support')
|
||||
option('slirp', type: 'feature', value: 'auto',
|
||||
description: 'libslirp user mode network backend support')
|
||||
option('vde', type : 'feature', value : 'auto',
|
||||
|
||||
+2
-1
@@ -200,7 +200,8 @@
|
||||
{ 'command': 'screendump',
|
||||
'data': {'filename': 'str', '*device': 'str', '*head': 'int',
|
||||
'*format': 'ImageFormat'},
|
||||
'coroutine': true }
|
||||
'coroutine': true,
|
||||
'if': 'CONFIG_PIXMAN' }
|
||||
|
||||
##
|
||||
# == Spice
|
||||
|
||||
@@ -2428,8 +2428,10 @@ SRST
|
||||
OBP.
|
||||
ERST
|
||||
|
||||
#ifdef CONFIG_VNC
|
||||
DEF("vnc", HAS_ARG, QEMU_OPTION_vnc ,
|
||||
"-vnc <display> shorthand for -display vnc=<display>\n", QEMU_ARCH_ALL)
|
||||
#endif
|
||||
SRST
|
||||
``-vnc display[,option[,option[,...]]]``
|
||||
Normally, if QEMU is compiled with graphical window support, it
|
||||
|
||||
@@ -160,6 +160,7 @@ meson_options_help() {
|
||||
printf "%s\n" ' pa PulseAudio sound support'
|
||||
printf "%s\n" ' parallels parallels image format support'
|
||||
printf "%s\n" ' pipewire PipeWire sound support'
|
||||
printf "%s\n" ' pixman pixman support'
|
||||
printf "%s\n" ' plugins TCG plugins via shared library loading'
|
||||
printf "%s\n" ' png PNG support with libpng'
|
||||
printf "%s\n" ' pvrdma Enable PVRDMA support'
|
||||
@@ -419,6 +420,8 @@ _meson_option_parse() {
|
||||
--disable-parallels) printf "%s" -Dparallels=disabled ;;
|
||||
--enable-pipewire) printf "%s" -Dpipewire=enabled ;;
|
||||
--disable-pipewire) printf "%s" -Dpipewire=disabled ;;
|
||||
--enable-pixman) printf "%s" -Dpixman=enabled ;;
|
||||
--disable-pixman) printf "%s" -Dpixman=disabled ;;
|
||||
--with-pkgversion=*) quote_sh "-Dpkgversion=$2" ;;
|
||||
--enable-plugins) printf "%s" -Dplugins=true ;;
|
||||
--disable-plugins) printf "%s" -Dplugins=false ;;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user