diff options
author | Daniel Stone <daniels@collabora.com> | 2017-08-03 15:06:08 +0100 |
---|---|---|
committer | Jonas Ã…dahl <jadahl@gmail.com> | 2018-01-24 11:39:01 +0800 |
commit | c0d9b08ef9bf2be865aad9bf1bc74ba24c655d9f (patch) | |
tree | 91a17910025c129aa4b9aec3419f69cb6a5df8a4 | |
parent | d99cd279d2b5434c51e7a45fd11b46c6c83e7843 (diff) | |
download | mutter-c0d9b08ef9bf2be865aad9bf1bc74ba24c655d9f.tar.gz |
renderer/native: Use modifier-aware GBM API
Newer versions of GBM support buffer modifiers, including multi-plane
buffers. Use this new API to explicitly pull the information from GBM,
and feed it to drmModeAddFB2WithModifiers.
https://bugzilla.gnome.org/show_bug.cgi?id=785779
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/backends/native/meta-renderer-native.c | 47 |
2 files changed, 37 insertions, 12 deletions
diff --git a/configure.ac b/configure.ac index 42348146c..7399f741a 100644 --- a/configure.ac +++ b/configure.ac @@ -266,7 +266,7 @@ AC_SUBST(XWAYLAND_PATH) PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES) -MUTTER_NATIVE_BACKEND_MODULES="libdrm >= 2.4.83 libsystemd libinput >= 1.4 gudev-1.0 gbm >= 10.3" +MUTTER_NATIVE_BACKEND_MODULES="libdrm >= 2.4.83 libsystemd libinput >= 1.4 gudev-1.0 gbm >= 17.1" AC_ARG_ENABLE(native-backend, AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),, diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index 968b9d44c..2e59161cc 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -1283,24 +1283,49 @@ gbm_get_next_fb_id (MetaGpuKms *gpu_kms, uint32_t handles[4] = { 0, }; uint32_t strides[4] = { 0, }; uint32_t offsets[4] = { 0, }; + uint64_t modifiers[4] = { 0, }; + int i; /* Now we need to set the CRTC to whatever is the front buffer */ next_bo = gbm_surface_lock_front_buffer (gbm_surface); - strides[0] = gbm_bo_get_stride (next_bo); - handles[0] = gbm_bo_get_handle (next_bo).u32; + 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); - if (drmModeAddFB2 (kms_fd, - gbm_bo_get_width (next_bo), - gbm_bo_get_height (next_bo), - gbm_bo_get_format (next_bo), - handles, - strides, - offsets, - &next_fb_id, - 0)) + if (modifiers[0] != DRM_FORMAT_MOD_INVALID) + { + if (drmModeAddFB2WithModifiers (kms_fd, + gbm_bo_get_width (next_bo), + gbm_bo_get_height (next_bo), + gbm_bo_get_format (next_bo), + handles, + strides, + offsets, + modifiers, + &next_fb_id, + DRM_MODE_FB_MODIFIERS)) + { + g_warning ("Failed to create new back buffer handle: %m"); + gbm_surface_release_buffer (gbm_surface, next_bo); + return FALSE; + } + } + else if (drmModeAddFB2 (kms_fd, + gbm_bo_get_width (next_bo), + gbm_bo_get_height (next_bo), + gbm_bo_get_format (next_bo), + handles, + strides, + offsets, + &next_fb_id, + 0)) { if (drmModeAddFB (kms_fd, gbm_bo_get_width (next_bo), |