mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
ui: Create sync objects and fences only for blobs
Create sync objects and fences only for dmabufs that are blobs. Once a fence is created (after glFlush) and is signalled, graphic_hw_gl_flushed() will be called and virtio-gpu cmd processing will be resumed. Cc: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Message-Id: <20210914211837.3229977-4-vivek.kasireddy@intel.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
121abaf3e6
commit
65b847d284
@ -185,6 +185,7 @@ static VGPUDMABuf
|
||||
dmabuf->buf.stride = fb->stride;
|
||||
dmabuf->buf.fourcc = qemu_pixman_to_drm_format(fb->format);
|
||||
dmabuf->buf.fd = res->dmabuf_fd;
|
||||
dmabuf->buf.allow_fences = true;
|
||||
|
||||
dmabuf->scanout_id = scanout_id;
|
||||
QTAILQ_INSERT_HEAD(&g->dmabuf.bufs, dmabuf, next);
|
||||
|
@ -170,6 +170,7 @@ typedef struct QemuDmaBuf {
|
||||
bool y0_top;
|
||||
void *sync;
|
||||
int fence_fd;
|
||||
bool allow_fences;
|
||||
} QemuDmaBuf;
|
||||
|
||||
typedef struct DisplayState DisplayState;
|
||||
|
@ -19,6 +19,7 @@ typedef struct egl_fb {
|
||||
GLuint texture;
|
||||
GLuint framebuffer;
|
||||
bool delete_texture;
|
||||
QemuDmaBuf *dmabuf;
|
||||
} egl_fb;
|
||||
|
||||
void egl_fb_destroy(egl_fb *fb);
|
||||
|
@ -155,6 +155,7 @@ extern bool gtk_use_gl_area;
|
||||
/* ui/gtk.c */
|
||||
void gd_update_windowsize(VirtualConsole *vc);
|
||||
int gd_monitor_update_interval(GtkWidget *widget);
|
||||
void gd_hw_gl_flushed(void *vc);
|
||||
|
||||
/* ui/gtk-egl.c */
|
||||
void gd_egl_init(VirtualConsole *vc);
|
||||
|
25
ui/gtk-egl.c
25
ui/gtk-egl.c
@ -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);
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/main-loop.h"
|
||||
|
||||
#include "trace.h"
|
||||
|
||||
@ -71,7 +72,25 @@ void gd_gl_area_draw(VirtualConsole *vc)
|
||||
surface_gl_render_texture(vc->gfx.gls, vc->gfx.ds);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GBM
|
||||
if (vc->gfx.guest_fb.dmabuf) {
|
||||
egl_dmabuf_create_sync(vc->gfx.guest_fb.dmabuf);
|
||||
}
|
||||
#endif
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@ -213,6 +232,9 @@ void gd_gl_area_scanout_flush(DisplayChangeListener *dcl,
|
||||
{
|
||||
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
|
||||
|
||||
if (vc->gfx.guest_fb.dmabuf) {
|
||||
graphic_hw_gl_block(vc->gfx.dcl.con, true);
|
||||
}
|
||||
gtk_gl_area_queue_render(GTK_GL_AREA(vc->gfx.drawing_area));
|
||||
}
|
||||
|
||||
@ -231,6 +253,10 @@ void gd_gl_area_scanout_dmabuf(DisplayChangeListener *dcl,
|
||||
gd_gl_area_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
|
||||
}
|
||||
|
||||
|
13
ui/gtk.c
13
ui/gtk.c
@ -36,6 +36,7 @@
|
||||
#include "qapi/qapi-commands-machine.h"
|
||||
#include "qapi/qapi-commands-misc.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/main-loop.h"
|
||||
|
||||
#include "ui/console.h"
|
||||
#include "ui/gtk.h"
|
||||
@ -583,6 +584,18 @@ static void gd_gl_release_dmabuf(DisplayChangeListener *dcl,
|
||||
#endif
|
||||
}
|
||||
|
||||
void gd_hw_gl_flushed(void *vcon)
|
||||
{
|
||||
VirtualConsole *vc = vcon;
|
||||
QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;
|
||||
|
||||
graphic_hw_gl_block(vc->gfx.dcl.con, false);
|
||||
graphic_hw_gl_flushed(vc->gfx.dcl.con);
|
||||
qemu_set_fd_handler(dmabuf->fence_fd, NULL, NULL, NULL);
|
||||
close(dmabuf->fence_fd);
|
||||
dmabuf->fence_fd = -1;
|
||||
}
|
||||
|
||||
/** DisplayState Callbacks (opengl version) **/
|
||||
|
||||
static const DisplayChangeListenerOps dcl_gl_area_ops = {
|
||||
|
Loading…
Reference in New Issue
Block a user