1
0
Fork 0

renderer/native: Fallback to non-planar API if gbm_bo_get_handle_for_plane fails

Commit c0d9b08ef9 replaced the old GBM API calls
with the multi-plane GBM API. However, the call to gbm_bo_get_handle_for_plane
fails for some DRI drivers (in particular i915). Due to missing error checks,
the subsequent call to drmModeAddFB[2] fails and the screen output locks up.

This commit adds the missing error checks and falls back to the old GBM API
(non-planar) if necessary.

v5: test success of gbm_bo_get_handle_for_plane instead of errno

This commit adopts solution proposed by Daniel van Vugt to check the return
value of gbm_bo_get_handle_for_plane on plane 0 and fall back to old
non-planar method if the call fails. This removes the errno check (for
ENOSYS) that could abort if mesa ever sets a different value.

Related to: https://gitlab.gnome.org/GNOME/mutter/issues/127
This commit is contained in:
Alex Villacís Lasso 2018-07-27 11:08:52 -05:00 committed by Jonas Ådahl
parent 252dd52439
commit f7af32a3ea

View file

@ -1625,12 +1625,23 @@ gbm_get_next_fb_id (MetaGpuKms *gpu_kms,
return FALSE; return FALSE;
} }
for (i = 0; i < gbm_bo_get_plane_count (next_bo); i++) if (gbm_bo_get_handle_for_plane (next_bo, 0).s32 == -1)
{ {
strides[i] = gbm_bo_get_stride_for_plane (next_bo, i); /* Failed to fetch handle to plane, falling back to old method */
handles[i] = gbm_bo_get_handle_for_plane (next_bo, i).u32; strides[0] = gbm_bo_get_stride (next_bo);
offsets[i] = gbm_bo_get_offset (next_bo, i); handles[0] = gbm_bo_get_handle (next_bo).u32;
modifiers[i] = gbm_bo_get_modifier (next_bo); offsets[0] = 0;
modifiers[0] = DRM_FORMAT_MOD_INVALID;
}
else
{
for (i = 0; i < gbm_bo_get_plane_count (next_bo); i++)
{
strides[i] = gbm_bo_get_stride_for_plane (next_bo, i);
handles[i] = gbm_bo_get_handle_for_plane (next_bo, i).u32;
offsets[i] = gbm_bo_get_offset (next_bo, i);
modifiers[i] = gbm_bo_get_modifier (next_bo);
}
} }
kms_fd = meta_gpu_kms_get_fd (gpu_kms); kms_fd = meta_gpu_kms_get_fd (gpu_kms);