xref: /qemu/include/ui/surface.h (revision 6d8cd7c2205867d70d7520c890ad19a27651bdb2)
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