diff --git a/src/virgl_egl_context.c b/src/virgl_egl_context.c index a25bd1c..c50c9b6 100644 --- a/src/virgl_egl_context.c +++ b/src/virgl_egl_context.c @@ -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; diff --git a/src/virgl_gbm.c b/src/virgl_gbm.c index 765df27..033edd2 100644 --- a/src/virgl_gbm.c +++ b/src/virgl_gbm.c @@ -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++; } diff --git a/src/virgl_gbm.h b/src/virgl_gbm.h index f2cc90f..ee53338 100644 --- a/src/virgl_gbm.h +++ b/src/virgl_gbm.h @@ -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