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:
parent
48dddba176
commit
39324b4966
@ -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,
|
||||
int x, int y, double scale_x, double scale_y);
|
||||
|
||||
extern EGLContext qemu_egl_rn_ctx;
|
||||
|
||||
#ifdef CONFIG_GBM
|
||||
|
||||
extern int qemu_egl_rn_fd;
|
||||
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_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
|
||||
|
||||
#ifdef WIN32
|
||||
int qemu_egl_init_dpy_win32(EGLNativeDisplayType dpy, DisplayGLMode mode);
|
||||
#endif
|
||||
|
||||
EGLContext qemu_egl_init_ctx(void);
|
||||
bool qemu_egl_has_dmabuf(void);
|
||||
|
||||
|
@ -1484,8 +1484,7 @@
|
||||
{ 'name': 'none' },
|
||||
{ 'name': 'gtk', 'if': 'CONFIG_GTK' },
|
||||
{ 'name': 'sdl', 'if': 'CONFIG_SDL' },
|
||||
{ 'name': 'egl-headless',
|
||||
'if': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } },
|
||||
{ 'name': 'egl-headless', 'if': 'CONFIG_OPENGL' },
|
||||
{ 'name': 'curses', 'if': 'CONFIG_CURSES' },
|
||||
{ 'name': 'cocoa', 'if': 'CONFIG_COCOA' },
|
||||
{ 'name': 'spice-app', 'if': 'CONFIG_SPICE' },
|
||||
@ -1525,7 +1524,7 @@
|
||||
'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' },
|
||||
'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' },
|
||||
'egl-headless': { 'type': 'DisplayEGLHeadless',
|
||||
'if': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } },
|
||||
'if': 'CONFIG_OPENGL' },
|
||||
'dbus': { 'type': 'DisplayDBus', 'if': 'CONFIG_DBUS_DISPLAY' },
|
||||
'sdl': { 'type': 'DisplaySDL', 'if': 'CONFIG_SDL' }
|
||||
}
|
||||
|
@ -79,6 +79,8 @@ static void egl_scanout_texture(DisplayChangeListener *dcl,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GBM
|
||||
|
||||
static void egl_scanout_dmabuf(DisplayChangeListener *dcl,
|
||||
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,
|
||||
uint32_t pos_x, uint32_t pos_y)
|
||||
{
|
||||
@ -119,12 +129,6 @@ static void egl_cursor_position(DisplayChangeListener *dcl,
|
||||
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,
|
||||
uint32_t x, uint32_t y,
|
||||
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_texture = egl_scanout_texture,
|
||||
#ifdef CONFIG_GBM
|
||||
.dpy_gl_scanout_dmabuf = egl_scanout_dmabuf,
|
||||
.dpy_gl_cursor_dmabuf = egl_cursor_dmabuf,
|
||||
.dpy_gl_cursor_position = egl_cursor_position,
|
||||
.dpy_gl_release_dmabuf = egl_release_dmabuf,
|
||||
#endif
|
||||
.dpy_gl_cursor_position = egl_cursor_position,
|
||||
.dpy_gl_update = egl_scanout_flush,
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
||||
int qemu_egl_rn_fd;
|
||||
struct gbm_device *qemu_egl_rn_gbm_dev;
|
||||
EGLContext qemu_egl_rn_ctx;
|
||||
|
||||
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
|
||||
@ -508,6 +509,9 @@ static int qemu_egl_init_dpy(EGLNativeDisplayType dpy,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_X11) || defined(CONFIG_GBM)
|
||||
int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy, DisplayGLMode mode)
|
||||
{
|
||||
#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);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
int qemu_egl_init_dpy_win32(EGLNativeDisplayType dpy, DisplayGLMode mode)
|
||||
{
|
||||
return qemu_egl_init_dpy(dpy, 0, mode);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool qemu_egl_has_dmabuf(void)
|
||||
@ -577,15 +588,28 @@ bool egl_init(const char *rendernode, DisplayGLMode mode, Error **errp)
|
||||
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) {
|
||||
error_setg(errp, "egl: render node init failed");
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!qemu_egl_rn_ctx) {
|
||||
error_setg(errp, "egl: not available on this platform");
|
||||
return false;
|
||||
}
|
||||
|
||||
display_opengl = 1;
|
||||
return true;
|
||||
#else
|
||||
error_setg(errp, "egl: not available on this platform");
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
@ -65,10 +65,10 @@ if opengl.found()
|
||||
ui_modules += {'opengl' : opengl_ss}
|
||||
endif
|
||||
|
||||
if opengl.found() and gbm.found()
|
||||
if opengl.found()
|
||||
egl_headless_ss = ss.source_set()
|
||||
egl_headless_ss.add(when: [opengl, gbm, pixman],
|
||||
if_true: files('egl-headless.c'))
|
||||
egl_headless_ss.add(when: [opengl, pixman],
|
||||
if_true: [files('egl-headless.c'), gbm])
|
||||
ui_modules += {'egl-headless' : egl_headless_ss}
|
||||
endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user