diff options
author | Alex Villacís Lasso <a_villacis@palosanto.com> | 2018-07-27 11:08:52 -0500 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2018-08-09 12:36:34 +0000 |
commit | f7af32a3eaefabbea3ebbda3a93eff98dd105ab9 (patch) | |
tree | 10866427c01f49ecb9468a42ea547c2d10079a99 | |
parent | 252dd524390dcdbdd89534c0014d22a796957f55 (diff) | |
download | mutter-f7af32a3eaefabbea3ebbda3a93eff98dd105ab9.tar.gz |
renderer/native: Fallback to non-planar API if gbm_bo_get_handle_for_plane fails
Commit c0d9b08ef9bf2be865aad9bf1bc74ba24c655d9f 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
-rw-r--r-- | src/backends/native/meta-renderer-native.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index 4c795320c..9b8ab0907 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -1625,12 +1625,23 @@ gbm_get_next_fb_id (MetaGpuKms *gpu_kms, 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); - 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); + /* Failed to fetch handle to plane, falling back to old method */ + strides[0] = gbm_bo_get_stride (next_bo); + handles[0] = gbm_bo_get_handle (next_bo).u32; + 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); |