render/gbm_allocator: add support for gbm_bo_get_fd_for_plane

See [1]. This allows us to remove the workaround for GBM API
limitations.

[1]: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5442
This commit is contained in:
Simon Ser 2021-04-06 11:36:15 +02:00
parent 9ca743f9fd
commit 66e100ffbf
2 changed files with 9 additions and 2 deletions

View file

@ -35,12 +35,14 @@ static bool export_gbm_bo(struct gbm_bo *bo,
int i; int i;
int32_t handle = -1; int32_t handle = -1;
for (i = 0; i < attribs.n_planes; ++i) { for (i = 0; i < attribs.n_planes; ++i) {
#if HAS_GBM_BO_GET_FD_FOR_PLANE
attribs.fd[i] = gbm_bo_get_fd_for_plane(bo, i);
(void)handle;
#else
// GBM is lacking a function to get a FD for a given plane. Instead, // GBM is lacking a function to get a FD for a given plane. Instead,
// check all planes have the same handle. We can't use // check all planes have the same handle. We can't use
// drmPrimeHandleToFD because that messes up handle ref'counting in // drmPrimeHandleToFD because that messes up handle ref'counting in
// the user-space driver. // the user-space driver.
// TODO: use gbm_bo_get_plane_fd when it lands, see
// https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5442
union gbm_bo_handle plane_handle = gbm_bo_get_handle_for_plane(bo, i); union gbm_bo_handle plane_handle = gbm_bo_get_handle_for_plane(bo, i);
if (plane_handle.s32 < 0) { if (plane_handle.s32 < 0) {
wlr_log(WLR_ERROR, "gbm_bo_get_handle_for_plane failed"); wlr_log(WLR_ERROR, "gbm_bo_get_handle_for_plane failed");
@ -55,6 +57,8 @@ static bool export_gbm_bo(struct gbm_bo *bo,
} }
attribs.fd[i] = gbm_bo_get_fd(bo); attribs.fd[i] = gbm_bo_get_fd(bo);
#endif
if (attribs.fd[i] < 0) { if (attribs.fd[i] < 0) {
wlr_log(WLR_ERROR, "gbm_bo_get_fd failed"); wlr_log(WLR_ERROR, "gbm_bo_get_fd failed");
goto error_fd; goto error_fd;

View file

@ -18,6 +18,9 @@ wlr_files += files(
'drm_dumb_allocator.c', 'drm_dumb_allocator.c',
) )
has = cc.has_function('gbm_bo_get_fd_for_plane', dependencies: [gbm])
add_project_arguments('-DHAS_GBM_BO_GET_FD_FOR_PLANE=@0@'.format(has.to_int()), language: 'c')
egl = dependency('egl', required: 'gles2' in renderers) egl = dependency('egl', required: 'gles2' in renderers)
if egl.found() if egl.found()
wlr_deps += egl wlr_deps += egl