Message ID | 20210610224837.670192-3-vivek.kasireddy@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | virtio-gpu: Add a default synchronization mechanism for blobs | expand |
Hi, > +void egl_dmabuf_create_fence(QemuDmaBuf *dmabuf) > +{ > + if (dmabuf->sync) { > + dmabuf->fence_fd = eglDupNativeFenceFDANDROID(qemu_egl_display, > + dmabuf->sync); > + eglDestroySyncKHR(qemu_egl_display, dmabuf->sync); > + dmabuf->sync = NULL; > + } > +} > +void egl_dmabuf_wait_sync(QemuDmaBuf *dmabuf) > +{ Hmm, still the blocking wait. Can't you do something like "qemu_set_fd_handler(dmabuf->fence_fd, ...)" to avoid the eglClientWaitSyncKHR() completely? take care, Gerd
Hi Gerd, > > +void egl_dmabuf_create_fence(QemuDmaBuf *dmabuf) > > +{ > > + if (dmabuf->sync) { > > + dmabuf->fence_fd = eglDupNativeFenceFDANDROID(qemu_egl_display, > > + dmabuf->sync); > > + eglDestroySyncKHR(qemu_egl_display, dmabuf->sync); > > + dmabuf->sync = NULL; > > + } > > +} > > > +void egl_dmabuf_wait_sync(QemuDmaBuf *dmabuf) > > +{ > > Hmm, still the blocking wait. Can't you do something like [Kasireddy, Vivek] Right, it is a blocking wait; but this gets called from a new GTK thread that does the actual drawing. > "qemu_set_fd_handler(dmabuf->fence_fd, ...)" to avoid the > eglClientWaitSyncKHR() completely? [Kasireddy, Vivek] Yeah, I think this is also doable; let me look into it. Thanks, Vivek > > take care, > Gerd
diff --git a/include/ui/console.h b/include/ui/console.h index b30b63976a..49978fdae3 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -168,6 +168,8 @@ typedef struct QemuDmaBuf { uint64_t modifier; uint32_t texture; bool y0_top; + void *sync; + int fence_fd; } QemuDmaBuf; typedef struct DisplayState DisplayState; diff --git a/include/ui/egl-helpers.h b/include/ui/egl-helpers.h index f1bf8f97fc..5a7575dc13 100644 --- a/include/ui/egl-helpers.h +++ b/include/ui/egl-helpers.h @@ -45,6 +45,9 @@ int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc, void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf); void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf); +void egl_dmabuf_create_sync(QemuDmaBuf *dmabuf); +void egl_dmabuf_create_fence(QemuDmaBuf *dmabuf); +void egl_dmabuf_wait_sync(QemuDmaBuf *dmabuf); #endif diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c index 6d0cb2b5cb..47220b66e0 100644 --- a/ui/egl-helpers.c +++ b/ui/egl-helpers.c @@ -76,6 +76,50 @@ void egl_fb_setup_for_tex(egl_fb *fb, int width, int height, GL_TEXTURE_2D, fb->texture, 0); } +void egl_dmabuf_create_sync(QemuDmaBuf *dmabuf) +{ + EGLSyncKHR sync; + + if (epoxy_has_egl_extension(qemu_egl_display, + "EGL_KHR_fence_sync") && + epoxy_has_egl_extension(qemu_egl_display, + "EGL_ANDROID_native_fence_sync")) { + sync = eglCreateSyncKHR(qemu_egl_display, + EGL_SYNC_NATIVE_FENCE_ANDROID, NULL); + if (sync != EGL_NO_SYNC_KHR) { + dmabuf->sync = sync; + } + } +} + +void egl_dmabuf_create_fence(QemuDmaBuf *dmabuf) +{ + if (dmabuf->sync) { + dmabuf->fence_fd = eglDupNativeFenceFDANDROID(qemu_egl_display, + dmabuf->sync); + eglDestroySyncKHR(qemu_egl_display, dmabuf->sync); + dmabuf->sync = NULL; + } +} + +void egl_dmabuf_wait_sync(QemuDmaBuf *dmabuf) +{ + EGLSyncKHR sync; + EGLint attrib_list[] = { + EGL_SYNC_NATIVE_FENCE_FD_ANDROID, dmabuf->fence_fd, + EGL_NONE, + }; + + sync = eglCreateSyncKHR(qemu_egl_display, + EGL_SYNC_NATIVE_FENCE_ANDROID, attrib_list); + if (sync != EGL_NO_SYNC_KHR) { + eglClientWaitSyncKHR(qemu_egl_display, sync, + 0, EGL_FOREVER_KHR); + eglDestroySyncKHR(qemu_egl_display, sync); + dmabuf->fence_fd = -1; + } +} + void egl_fb_setup_new_tex(egl_fb *fb, int width, int height) { GLuint texture;
These egl helpers would be used for creating and waiting on a sync object. Cc: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com> --- include/ui/console.h | 2 ++ include/ui/egl-helpers.h | 3 +++ ui/egl-helpers.c | 44 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+)