virgl/gbm: factor out export retry logic

Without this, attempting to map the dma-buf after an EGL image was created
from it will fail.

Reviewed-by: David Riley <davidriley@chromium.org>
macos/master
Gurchetan Singh 5 years ago
parent 246265c771
commit 44f1653dbe
  1. 5
      src/virgl_egl_context.c
  2. 25
      src/virgl_gbm.c
  3. 2
      src/virgl_gbm.h

@ -359,7 +359,7 @@ int virgl_egl_get_fd_for_texture(struct virgl_egl *egl, uint32_t tex_id, int *fd
if (!egl->gbm)
goto out_destroy;
ret = drmPrimeHandleToFD(gbm_device_get_fd(egl->gbm->device), handle, DRM_CLOEXEC, fd);
ret = virgl_gbm_export_fd(egl->gbm->device, handle, fd);
if (ret < 0)
goto out_destroy;
} else {
@ -399,8 +399,7 @@ void *virgl_egl_image_from_dmabuf(struct virgl_egl *egl, struct gbm_bo *bo)
for (int plane = 0; plane < num_planes; plane++) {
uint32_t handle = gbm_bo_get_handle_for_plane(bo, plane).u32;
ret = drmPrimeHandleToFD(gbm_device_get_fd(egl->gbm->device), handle, DRM_CLOEXEC,
&fds[plane]);
ret = virgl_gbm_export_fd(egl->gbm->device, handle, &fds[plane]);
if (ret < 0) {
vrend_printf( "failed to export plane handle\n");
image = (void *)EGL_NO_IMAGE_KHR;

@ -389,6 +389,18 @@ uint32_t virgl_gbm_convert_flags(uint32_t virgl_bind_flags)
return flags;
}
int virgl_gbm_export_fd(struct gbm_device *gbm, uint32_t handle, int32_t *out_fd)
{
int ret;
ret = drmPrimeHandleToFD(gbm_device_get_fd(gbm), handle, DRM_CLOEXEC | DRM_RDWR, out_fd);
// Kernels with older DRM core versions block DRM_RDWR but give a
// read/write mapping anyway.
if (ret)
ret = drmPrimeHandleToFD(gbm_device_get_fd(gbm), handle, DRM_CLOEXEC, out_fd);
return ret;
}
int virgl_gbm_export_query(struct gbm_bo *bo, struct virgl_renderer_export_query *query)
{
int ret = -1;
@ -420,16 +432,9 @@ int virgl_gbm_export_query(struct gbm_bo *bo, struct virgl_renderer_export_query
if (i == query->out_num_fds) {
if (query->in_export_fds) {
ret = drmPrimeHandleToFD(gbm_device_get_fd(gbm), handle, DRM_CLOEXEC | DRM_RDWR,
&query->out_fds[query->out_num_fds]);
// Kernels with older DRM core versions block DRM_RDWR but give a
// read/write mapping anyway.
if (ret) {
ret = drmPrimeHandleToFD(gbm_device_get_fd(gbm), handle, DRM_CLOEXEC,
&query->out_fds[query->out_num_fds]);
if (ret)
goto err_close;
}
ret = virgl_gbm_export_fd(gbm, handle, &query->out_fds[query->out_num_fds]);
if (ret)
goto err_close;
}
query->out_num_fds++;
}

@ -50,6 +50,8 @@ int virgl_gbm_transfer(struct gbm_bo *bo, uint32_t direction, struct iovec *iove
uint32_t virgl_gbm_convert_flags(uint32_t virgl_bind_flags);
int virgl_gbm_export_fd(struct gbm_device *gbm, uint32_t handle, int32_t *out_fd);
int virgl_gbm_export_query(struct gbm_bo *bo, struct virgl_renderer_export_query *query);
#endif

Loading…
Cancel
Save