|
@@ -12,6 +12,7 @@
|
|
|
*/
|
|
|
|
|
|
#include "qemu/osdep.h"
|
|
|
+#include "qemu/main-loop.h"
|
|
|
|
|
|
#include "trace.h"
|
|
|
|
|
@@ -94,6 +95,18 @@ void gd_egl_draw(VirtualConsole *vc)
|
|
|
}
|
|
|
|
|
|
glFlush();
|
|
|
+#ifdef CONFIG_GBM
|
|
|
+ if (vc->gfx.guest_fb.dmabuf) {
|
|
|
+ QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;
|
|
|
+
|
|
|
+ egl_dmabuf_create_fence(dmabuf);
|
|
|
+ if (dmabuf->fence_fd > 0) {
|
|
|
+ qemu_set_fd_handler(dmabuf->fence_fd, gd_hw_gl_flushed, NULL, vc);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ graphic_hw_gl_block(vc->gfx.dcl.con, false);
|
|
|
+ }
|
|
|
+#endif
|
|
|
graphic_hw_gl_flushed(vc->gfx.dcl.con);
|
|
|
}
|
|
|
|
|
@@ -209,6 +222,8 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
|
|
|
QemuDmaBuf *dmabuf)
|
|
|
{
|
|
|
#ifdef CONFIG_GBM
|
|
|
+ VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
|
|
|
+
|
|
|
egl_dmabuf_import_texture(dmabuf);
|
|
|
if (!dmabuf->texture) {
|
|
|
return;
|
|
@@ -217,6 +232,10 @@ void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
|
|
|
gd_egl_scanout_texture(dcl, dmabuf->texture,
|
|
|
false, dmabuf->width, dmabuf->height,
|
|
|
0, 0, dmabuf->width, dmabuf->height);
|
|
|
+
|
|
|
+ if (dmabuf->allow_fences) {
|
|
|
+ vc->gfx.guest_fb.dmabuf = dmabuf;
|
|
|
+ }
|
|
|
#endif
|
|
|
}
|
|
|
|
|
@@ -281,6 +300,12 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl,
|
|
|
egl_fb_blit(&vc->gfx.win_fb, &vc->gfx.guest_fb, !vc->gfx.y0_top);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_GBM
|
|
|
+ if (vc->gfx.guest_fb.dmabuf) {
|
|
|
+ egl_dmabuf_create_sync(vc->gfx.guest_fb.dmabuf);
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
eglSwapBuffers(qemu_egl_display, vc->gfx.esurface);
|
|
|
}
|
|
|
|