1*6d8cd7c2SMarc-André Lureau /* 2*6d8cd7c2SMarc-André Lureau * SPDX-License-Identifier: GPL-2.0-or-later 3*6d8cd7c2SMarc-André Lureau * QEMU UI Console 4*6d8cd7c2SMarc-André Lureau */ 5*6d8cd7c2SMarc-André Lureau #ifndef SURFACE_H 6*6d8cd7c2SMarc-André Lureau #define SURFACE_H 7*6d8cd7c2SMarc-André Lureau 8*6d8cd7c2SMarc-André Lureau #include "ui/qemu-pixman.h" 9*6d8cd7c2SMarc-André Lureau 10*6d8cd7c2SMarc-André Lureau #ifdef CONFIG_OPENGL 11*6d8cd7c2SMarc-André Lureau # include <epoxy/gl.h> 12*6d8cd7c2SMarc-André Lureau # include "ui/shader.h" 13*6d8cd7c2SMarc-André Lureau #endif 14*6d8cd7c2SMarc-André Lureau 15*6d8cd7c2SMarc-André Lureau #define QEMU_ALLOCATED_FLAG 0x01 16*6d8cd7c2SMarc-André Lureau #define QEMU_PLACEHOLDER_FLAG 0x02 17*6d8cd7c2SMarc-André Lureau 18*6d8cd7c2SMarc-André Lureau typedef struct DisplaySurface { 19*6d8cd7c2SMarc-André Lureau pixman_image_t *image; 20*6d8cd7c2SMarc-André Lureau uint8_t flags; 21*6d8cd7c2SMarc-André Lureau #ifdef CONFIG_OPENGL 22*6d8cd7c2SMarc-André Lureau GLenum glformat; 23*6d8cd7c2SMarc-André Lureau GLenum gltype; 24*6d8cd7c2SMarc-André Lureau GLuint texture; 25*6d8cd7c2SMarc-André Lureau #endif 26*6d8cd7c2SMarc-André Lureau #ifdef WIN32 27*6d8cd7c2SMarc-André Lureau HANDLE handle; 28*6d8cd7c2SMarc-André Lureau uint32_t handle_offset; 29*6d8cd7c2SMarc-André Lureau #endif 30*6d8cd7c2SMarc-André Lureau } DisplaySurface; 31*6d8cd7c2SMarc-André Lureau 32*6d8cd7c2SMarc-André Lureau PixelFormat qemu_default_pixelformat(int bpp); 33*6d8cd7c2SMarc-André Lureau 34*6d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_from(int width, int height, 35*6d8cd7c2SMarc-André Lureau pixman_format_code_t format, 36*6d8cd7c2SMarc-André Lureau int linesize, uint8_t *data); 37*6d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_pixman(pixman_image_t *image); 38*6d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_placeholder_surface(int w, int h, 39*6d8cd7c2SMarc-André Lureau const char *msg); 40*6d8cd7c2SMarc-André Lureau #ifdef WIN32 41*6d8cd7c2SMarc-André Lureau void qemu_displaysurface_win32_set_handle(DisplaySurface *surface, 42*6d8cd7c2SMarc-André Lureau HANDLE h, uint32_t offset); 43*6d8cd7c2SMarc-André Lureau #endif 44*6d8cd7c2SMarc-André Lureau 45*6d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface(int width, int height); 46*6d8cd7c2SMarc-André Lureau void qemu_free_displaysurface(DisplaySurface *surface); 47*6d8cd7c2SMarc-André Lureau 48*6d8cd7c2SMarc-André Lureau static inline int is_buffer_shared(DisplaySurface *surface) 49*6d8cd7c2SMarc-André Lureau { 50*6d8cd7c2SMarc-André Lureau return !(surface->flags & QEMU_ALLOCATED_FLAG); 51*6d8cd7c2SMarc-André Lureau } 52*6d8cd7c2SMarc-André Lureau 53*6d8cd7c2SMarc-André Lureau static inline int is_placeholder(DisplaySurface *surface) 54*6d8cd7c2SMarc-André Lureau { 55*6d8cd7c2SMarc-André Lureau return surface->flags & QEMU_PLACEHOLDER_FLAG; 56*6d8cd7c2SMarc-André Lureau } 57*6d8cd7c2SMarc-André Lureau 58*6d8cd7c2SMarc-André Lureau static inline int surface_stride(DisplaySurface *s) 59*6d8cd7c2SMarc-André Lureau { 60*6d8cd7c2SMarc-André Lureau return pixman_image_get_stride(s->image); 61*6d8cd7c2SMarc-André Lureau } 62*6d8cd7c2SMarc-André Lureau 63*6d8cd7c2SMarc-André Lureau static inline void *surface_data(DisplaySurface *s) 64*6d8cd7c2SMarc-André Lureau { 65*6d8cd7c2SMarc-André Lureau return pixman_image_get_data(s->image); 66*6d8cd7c2SMarc-André Lureau } 67*6d8cd7c2SMarc-André Lureau 68*6d8cd7c2SMarc-André Lureau static inline int surface_width(DisplaySurface *s) 69*6d8cd7c2SMarc-André Lureau { 70*6d8cd7c2SMarc-André Lureau return pixman_image_get_width(s->image); 71*6d8cd7c2SMarc-André Lureau } 72*6d8cd7c2SMarc-André Lureau 73*6d8cd7c2SMarc-André Lureau static inline int surface_height(DisplaySurface *s) 74*6d8cd7c2SMarc-André Lureau { 75*6d8cd7c2SMarc-André Lureau return pixman_image_get_height(s->image); 76*6d8cd7c2SMarc-André Lureau } 77*6d8cd7c2SMarc-André Lureau 78*6d8cd7c2SMarc-André Lureau static inline pixman_format_code_t surface_format(DisplaySurface *s) 79*6d8cd7c2SMarc-André Lureau { 80*6d8cd7c2SMarc-André Lureau return pixman_image_get_format(s->image); 81*6d8cd7c2SMarc-André Lureau } 82*6d8cd7c2SMarc-André Lureau 83*6d8cd7c2SMarc-André Lureau static inline int surface_bits_per_pixel(DisplaySurface *s) 84*6d8cd7c2SMarc-André Lureau { 85*6d8cd7c2SMarc-André Lureau int bits = PIXMAN_FORMAT_BPP(surface_format(s)); 86*6d8cd7c2SMarc-André Lureau return bits; 87*6d8cd7c2SMarc-André Lureau } 88*6d8cd7c2SMarc-André Lureau 89*6d8cd7c2SMarc-André Lureau static inline int surface_bytes_per_pixel(DisplaySurface *s) 90*6d8cd7c2SMarc-André Lureau { 91*6d8cd7c2SMarc-André Lureau int bits = PIXMAN_FORMAT_BPP(surface_format(s)); 92*6d8cd7c2SMarc-André Lureau return DIV_ROUND_UP(bits, 8); 93*6d8cd7c2SMarc-André Lureau } 94*6d8cd7c2SMarc-André Lureau 95*6d8cd7c2SMarc-André Lureau #endif 96