ui: add egl-headless support on win32

Make GBM optional for EGL code, and enable the build for win32.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20230606115658.677673-13-marcandre.lureau@redhat.com>
This commit is contained in:
Marc-André Lureau 2023-06-06 15:56:49 +04:00
parent 48dddba176
commit 39324b4966
5 changed files with 55 additions and 21 deletions

View File

@ -36,11 +36,12 @@ void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip);
void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip,
int x, int y, double scale_x, double scale_y); int x, int y, double scale_x, double scale_y);
extern EGLContext qemu_egl_rn_ctx;
#ifdef CONFIG_GBM #ifdef CONFIG_GBM
extern int qemu_egl_rn_fd; extern int qemu_egl_rn_fd;
extern struct gbm_device *qemu_egl_rn_gbm_dev; extern struct gbm_device *qemu_egl_rn_gbm_dev;
extern EGLContext qemu_egl_rn_ctx;
int egl_rendernode_init(const char *rendernode, DisplayGLMode mode); int egl_rendernode_init(const char *rendernode, DisplayGLMode mode);
int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc, int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc,
@ -62,6 +63,10 @@ int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy, DisplayGLMode mode);
#endif #endif
#ifdef WIN32
int qemu_egl_init_dpy_win32(EGLNativeDisplayType dpy, DisplayGLMode mode);
#endif
EGLContext qemu_egl_init_ctx(void); EGLContext qemu_egl_init_ctx(void);
bool qemu_egl_has_dmabuf(void); bool qemu_egl_has_dmabuf(void);

View File

@ -1484,8 +1484,7 @@
{ 'name': 'none' }, { 'name': 'none' },
{ 'name': 'gtk', 'if': 'CONFIG_GTK' }, { 'name': 'gtk', 'if': 'CONFIG_GTK' },
{ 'name': 'sdl', 'if': 'CONFIG_SDL' }, { 'name': 'sdl', 'if': 'CONFIG_SDL' },
{ 'name': 'egl-headless', { 'name': 'egl-headless', 'if': 'CONFIG_OPENGL' },
'if': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } },
{ 'name': 'curses', 'if': 'CONFIG_CURSES' }, { 'name': 'curses', 'if': 'CONFIG_CURSES' },
{ 'name': 'cocoa', 'if': 'CONFIG_COCOA' }, { 'name': 'cocoa', 'if': 'CONFIG_COCOA' },
{ 'name': 'spice-app', 'if': 'CONFIG_SPICE' }, { 'name': 'spice-app', 'if': 'CONFIG_SPICE' },
@ -1525,7 +1524,7 @@
'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' }, 'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' },
'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' }, 'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' },
'egl-headless': { 'type': 'DisplayEGLHeadless', 'egl-headless': { 'type': 'DisplayEGLHeadless',
'if': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } }, 'if': 'CONFIG_OPENGL' },
'dbus': { 'type': 'DisplayDBus', 'if': 'CONFIG_DBUS_DISPLAY' }, 'dbus': { 'type': 'DisplayDBus', 'if': 'CONFIG_DBUS_DISPLAY' },
'sdl': { 'type': 'DisplaySDL', 'if': 'CONFIG_SDL' } 'sdl': { 'type': 'DisplaySDL', 'if': 'CONFIG_SDL' }
} }

View File

@ -79,6 +79,8 @@ static void egl_scanout_texture(DisplayChangeListener *dcl,
} }
} }
#ifdef CONFIG_GBM
static void egl_scanout_dmabuf(DisplayChangeListener *dcl, static void egl_scanout_dmabuf(DisplayChangeListener *dcl,
QemuDmaBuf *dmabuf) QemuDmaBuf *dmabuf)
{ {
@ -110,6 +112,14 @@ static void egl_cursor_dmabuf(DisplayChangeListener *dcl,
} }
} }
static void egl_release_dmabuf(DisplayChangeListener *dcl,
QemuDmaBuf *dmabuf)
{
egl_dmabuf_release_texture(dmabuf);
}
#endif
static void egl_cursor_position(DisplayChangeListener *dcl, static void egl_cursor_position(DisplayChangeListener *dcl,
uint32_t pos_x, uint32_t pos_y) uint32_t pos_x, uint32_t pos_y)
{ {
@ -119,12 +129,6 @@ static void egl_cursor_position(DisplayChangeListener *dcl,
edpy->pos_y = pos_y; edpy->pos_y = pos_y;
} }
static void egl_release_dmabuf(DisplayChangeListener *dcl,
QemuDmaBuf *dmabuf)
{
egl_dmabuf_release_texture(dmabuf);
}
static void egl_scanout_flush(DisplayChangeListener *dcl, static void egl_scanout_flush(DisplayChangeListener *dcl,
uint32_t x, uint32_t y, uint32_t x, uint32_t y,
uint32_t w, uint32_t h) uint32_t w, uint32_t h)
@ -160,10 +164,12 @@ static const DisplayChangeListenerOps egl_ops = {
.dpy_gl_scanout_disable = egl_scanout_disable, .dpy_gl_scanout_disable = egl_scanout_disable,
.dpy_gl_scanout_texture = egl_scanout_texture, .dpy_gl_scanout_texture = egl_scanout_texture,
#ifdef CONFIG_GBM
.dpy_gl_scanout_dmabuf = egl_scanout_dmabuf, .dpy_gl_scanout_dmabuf = egl_scanout_dmabuf,
.dpy_gl_cursor_dmabuf = egl_cursor_dmabuf, .dpy_gl_cursor_dmabuf = egl_cursor_dmabuf,
.dpy_gl_cursor_position = egl_cursor_position,
.dpy_gl_release_dmabuf = egl_release_dmabuf, .dpy_gl_release_dmabuf = egl_release_dmabuf,
#endif
.dpy_gl_cursor_position = egl_cursor_position,
.dpy_gl_update = egl_scanout_flush, .dpy_gl_update = egl_scanout_flush,
}; };

View File

@ -199,11 +199,12 @@ void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip,
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
EGLContext qemu_egl_rn_ctx;
#ifdef CONFIG_GBM #ifdef CONFIG_GBM
int qemu_egl_rn_fd; int qemu_egl_rn_fd;
struct gbm_device *qemu_egl_rn_gbm_dev; struct gbm_device *qemu_egl_rn_gbm_dev;
EGLContext qemu_egl_rn_ctx;
int egl_rendernode_init(const char *rendernode, DisplayGLMode mode) int egl_rendernode_init(const char *rendernode, DisplayGLMode mode)
{ {
@ -400,7 +401,7 @@ EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, EGLNativeWindowType win)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
#if defined(CONFIG_X11) || defined(CONFIG_GBM) #if defined(CONFIG_X11) || defined(CONFIG_GBM) || defined(WIN32)
/* /*
* Taken from glamor_egl.h from the Xorg xserver, which is MIT licensed * Taken from glamor_egl.h from the Xorg xserver, which is MIT licensed
@ -508,6 +509,9 @@ static int qemu_egl_init_dpy(EGLNativeDisplayType dpy,
return 0; return 0;
} }
#endif
#if defined(CONFIG_X11) || defined(CONFIG_GBM)
int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy, DisplayGLMode mode) int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy, DisplayGLMode mode)
{ {
#ifdef EGL_KHR_platform_x11 #ifdef EGL_KHR_platform_x11
@ -525,7 +529,14 @@ int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy, DisplayGLMode mode)
return qemu_egl_init_dpy(dpy, 0, mode); return qemu_egl_init_dpy(dpy, 0, mode);
#endif #endif
} }
#endif
#ifdef WIN32
int qemu_egl_init_dpy_win32(EGLNativeDisplayType dpy, DisplayGLMode mode)
{
return qemu_egl_init_dpy(dpy, 0, mode);
}
#endif #endif
bool qemu_egl_has_dmabuf(void) bool qemu_egl_has_dmabuf(void)
@ -577,15 +588,28 @@ bool egl_init(const char *rendernode, DisplayGLMode mode, Error **errp)
return false; return false;
} }
#ifdef CONFIG_GBM #ifdef WIN32
if (qemu_egl_init_dpy_win32(EGL_DEFAULT_DISPLAY, mode) < 0) {
error_setg(errp, "egl: init failed");
return false;
}
qemu_egl_rn_ctx = qemu_egl_init_ctx();
if (!qemu_egl_rn_ctx) {
error_setg(errp, "egl: egl_init_ctx failed");
return false;
}
#elif defined(CONFIG_GBM)
if (egl_rendernode_init(rendernode, mode) < 0) { if (egl_rendernode_init(rendernode, mode) < 0) {
error_setg(errp, "egl: render node init failed"); error_setg(errp, "egl: render node init failed");
return false; return false;
} }
#endif
if (!qemu_egl_rn_ctx) {
error_setg(errp, "egl: not available on this platform");
return false;
}
display_opengl = 1; display_opengl = 1;
return true; return true;
#else
error_setg(errp, "egl: not available on this platform");
return false;
#endif
} }

View File

@ -65,10 +65,10 @@ if opengl.found()
ui_modules += {'opengl' : opengl_ss} ui_modules += {'opengl' : opengl_ss}
endif endif
if opengl.found() and gbm.found() if opengl.found()
egl_headless_ss = ss.source_set() egl_headless_ss = ss.source_set()
egl_headless_ss.add(when: [opengl, gbm, pixman], egl_headless_ss.add(when: [opengl, pixman],
if_true: files('egl-headless.c')) if_true: [files('egl-headless.c'), gbm])
ui_modules += {'egl-headless' : egl_headless_ss} ui_modules += {'egl-headless' : egl_headless_ss}
endif endif