16d8cd7c2SMarc-André Lureau /* 26d8cd7c2SMarc-André Lureau * SPDX-License-Identifier: GPL-2.0-or-later 36d8cd7c2SMarc-André Lureau * QEMU UI Console 46d8cd7c2SMarc-André Lureau */ 56d8cd7c2SMarc-André Lureau #ifndef SURFACE_H 66d8cd7c2SMarc-André Lureau #define SURFACE_H 76d8cd7c2SMarc-André Lureau 86d8cd7c2SMarc-André Lureau #include "ui/qemu-pixman.h" 96d8cd7c2SMarc-André Lureau 106d8cd7c2SMarc-André Lureau #ifdef CONFIG_OPENGL 116d8cd7c2SMarc-André Lureau # include <epoxy/gl.h> 126d8cd7c2SMarc-André Lureau # include "ui/shader.h" 136d8cd7c2SMarc-André Lureau #endif 146d8cd7c2SMarc-André Lureau 156d8cd7c2SMarc-André Lureau #define QEMU_ALLOCATED_FLAG 0x01 166d8cd7c2SMarc-André Lureau #define QEMU_PLACEHOLDER_FLAG 0x02 176d8cd7c2SMarc-André Lureau 186d8cd7c2SMarc-André Lureau typedef struct DisplaySurface { 196d8cd7c2SMarc-André Lureau pixman_image_t *image; 206d8cd7c2SMarc-André Lureau uint8_t flags; 216d8cd7c2SMarc-André Lureau #ifdef CONFIG_OPENGL 226d8cd7c2SMarc-André Lureau GLenum glformat; 236d8cd7c2SMarc-André Lureau GLenum gltype; 246d8cd7c2SMarc-André Lureau GLuint texture; 256d8cd7c2SMarc-André Lureau #endif 26*1ff788dbSMarc-André Lureau qemu_pixman_shareable share_handle; 27*1ff788dbSMarc-André Lureau uint32_t share_handle_offset; 286d8cd7c2SMarc-André Lureau } DisplaySurface; 296d8cd7c2SMarc-André Lureau 306d8cd7c2SMarc-André Lureau PixelFormat qemu_default_pixelformat(int bpp); 316d8cd7c2SMarc-André Lureau 326d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_from(int width, int height, 336d8cd7c2SMarc-André Lureau pixman_format_code_t format, 346d8cd7c2SMarc-André Lureau int linesize, uint8_t *data); 356d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_pixman(pixman_image_t *image); 366d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_placeholder_surface(int w, int h, 376d8cd7c2SMarc-André Lureau const char *msg); 38*1ff788dbSMarc-André Lureau 39*1ff788dbSMarc-André Lureau void qemu_displaysurface_set_share_handle(DisplaySurface *surface, 40*1ff788dbSMarc-André Lureau qemu_pixman_shareable handle, 41*1ff788dbSMarc-André Lureau uint32_t offset); 426d8cd7c2SMarc-André Lureau 436d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface(int width, int height); 446d8cd7c2SMarc-André Lureau void qemu_free_displaysurface(DisplaySurface *surface); 456d8cd7c2SMarc-André Lureau 46abd749b5SGerd Hoffmann static inline int surface_is_allocated(DisplaySurface *surface) 476d8cd7c2SMarc-André Lureau { 48abd749b5SGerd Hoffmann return surface->flags & QEMU_ALLOCATED_FLAG; 496d8cd7c2SMarc-André Lureau } 506d8cd7c2SMarc-André Lureau 519badf12aSGerd Hoffmann static inline int surface_is_placeholder(DisplaySurface *surface) 526d8cd7c2SMarc-André Lureau { 536d8cd7c2SMarc-André Lureau return surface->flags & QEMU_PLACEHOLDER_FLAG; 546d8cd7c2SMarc-André Lureau } 556d8cd7c2SMarc-André Lureau 566d8cd7c2SMarc-André Lureau static inline int surface_stride(DisplaySurface *s) 576d8cd7c2SMarc-André Lureau { 586d8cd7c2SMarc-André Lureau return pixman_image_get_stride(s->image); 596d8cd7c2SMarc-André Lureau } 606d8cd7c2SMarc-André Lureau 616d8cd7c2SMarc-André Lureau static inline void *surface_data(DisplaySurface *s) 626d8cd7c2SMarc-André Lureau { 636d8cd7c2SMarc-André Lureau return pixman_image_get_data(s->image); 646d8cd7c2SMarc-André Lureau } 656d8cd7c2SMarc-André Lureau 666d8cd7c2SMarc-André Lureau static inline int surface_width(DisplaySurface *s) 676d8cd7c2SMarc-André Lureau { 686d8cd7c2SMarc-André Lureau return pixman_image_get_width(s->image); 696d8cd7c2SMarc-André Lureau } 706d8cd7c2SMarc-André Lureau 716d8cd7c2SMarc-André Lureau static inline int surface_height(DisplaySurface *s) 726d8cd7c2SMarc-André Lureau { 736d8cd7c2SMarc-André Lureau return pixman_image_get_height(s->image); 746d8cd7c2SMarc-André Lureau } 756d8cd7c2SMarc-André Lureau 766d8cd7c2SMarc-André Lureau static inline pixman_format_code_t surface_format(DisplaySurface *s) 776d8cd7c2SMarc-André Lureau { 786d8cd7c2SMarc-André Lureau return pixman_image_get_format(s->image); 796d8cd7c2SMarc-André Lureau } 806d8cd7c2SMarc-André Lureau 816d8cd7c2SMarc-André Lureau static inline int surface_bits_per_pixel(DisplaySurface *s) 826d8cd7c2SMarc-André Lureau { 836d8cd7c2SMarc-André Lureau int bits = PIXMAN_FORMAT_BPP(surface_format(s)); 846d8cd7c2SMarc-André Lureau return bits; 856d8cd7c2SMarc-André Lureau } 866d8cd7c2SMarc-André Lureau 876d8cd7c2SMarc-André Lureau static inline int surface_bytes_per_pixel(DisplaySurface *s) 886d8cd7c2SMarc-André Lureau { 896d8cd7c2SMarc-André Lureau int bits = PIXMAN_FORMAT_BPP(surface_format(s)); 906d8cd7c2SMarc-André Lureau return DIV_ROUND_UP(bits, 8); 916d8cd7c2SMarc-André Lureau } 926d8cd7c2SMarc-André Lureau 936d8cd7c2SMarc-André Lureau #endif 94