build: make GBM optional

Now that the DRM backend no longer depends on GBM, we can make it
optional. The GLES2 renderer still depends on it because of our EGL
device selection.

This is useful for compositors with their own renderers, and for
compositors using the Vulkan renderer.
This commit is contained in:
Simon Ser 2022-05-29 14:09:06 +02:00 committed by Simon Zeni
parent d483dd2f4c
commit bb2946f737
9 changed files with 37 additions and 11 deletions

View File

@ -45,7 +45,7 @@ Install dependencies:
* EGL and GLESv2 (optional, for the GLES2 renderer) * EGL and GLESv2 (optional, for the GLES2 renderer)
* Vulkan loader, headers and glslang (optional, for the Vulkan renderer) * Vulkan loader, headers and glslang (optional, for the Vulkan renderer)
* libdrm * libdrm
* GBM * GBM (optional, for the GBM allocator)
* libinput (optional, for the libinput backend) * libinput (optional, for the libinput backend)
* xkbcommon * xkbcommon
* udev * udev

View File

@ -5,6 +5,7 @@ wayland_client = dependency('wayland-client')
libpng = dependency('libpng', required: false, disabler: true) libpng = dependency('libpng', required: false, disabler: true)
egl = dependency('egl', required: false, disabler: true) egl = dependency('egl', required: false, disabler: true)
glesv2 = dependency('glesv2', required: false, disabler: true) glesv2 = dependency('glesv2', required: false, disabler: true)
gbm = dependency('gbm', required: false, disabler: true)
# These versions correspond to ffmpeg 4.0 # These versions correspond to ffmpeg 4.0
libavutil = dependency('libavutil', version: '>=56.14.100', required: false, disabler: true) libavutil = dependency('libavutil', version: '>=56.14.100', required: false, disabler: true)
libavcodec = dependency('libavcodec', version: '>=58.18.100', required: false, disabler: true) libavcodec = dependency('libavcodec', version: '>=58.18.100', required: false, disabler: true)

View File

@ -6,9 +6,10 @@
#mesondefine WLR_HAS_X11_BACKEND #mesondefine WLR_HAS_X11_BACKEND
#mesondefine WLR_HAS_GLES2_RENDERER #mesondefine WLR_HAS_GLES2_RENDERER
#mesondefine WLR_HAS_VULKAN_RENDERER #mesondefine WLR_HAS_VULKAN_RENDERER
#mesondefine WLR_HAS_GBM_ALLOCATOR
#mesondefine WLR_HAS_XWAYLAND #mesondefine WLR_HAS_XWAYLAND
#endif #endif

View File

@ -92,6 +92,7 @@ features = {
'xwayland': false, 'xwayland': false,
'gles2-renderer': false, 'gles2-renderer': false,
'vulkan-renderer': false, 'vulkan-renderer': false,
'gbm-allocator': false,
} }
internal_features = { internal_features = {
'xcb-errors': false, 'xcb-errors': false,
@ -125,7 +126,6 @@ drm = dependency('libdrm',
'valgrind=false', 'valgrind=false',
], ],
) )
gbm = dependency('gbm', version: '>=17.1.0')
xkbcommon = dependency('xkbcommon') xkbcommon = dependency('xkbcommon')
udev = dependency('libudev') udev = dependency('libudev')
pixman = dependency('pixman-1') pixman = dependency('pixman-1')
@ -136,7 +136,6 @@ wlr_files = []
wlr_deps = [ wlr_deps = [
wayland_server, wayland_server,
drm, drm,
gbm,
xkbcommon, xkbcommon,
udev, udev,
pixman, pixman,

View File

@ -4,3 +4,5 @@ option('examples', type: 'boolean', value: true, description: 'Build example app
option('icon_directory', description: 'Location used to look for cursors (default: ${datadir}/icons)', type: 'string', value: '') option('icon_directory', description: 'Location used to look for cursors (default: ${datadir}/icons)', type: 'string', value: '')
option('renderers', type: 'array', choices: ['auto', 'gles2', 'vulkan'], value: ['auto'], description: 'Select built-in renderers') option('renderers', type: 'array', choices: ['auto', 'gles2', 'vulkan'], value: ['auto'], description: 'Select built-in renderers')
option('backends', type: 'array', choices: ['auto', 'drm', 'libinput', 'x11'], value: ['auto'], description: 'Select built-in backends') option('backends', type: 'array', choices: ['auto', 'drm', 'libinput', 'x11'], value: ['auto'], description: 'Select built-in backends')
option('allocators', type: 'array', choices: ['auto', 'gbm'], value: ['auto'],
description: 'Select built-in allocators')

View File

@ -3,6 +3,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <wlr/config.h>
#include <wlr/interfaces/wlr_buffer.h> #include <wlr/interfaces/wlr_buffer.h>
#include <wlr/render/allocator.h> #include <wlr/render/allocator.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
@ -11,10 +12,13 @@
#include "backend/backend.h" #include "backend/backend.h"
#include "render/allocator/allocator.h" #include "render/allocator/allocator.h"
#include "render/allocator/drm_dumb.h" #include "render/allocator/drm_dumb.h"
#include "render/allocator/gbm.h"
#include "render/allocator/shm.h" #include "render/allocator/shm.h"
#include "render/wlr_renderer.h" #include "render/wlr_renderer.h"
#if WLR_HAS_GBM_ALLOCATOR
#include "render/allocator/gbm.h"
#endif
void wlr_allocator_init(struct wlr_allocator *alloc, void wlr_allocator_init(struct wlr_allocator *alloc,
const struct wlr_allocator_interface *impl, uint32_t buffer_caps) { const struct wlr_allocator_interface *impl, uint32_t buffer_caps) {
assert(impl && impl->destroy && impl->create_buffer); assert(impl && impl->destroy && impl->create_buffer);
@ -94,6 +98,8 @@ struct wlr_allocator *allocator_autocreate_with_drm_fd(
uint32_t renderer_caps = renderer_get_render_buffer_caps(renderer); uint32_t renderer_caps = renderer_get_render_buffer_caps(renderer);
struct wlr_allocator *alloc = NULL; struct wlr_allocator *alloc = NULL;
#if WLR_HAS_GBM_ALLOCATOR
uint32_t gbm_caps = WLR_BUFFER_CAP_DMABUF; uint32_t gbm_caps = WLR_BUFFER_CAP_DMABUF;
if ((backend_caps & gbm_caps) && (renderer_caps & gbm_caps) if ((backend_caps & gbm_caps) && (renderer_caps & gbm_caps)
&& drm_fd >= 0) { && drm_fd >= 0) {
@ -108,6 +114,7 @@ struct wlr_allocator *allocator_autocreate_with_drm_fd(
close(gbm_fd); close(gbm_fd);
wlr_log(WLR_DEBUG, "Failed to create gbm allocator"); wlr_log(WLR_DEBUG, "Failed to create gbm allocator");
} }
#endif
uint32_t shm_caps = WLR_BUFFER_CAP_SHM | WLR_BUFFER_CAP_DATA_PTR; uint32_t shm_caps = WLR_BUFFER_CAP_SHM | WLR_BUFFER_CAP_DATA_PTR;
if ((backend_caps & shm_caps) && (renderer_caps & shm_caps)) { if ((backend_caps & shm_caps) && (renderer_caps & shm_caps)) {

View File

@ -1,9 +1,25 @@
allocators = get_option('allocators')
if 'auto' in allocators and get_option('auto_features').enabled()
allocators = ['gbm']
elif 'auto' in renderers and get_option('auto_features').disabled()
allocators = []
endif
wlr_files += files( wlr_files += files(
'allocator.c', 'allocator.c',
'gbm.c',
'shm.c', 'shm.c',
'drm_dumb.c', 'drm_dumb.c',
) )
gbm = disabler()
if 'gbm' in allocators or 'auto' in allocators
gbm = dependency('gbm', version: '>=17.1.0', required: 'gbm' in allocators)
endif
if gbm.found()
wlr_files += files('gbm.c')
wlr_deps += gbm
features += { 'gbm-allocator': true }
has = cc.has_function('gbm_bo_get_fd_for_plane', dependencies: [gbm]) 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') add_project_arguments('-DHAS_GBM_BO_GET_FD_FOR_PLANE=@0@'.format(has.to_int()), language: 'c')
endif

View File

@ -1,6 +1,5 @@
#include <assert.h> #include <assert.h>
#include <drm_fourcc.h> #include <drm_fourcc.h>
#include <gbm.h>
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
#include <GLES2/gl2ext.h> #include <GLES2/gl2ext.h>
#include <stdint.h> #include <stdint.h>

View File

@ -16,8 +16,9 @@ wlr_files += files(
if 'gles2' in renderers or 'auto' in renderers if 'gles2' in renderers or 'auto' in renderers
egl = dependency('egl', required: 'gles2' in renderers) egl = dependency('egl', required: 'gles2' in renderers)
if egl.found() gbm = dependency('gbm', required: 'gles2' in renderers)
wlr_deps += egl if egl.found() and gbm.found()
wlr_deps += [egl, gbm]
wlr_files += files('egl.c') wlr_files += files('egl.c')
endif endif
subdir('gles2') subdir('gles2')