xref: /openbmc/qemu/include/ui/surface.h (revision abd749b5)
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 
surface_is_allocated(DisplaySurface * surface)48*abd749b5SGerd Hoffmann static inline int surface_is_allocated(DisplaySurface *surface)
496d8cd7c2SMarc-André Lureau {
50*abd749b5SGerd Hoffmann     return surface->flags & QEMU_ALLOCATED_FLAG;
516d8cd7c2SMarc-André Lureau }
526d8cd7c2SMarc-André Lureau 
surface_is_placeholder(DisplaySurface * surface)539badf12aSGerd 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 
surface_stride(DisplaySurface * s)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 
surface_data(DisplaySurface * s)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 
surface_width(DisplaySurface * s)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 
surface_height(DisplaySurface * s)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 
surface_format(DisplaySurface * s)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 
surface_bits_per_pixel(DisplaySurface * s)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 
surface_bytes_per_pixel(DisplaySurface * s)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