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,
|
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);
|
||||||
|
|
||||||
|
@ -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' }
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user