diff options
| author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2024-10-08 16:50:27 +0400 |
|---|---|---|
| committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2024-10-14 17:34:09 +0400 |
| commit | 1ff788db9781615be745671ebdb2eb82c137c5b8 (patch) | |
| tree | 85b092cc9ac20e344f99259a81bc2741740317f3 /ui/console.c | |
| parent | 5f899c34af1dbb0f621287faf9bcfb60fa237543 (diff) | |
| download | focaccia-qemu-1ff788db9781615be745671ebdb2eb82c137c5b8.tar.gz focaccia-qemu-1ff788db9781615be745671ebdb2eb82c137c5b8.zip | |
ui: refactor using a common qemu_pixman_shareable
Use a common shareable type for win32 & unix, and helper functions. This simplify the code as it avoids a lot of #ifdef'ery. Note: if it helps review, commits could be reordered to introduce the common type before introducing shareable memory for unix. Suggested-by: Akihiko Odaki <akihiko.odaki@daynix.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com> Message-ID: <20241008125028.1177932-19-marcandre.lureau@redhat.com>
Diffstat (limited to 'ui/console.c')
| -rw-r--r-- | ui/console.c | 80 |
1 files changed, 27 insertions, 53 deletions
diff --git a/ui/console.c b/ui/console.c index 3a2aaba3c7..5165f17125 100644 --- a/ui/console.c +++ b/ui/console.c @@ -453,61 +453,26 @@ qemu_graphic_console_init(Object *obj) { } -#ifdef WIN32 -void qemu_displaysurface_win32_set_handle(DisplaySurface *surface, - HANDLE h, uint32_t offset) +void qemu_displaysurface_set_share_handle(DisplaySurface *surface, + qemu_pixman_shareable handle, + uint32_t offset) { - assert(!surface->handle); + assert(surface->share_handle == SHAREABLE_NONE); - surface->handle = h; - surface->handle_offset = offset; -} -#else -void qemu_displaysurface_set_shmfd(DisplaySurface *surface, - int shmfd, uint32_t offset) -{ - assert(surface->shmfd == -1); + surface->share_handle = handle; + surface->share_handle_offset = offset; - surface->shmfd = shmfd; - surface->shmfd_offset = offset; } -#endif DisplaySurface *qemu_create_displaysurface(int width, int height) { - DisplaySurface *surface; - void *bits = NULL; -#ifdef WIN32 - HANDLE handle = NULL; -#else - int shmfd = -1; -#endif - trace_displaysurface_create(width, height); -#ifdef WIN32 - bits = qemu_win32_map_alloc(width * height * 4, &handle, &error_abort); -#else - bits = qemu_memfd_alloc("displaysurface", width * height * 4, 0, &shmfd, &error_abort); -#endif - - surface = qemu_create_displaysurface_from( + return qemu_create_displaysurface_from( width, height, PIXMAN_x8r8g8b8, - width * 4, bits + width * 4, NULL ); - surface->flags = QEMU_ALLOCATED_FLAG; - -#ifdef WIN32 - qemu_displaysurface_win32_set_handle(surface, handle, 0); - void *data = handle; -#else - qemu_displaysurface_set_shmfd(surface, shmfd, 0); - void *data = GINT_TO_POINTER(shmfd); -#endif - pixman_image_set_destroy_function(surface->image, qemu_pixman_shared_image_destroy, data); - - return surface; } DisplaySurface *qemu_create_displaysurface_from(int width, int height, @@ -517,14 +482,25 @@ DisplaySurface *qemu_create_displaysurface_from(int width, int height, DisplaySurface *surface = g_new0(DisplaySurface, 1); trace_displaysurface_create_from(surface, width, height, format); -#ifndef WIN32 - surface->shmfd = -1; -#endif - surface->image = pixman_image_create_bits(format, - width, height, - (void *)data, linesize); - assert(surface->image != NULL); + surface->share_handle = SHAREABLE_NONE; + if (data) { + surface->image = pixman_image_create_bits(format, + width, height, + (void *)data, linesize); + } else { + qemu_pixman_image_new_shareable(&surface->image, + &surface->share_handle, + "displaysurface", + format, + width, + height, + linesize, + &error_abort); + surface->flags = QEMU_ALLOCATED_FLAG; + } + + assert(surface->image != NULL); return surface; } @@ -533,9 +509,7 @@ DisplaySurface *qemu_create_displaysurface_pixman(pixman_image_t *image) DisplaySurface *surface = g_new0(DisplaySurface, 1); trace_displaysurface_create_pixman(surface); -#ifndef WIN32 - surface->shmfd = -1; -#endif + surface->share_handle = SHAREABLE_NONE; surface->image = pixman_image_ref(image); return surface; |