mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 04:45:58 +01:00
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:
parent
d483dd2f4c
commit
bb2946f737
9 changed files with 37 additions and 11 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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')
|
||||||
|
|
Loading…
Reference in a new issue