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