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 266d8cd7c2SMarc-André Lureau #ifdef WIN32 276d8cd7c2SMarc-André Lureau HANDLE handle; 286d8cd7c2SMarc-André Lureau uint32_t handle_offset; 296d8cd7c2SMarc-André Lureau #endif 306d8cd7c2SMarc-André Lureau } DisplaySurface; 316d8cd7c2SMarc-André Lureau 326d8cd7c2SMarc-André Lureau PixelFormat qemu_default_pixelformat(int bpp); 336d8cd7c2SMarc-André Lureau 346d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_from(int width, int height, 356d8cd7c2SMarc-André Lureau pixman_format_code_t format, 366d8cd7c2SMarc-André Lureau int linesize, uint8_t *data); 376d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_pixman(pixman_image_t *image); 386d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_placeholder_surface(int w, int h, 396d8cd7c2SMarc-André Lureau const char *msg); 406d8cd7c2SMarc-André Lureau #ifdef WIN32 416d8cd7c2SMarc-André Lureau void qemu_displaysurface_win32_set_handle(DisplaySurface *surface, 426d8cd7c2SMarc-André Lureau HANDLE h, uint32_t offset); 436d8cd7c2SMarc-André Lureau #endif 446d8cd7c2SMarc-André Lureau 456d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface(int width, int height); 466d8cd7c2SMarc-André Lureau void qemu_free_displaysurface(DisplaySurface *surface); 476d8cd7c2SMarc-André Lureau 486d8cd7c2SMarc-André Lureau static inline int is_buffer_shared(DisplaySurface *surface) 496d8cd7c2SMarc-André Lureau { 506d8cd7c2SMarc-André Lureau return !(surface->flags & QEMU_ALLOCATED_FLAG); 516d8cd7c2SMarc-André Lureau } 526d8cd7c2SMarc-André Lureau 53*9badf12aSGerd Hoffmann static inline int surface_is_placeholder(DisplaySurface *surface) 546d8cd7c2SMarc-André Lureau { 556d8cd7c2SMarc-André Lureau return surface->flags & QEMU_PLACEHOLDER_FLAG; 566d8cd7c2SMarc-André Lureau } 576d8cd7c2SMarc-André Lureau 586d8cd7c2SMarc-André Lureau static inline int surface_stride(DisplaySurface *s) 596d8cd7c2SMarc-André Lureau { 606d8cd7c2SMarc-André Lureau return pixman_image_get_stride(s->image); 616d8cd7c2SMarc-André Lureau } 626d8cd7c2SMarc-André Lureau 636d8cd7c2SMarc-André Lureau static inline void *surface_data(DisplaySurface *s) 646d8cd7c2SMarc-André Lureau { 656d8cd7c2SMarc-André Lureau return pixman_image_get_data(s->image); 666d8cd7c2SMarc-André Lureau } 676d8cd7c2SMarc-André Lureau 686d8cd7c2SMarc-André Lureau static inline int surface_width(DisplaySurface *s) 696d8cd7c2SMarc-André Lureau { 706d8cd7c2SMarc-André Lureau return pixman_image_get_width(s->image); 716d8cd7c2SMarc-André Lureau } 726d8cd7c2SMarc-André Lureau 736d8cd7c2SMarc-André Lureau static inline int surface_height(DisplaySurface *s) 746d8cd7c2SMarc-André Lureau { 756d8cd7c2SMarc-André Lureau return pixman_image_get_height(s->image); 766d8cd7c2SMarc-André Lureau } 776d8cd7c2SMarc-André Lureau 786d8cd7c2SMarc-André Lureau static inline pixman_format_code_t surface_format(DisplaySurface *s) 796d8cd7c2SMarc-André Lureau { 806d8cd7c2SMarc-André Lureau return pixman_image_get_format(s->image); 816d8cd7c2SMarc-André Lureau } 826d8cd7c2SMarc-André Lureau 836d8cd7c2SMarc-André Lureau static inline int surface_bits_per_pixel(DisplaySurface *s) 846d8cd7c2SMarc-André Lureau { 856d8cd7c2SMarc-André Lureau int bits = PIXMAN_FORMAT_BPP(surface_format(s)); 866d8cd7c2SMarc-André Lureau return bits; 876d8cd7c2SMarc-André Lureau } 886d8cd7c2SMarc-André Lureau 896d8cd7c2SMarc-André Lureau static inline int surface_bytes_per_pixel(DisplaySurface *s) 906d8cd7c2SMarc-André Lureau { 916d8cd7c2SMarc-André Lureau int bits = PIXMAN_FORMAT_BPP(surface_format(s)); 926d8cd7c2SMarc-André Lureau return DIV_ROUND_UP(bits, 8); 936d8cd7c2SMarc-André Lureau } 946d8cd7c2SMarc-André Lureau 956d8cd7c2SMarc-André Lureau #endif 96