xref: /openbmc/qemu/include/ui/surface.h (revision 35152940b78e478b97051a799cb6275ced03192e)
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
26*1ff788dbSMarc-André Lureau     qemu_pixman_shareable share_handle;
27*1ff788dbSMarc-André Lureau     uint32_t share_handle_offset;
286d8cd7c2SMarc-André Lureau } DisplaySurface;
296d8cd7c2SMarc-André Lureau 
306d8cd7c2SMarc-André Lureau PixelFormat qemu_default_pixelformat(int bpp);
316d8cd7c2SMarc-André Lureau 
326d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_from(int width, int height,
336d8cd7c2SMarc-André Lureau                                                 pixman_format_code_t format,
346d8cd7c2SMarc-André Lureau                                                 int linesize, uint8_t *data);
356d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_pixman(pixman_image_t *image);
366d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_placeholder_surface(int w, int h,
376d8cd7c2SMarc-André Lureau                                                 const char *msg);
38*1ff788dbSMarc-André Lureau 
39*1ff788dbSMarc-André Lureau void qemu_displaysurface_set_share_handle(DisplaySurface *surface,
40*1ff788dbSMarc-André Lureau                                           qemu_pixman_shareable handle,
41*1ff788dbSMarc-André Lureau                                           uint32_t offset);
426d8cd7c2SMarc-André Lureau 
436d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface(int width, int height);
446d8cd7c2SMarc-André Lureau void qemu_free_displaysurface(DisplaySurface *surface);
456d8cd7c2SMarc-André Lureau 
surface_is_allocated(DisplaySurface * surface)46abd749b5SGerd Hoffmann static inline int surface_is_allocated(DisplaySurface *surface)
476d8cd7c2SMarc-André Lureau {
48abd749b5SGerd Hoffmann     return surface->flags & QEMU_ALLOCATED_FLAG;
496d8cd7c2SMarc-André Lureau }
506d8cd7c2SMarc-André Lureau 
surface_is_placeholder(DisplaySurface * surface)519badf12aSGerd Hoffmann static inline int surface_is_placeholder(DisplaySurface *surface)
526d8cd7c2SMarc-André Lureau {
536d8cd7c2SMarc-André Lureau     return surface->flags & QEMU_PLACEHOLDER_FLAG;
546d8cd7c2SMarc-André Lureau }
556d8cd7c2SMarc-André Lureau 
surface_stride(DisplaySurface * s)566d8cd7c2SMarc-André Lureau static inline int surface_stride(DisplaySurface *s)
576d8cd7c2SMarc-André Lureau {
586d8cd7c2SMarc-André Lureau     return pixman_image_get_stride(s->image);
596d8cd7c2SMarc-André Lureau }
606d8cd7c2SMarc-André Lureau 
surface_data(DisplaySurface * s)616d8cd7c2SMarc-André Lureau static inline void *surface_data(DisplaySurface *s)
626d8cd7c2SMarc-André Lureau {
636d8cd7c2SMarc-André Lureau     return pixman_image_get_data(s->image);
646d8cd7c2SMarc-André Lureau }
656d8cd7c2SMarc-André Lureau 
surface_width(DisplaySurface * s)666d8cd7c2SMarc-André Lureau static inline int surface_width(DisplaySurface *s)
676d8cd7c2SMarc-André Lureau {
686d8cd7c2SMarc-André Lureau     return pixman_image_get_width(s->image);
696d8cd7c2SMarc-André Lureau }
706d8cd7c2SMarc-André Lureau 
surface_height(DisplaySurface * s)716d8cd7c2SMarc-André Lureau static inline int surface_height(DisplaySurface *s)
726d8cd7c2SMarc-André Lureau {
736d8cd7c2SMarc-André Lureau     return pixman_image_get_height(s->image);
746d8cd7c2SMarc-André Lureau }
756d8cd7c2SMarc-André Lureau 
surface_format(DisplaySurface * s)766d8cd7c2SMarc-André Lureau static inline pixman_format_code_t surface_format(DisplaySurface *s)
776d8cd7c2SMarc-André Lureau {
786d8cd7c2SMarc-André Lureau     return pixman_image_get_format(s->image);
796d8cd7c2SMarc-André Lureau }
806d8cd7c2SMarc-André Lureau 
surface_bits_per_pixel(DisplaySurface * s)816d8cd7c2SMarc-André Lureau static inline int surface_bits_per_pixel(DisplaySurface *s)
826d8cd7c2SMarc-André Lureau {
836d8cd7c2SMarc-André Lureau     int bits = PIXMAN_FORMAT_BPP(surface_format(s));
846d8cd7c2SMarc-André Lureau     return bits;
856d8cd7c2SMarc-André Lureau }
866d8cd7c2SMarc-André Lureau 
surface_bytes_per_pixel(DisplaySurface * s)876d8cd7c2SMarc-André Lureau static inline int surface_bytes_per_pixel(DisplaySurface *s)
886d8cd7c2SMarc-André Lureau {
896d8cd7c2SMarc-André Lureau     int bits = PIXMAN_FORMAT_BPP(surface_format(s));
906d8cd7c2SMarc-André Lureau     return DIV_ROUND_UP(bits, 8);
916d8cd7c2SMarc-André Lureau }
926d8cd7c2SMarc-André Lureau 
936d8cd7c2SMarc-André Lureau #endif
94