On Wednesday, 2017-10-18 23:56:00 +0000, Dylan Baker wrote: > This is based heavily on Daniel Stone's work for the same, rebased on > master and with a number of TODO's fixed. > > This does not implement glvnd (which is coming in a later patch) > > Meson builds egl slightly differently than autotools, namely it doesn't > build an intermediate shared library. It doesn't do this because meson > doesn't have problems with the name of the library being dynamically > generated, so the glvnd and non-glvnd code can follow the same path. > > Signed-off-by: Dylan Baker <dylanx.c.ba...@intel.com> > --- > include/meson.build | 8 ++ > meson.build | 81 ++++++++++-- > meson_options.txt | 9 +- > src/egl/meson.build | 144 > +++++++++++++++++++++ > src/egl/wayland/wayland-drm/meson.build | 14 ++ > .../{wayland-drm => wayland-egl}/meson.build | 29 +++-- > src/gbm/meson.build | 12 +- > src/glx/meson.build | 22 ---- > src/meson.build | 7 +- > 9 files changed, 281 insertions(+), 45 deletions(-) > create mode 100644 src/egl/meson.build > copy src/egl/wayland/{wayland-drm => wayland-egl}/meson.build (66%) > > diff --git a/include/meson.build b/include/meson.build > index e33a8569d76..88e66a1a8f4 100644 > --- a/include/meson.build > +++ b/include/meson.build > @@ -58,3 +58,11 @@ endif > if with_osmesa > install_headers('GL/osmesa.h', subdir : 'GL') > endif > + > +if with_egl > + install_headers( > + 'EGL/eglext.h', 'EGL/egl.h', 'EGL/eglextchromium.h', 'EGL/eglmesaext.h', > + 'EGL/eglplatform.h', > + subdir : 'EGL', > + ) > +endif > diff --git a/meson.build b/meson.build > index 13d9e400ba7..9eef48340d7 100644 > --- a/meson.build > +++ b/meson.build > @@ -130,16 +130,20 @@ endif > # TODO: other OSes > with_dri_platform = 'drm' > > -# TODO: there are more platforms required for non-vulkan drivers > +# TODO: android platform > with_platform_wayland = false > with_platform_x11 = false > with_platform_drm = false > +with_platform_surfaceless = false > +egl_native_platform = '' > _platforms = get_option('platforms') > if _platforms != '' > _split = _platforms.split(',') > with_platform_x11 = _split.contains('x11') > with_platform_wayland = _split.contains('wayland') > with_platform_drm = _split.contains('drm') > + with_platform_surfaceless = _split.contains('surfaceless') > + egl_native_platform = _split[0] > endif
I quite liked daniels' `foreach if/elif/else` structure, it had the added advantage of being able to reject invalid platforms instead of silently ignoring them. > > with_gbm = get_option('gbm') > @@ -154,6 +158,27 @@ else > with_gbm = false > endif > > +with_egl = get_option('egl') > +if with_egl == 'auto' > + with_egl = with_dri and with_shared_glapi and egl_native_platform != '' I don't like the var name reuse, once as a string, then as a bool. How about `_egl = get_option('egl')`, as with `_platforms` above? I'll have another look tomorrow, but I think other than that this patch is good (not giving my r-b just yet though). > +elif with_egl == 'yes' > + if not with_dri > + error('EGL requires dri') > + elif not with_shared_glapi > + error('EGL requires shared-glapi') > + elif egl_native_platform == '' > + error('No platforms specified, consider -Dplatforms=drm,x11 at least') > + endif > + with_egl = true > +else > + with_egl = false > +endif > + > +# TODO: or virgl > +if with_egl and with_gallium_radeonsi and not (with_platform_drm or > with_platform_surfaceless) > + error('RadeonSI requires drm or surfaceless platform when using EGL') > +endif > + > pre_args += '-DGLX_USE_TLS' > with_glx = get_option('glx') > if with_glx != 'disabled' > @@ -228,7 +253,7 @@ if with_any_vk and (with_platform_x11 and not with_dri3) > error('Vulkan drivers require dri3 for X11 support') > endif > if with_dri or with_gallium > - if with_glx == 'disabled' # TODO: or egl > + if with_glx == 'disabled' and not with_egl > error('building dri or gallium drivers require at least one window > system') > endif > endif > @@ -250,6 +275,7 @@ if _drivers != '' > with_gallium_omx or with_gallium_va) > endif > > +gl_pkgconfig_c_flags = [] > if with_platform_x11 > if with_any_vk or (with_glx == 'dri' and with_dri_platform == 'drm') > pre_args += '-DHAVE_X11_PLATFORM' > @@ -269,6 +295,18 @@ if with_platform_x11 > pre_args += '-DGLX_USE_DRM' > endif > endif > +else > + pre_args += '-DMESA_EGL_NO_X11_HEADERS' > + gl_pkgconfig_c_flags += '-DMESA_EGL_NO_X11_HEADERS' > +endif > +if with_platform_drm > + if with_egl and not with_gbm > + error('EGL drm platform requires gbm') > + endif > + pre_args += '-DHAVE_DRM_PLATFORM' > +endif > +if with_platform_surfaceless > + pre_args += '-DHAVE_SURFACELESS_PLATFORM' > endif > > prog_python2 = find_program('python2') > @@ -646,18 +684,22 @@ endif > > # TODO: symbol mangling > > -# TODO: egl configuration > - > if with_platform_wayland > prog_wl_scanner = find_program('wayland-scanner') > dep_wl_protocols = dependency('wayland-protocols', version : '>= 1.8') > dep_wayland_client = dependency('wayland-client', version : '>=1.11') > dep_wayland_server = dependency('wayland-server', version : '>=1.11') > + wayland_dmabuf_xml = join_paths( > + dep_wl_protocols.get_pkgconfig_variable('pkgdatadir'), 'unstable', > + 'linux-dmabuf', 'linux-dmabuf-unstable-v1.xml' > + ) > + pre_args += ['-DHAVE_WAYLAND_PLATFORM', '-DWL_HIDE_DEPRECATED'] > else > prog_wl_scanner = [] > dep_wl_protocols = [] > dep_wayland_client = [] > dep_wayland_server = [] > + wayland_dmabuf_xml = '' > endif > > dep_x11 = [] > @@ -674,6 +716,7 @@ dep_xf86vm = [] > dep_xcb_dri3 = [] > dep_xcb_present = [] > dep_xcb_sync = [] > +dep_xcb_xfixes = [] > dep_xshmfence = [] > if with_platform_x11 > if with_glx == 'dri' and with_dri_platform == 'drm' > @@ -701,21 +744,19 @@ if with_platform_x11 > dep_dri2proto = dependency('dri2proto', version : '>= 2.8') > dep_glproto = dependency('glproto', version : '>= 1.4.14') > endif > + if with_egl > + dep_xcb_xfixes = dependency('xcb-xfixes') > + endif > endif > > -# TODO: platforms for !vulkan > - > # TODO: osmesa > > -# TODO: egl > - > # TODO: vallium G3DVL > > # TODO: nine > > # TODO: clover > > -# TODO: egl sans x11 > # TODO: gallium tests > > # TODO: various libdirs > @@ -744,6 +785,28 @@ endforeach > > inc_include = include_directories('include') > > +gl_priv_reqs = [ > + 'x11', 'xext', 'xdamage >= 1.1', 'xfixes', 'x11-xcb', 'xcb', > + 'xcb-glx >= 1.8.1', 'libdrm >= 2.4.75', > +] > +if dep_xf86vm != [] and dep_xf86vm.found() > + gl_priv_reqs += 'xf86vm' > +endif > +if with_dri_platform == 'drm' > + gl_priv_reqs += 'xcb-dri2 >= 1.8' > +endif > + > +gl_priv_libs = [] > +if dep_thread.found() > + gl_priv_libs += ['-lpthread', '-pthread'] > +endif > +if dep_m.found() > + gl_priv_libs += '-lm' > +endif > +if dep_dl.found() > + gl_priv_libs += '-ldl' > +endif > + > pkg = import('pkgconfig') > > subdir('include') > diff --git a/meson_options.txt b/meson_options.txt > index 8fd00d41b45..87aef95198b 100644 > --- a/meson_options.txt > +++ b/meson_options.txt > @@ -21,7 +21,7 @@ > option( > 'platforms', > type : 'string', > - value : 'x11,wayland,drm', > + value : 'x11,wayland,drm,surfaceless', > description : 'comma separated list of window systems to support. wayland, > x11, surfaceless, drm, etc.' > ) > option( > @@ -111,6 +111,13 @@ option( > choices : ['auto', 'disabled', 'dri', 'xlib', 'gallium-xlib'], > description : 'Build support for GLX platform' > ) > +option( > + 'egl', > + type : 'combo', > + value : 'auto', > + choices : ['auto', 'yes', 'no'], > + description : 'Build support for EGL platform' > +) > option( > 'glvnd', > type : 'boolean', > diff --git a/src/egl/meson.build b/src/egl/meson.build > new file mode 100644 > index 00000000000..ade6810bf91 > --- /dev/null > +++ b/src/egl/meson.build > @@ -0,0 +1,144 @@ > +# Copyright © 2017 Intel Corporation > + > +# Permission is hereby granted, free of charge, to any person obtaining a > copy > +# of this software and associated documentation files (the "Software"), to > deal > +# in the Software without restriction, including without limitation the > rights > +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell > +# copies of the Software, and to permit persons to whom the Software is > +# furnished to do so, subject to the following conditions: > + > +# The above copyright notice and this permission notice shall be included in > +# all copies or substantial portions of the Software. > + > +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE > +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > FROM, > +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > THE > +# SOFTWARE. > + > +c_args_for_egl = [] > +link_for_egl = [] > +deps_for_egl = [] > +incs_for_egl = [] > +files_egl = files( > + 'main/eglapi.c', > + 'main/eglapi.h', > + 'main/eglarray.c', > + 'main/eglarray.h', > + 'main/eglconfig.c', > + 'main/eglconfig.h', > + 'main/eglcontext.c', > + 'main/eglcontext.h', > + 'main/eglcurrent.c', > + 'main/eglcurrent.h', > + 'main/egldefines.h', > + 'main/egldisplay.c', > + 'main/egldisplay.h', > + 'main/egldriver.c', > + 'main/egldriver.h', > + 'main/eglfallbacks.c', > + 'main/eglglobals.c', > + 'main/eglglobals.h', > + 'main/eglimage.c', > + 'main/eglimage.h', > + 'main/egllog.c', > + 'main/egllog.h', > + 'main/eglsurface.c', > + 'main/eglsurface.h', > + 'main/eglsync.c', > + 'main/eglsync.h', > + 'main/eglentrypoint.h', > + 'main/egltypedefs.h', > + 'drivers/dri2/egl_dri2.c', > + 'drivers/dri2/egl_dri2.h', > + 'drivers/dri2/egl_dri2_fallbacks.h', > +) > + > +linux_dmabuf_unstable_v1_protocol_c = custom_target( > + 'linux-dmabuf-unstable-v1-protocol.c', > + input : wayland_dmabuf_xml, > + output : 'linux-dmabuf-unstable-v1-protocol.c', > + command : [prog_wl_scanner, 'code', '@INPUT@', '@OUTPUT@'], > +) > + > +linux_dmabuf_unstable_v1_client_protocol_h = custom_target( > + 'linux-dmabuf-unstable-v1-client-protocol.h', > + input : wayland_dmabuf_xml, > + output : 'linux-dmabuf-unstable-v1-client-protocol.h', > + command : [prog_wl_scanner, 'client-header', '@INPUT@', '@OUTPUT@'], > +) > + > +if with_platform_x11 > + files_egl += files('drivers/dri2/platform_x11.c') > + if with_dri3 > + files_egl += files('drivers/dri2/platform_x11_dri3.c') > + link_for_egl += libloader_dri3_helper > + endif > + deps_for_egl += [dep_xcb_dri2, dep_xcb_xfixes] > +endif > +if with_platform_drm > + files_egl += files('drivers/dri2/platform_drm.c') > + link_for_egl += libgbm > + incs_for_egl += include_directories('../gbm/main') > +endif > +if with_platform_surfaceless > + files_egl += files('drivers/dri2/platform_surfaceless.c') > +endif > +if with_platform_wayland > + deps_for_egl += [dep_wayland_client, dep_wayland_server] > + link_for_egl += libwayland_drm > + files_egl += files('drivers/dri2/platform_wayland.c') > + files_egl += [ > + linux_dmabuf_unstable_v1_protocol_c, > + linux_dmabuf_unstable_v1_client_protocol_h, > + wayland_drm_client_protocol_h, > + ] > + incs_for_egl += include_directories( > + 'wayland/wayland-egl', 'wayland/wayland-drm', > + ) > +endif > +# TODO: android > + > +# TODO: glvnd > + > +if cc.has_function('mincore') > + c_args_for_egl += '-DHAVE_MINCORE' > +endif > + > +libegl = shared_library( > + 'EGL', > + files_egl, > + c_args : [ > + c_vis_args, > + c_args_for_egl, > + '-DDEFAULT_DRIVER_DIR="@0@"'.format(dri_driver_dir), > + '-D_EGL_BUILT_IN_DRIVER_DRI2', > + > '-D_EGL_NATIVE_PLATFORM=_EGL_PLATFORM_@0@'.format(egl_native_platform.to_upper()), > + ], > + include_directories : [ > + incs_for_egl, inc_include, inc_src, inc_loader, inc_gbm, > + include_directories('main'), > + ], > + link_with : [link_for_egl, libloader, libxmlconfig, libglapi, > libmesa_util], > + link_args : [ld_args_bsymbolic, ld_args_gc_sections], > + dependencies : [deps_for_egl, dep_dl, dep_libdrm, dep_clock, dep_thread], > + install : true, > + version : '1.0.0', > +) > + > +pkg.generate( > + name : 'egl', > + description : 'Mesa EGL Library', > + version : meson.project_version(), > + libraries : libegl, > + libraries_private: gl_priv_libs, > + requires_private : gl_priv_reqs, > + extra_cflags : gl_pkgconfig_c_flags, > +) > + > +if with_tests > + test('egl-symbols-check', find_program('egl-symbols-check')) > + test('egl-entrypoint-check', find_program('egl-entrypoint-check')) > +endif > diff --git a/src/egl/wayland/wayland-drm/meson.build > b/src/egl/wayland/wayland-drm/meson.build > index 92adc295531..12b49ca4f06 100644 > --- a/src/egl/wayland/wayland-drm/meson.build > +++ b/src/egl/wayland/wayland-drm/meson.build > @@ -31,3 +31,17 @@ wayland_drm_client_protocol_h = custom_target( > output : 'wayland-drm-client-protocol.h', > command : [prog_wl_scanner, 'client-header', '@INPUT@', '@OUTPUT@'], > ) > + > +wayland_drm_server_protocol_h = custom_target( > + 'wayland-drm-server-protocol.h', > + input : 'wayland-drm.xml', > + output : 'wayland-drm-server-protocol.h', > + command : [prog_wl_scanner, 'server-header', '@INPUT@', '@OUTPUT@'], > +) > + > +libwayland_drm = static_library( > + 'wayland_drm', > + ['wayland-drm.c', wayland_drm_protocol_c, wayland_drm_server_protocol_h], > + dependencies : [dep_wayland_server], > + build_by_default : false, > +) > diff --git a/src/egl/wayland/wayland-drm/meson.build > b/src/egl/wayland/wayland-egl/meson.build > similarity index 66% > copy from src/egl/wayland/wayland-drm/meson.build > copy to src/egl/wayland/wayland-egl/meson.build > index 92adc295531..5e7c3103843 100644 > --- a/src/egl/wayland/wayland-drm/meson.build > +++ b/src/egl/wayland/wayland-egl/meson.build > @@ -18,16 +18,25 @@ > # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > THE > # SOFTWARE. > > -wayland_drm_protocol_c = custom_target( > - 'wayland-drm-protocol.c', > - input : 'wayland-drm.xml', > - output : 'wayland-drm-protocol.c', > - command : [prog_wl_scanner, 'code', '@INPUT@', '@OUTPUT@'], > + > +libwayland_egl = shared_library( > + 'wayland-egl', > + 'wayland-egl.c', > + c_args : [c_vis_args], > + link_args : ld_args_gc_sections, > + version : '1.0.0', > + install : true, > ) > > -wayland_drm_client_protocol_h = custom_target( > - 'wayland-drm-client-protocol.h', > - input : 'wayland-drm.xml', > - output : 'wayland-drm-client-protocol.h', > - command : [prog_wl_scanner, 'client-header', '@INPUT@', '@OUTPUT@'], > +pkg.generate( > + name : 'wayland-egl', > + description : 'Mesa wayland-egl library', > + libraries : libwayland_egl, > + version : meson.project_version(), > + requires : 'wayland-client', > ) > + > +if with_tests > + test('wayland-egl-symbols-check', > find_program('wayland-egl-symbols-check')) > + test('wayland-egl-abi-check', executable('wayland-egl-abi-check', > 'wayland-egl-abi-check.c')) > +endif > diff --git a/src/gbm/meson.build b/src/gbm/meson.build > index f9665aa2d2f..1bb3c94c387 100644 > --- a/src/gbm/meson.build > +++ b/src/gbm/meson.build > @@ -18,6 +18,8 @@ > # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN > THE > # SOFTWARE. > > +inc_gbm = include_directories('.', 'backends/dri') > + > files_gbm = files( > 'main/backend.c', > 'main/backend.h', > @@ -28,12 +30,17 @@ files_gbm = files( > deps_gbm = [] > args_gbm = [] > links_gbm = [] > +deps_gbm = [] > > if with_dri2 > files_gbm += files('backends/dri/gbm_dri.c', 'backends/dri/gbm_driint.h') > deps_gbm += [dep_libdrm, dep_thread] > args_gbm += '-DDEFAULT_DRIVER_DIR="@0@"'.format(dri_driver_dir) > endif > +if with_platform_wayland > + deps_gbm += dep_wayland_server > + links_gbm += libwayland_drm > +endif > > # TODO: wayland support (requires egl) > > @@ -41,10 +48,11 @@ libgbm = shared_library( > 'gbm', > files_gbm, > include_directories : [ > - include_directories('main'), inc_include, inc_src, inc_loader], > + include_directories('main'), inc_include, inc_src, inc_loader, > + include_directories('../egl/wayland/wayland-drm')], > c_args : args_gbm, > link_args : [ld_args_gc_sections], > - link_with : [libloader, libmesa_util, libxmlconfig], > + link_with : [links_gbm, libloader, libmesa_util, libxmlconfig], > dependencies : [deps_gbm, dep_dl], > version : '1.0', > install : true, > diff --git a/src/glx/meson.build b/src/glx/meson.build > index 6853f5b3a16..3fe5fcf0cd6 100644 > --- a/src/glx/meson.build > +++ b/src/glx/meson.build > @@ -168,28 +168,6 @@ if with_glx == 'dri' > install : true, > ) > > - gl_priv_reqs = [ > - 'x11', 'xext', 'xdamage >= 1.1', 'xfixes', 'x11-xcb', 'xcb', > - 'xcb-glx >= 1.8.1', 'libdrm >= 2.4.75', > - ] > - if dep_xf86vm.found() > - gl_priv_reqs += 'xf86vm' > - endif > - if with_dri_platform == 'drm' > - gl_priv_reqs += 'xcb-dri2 >= 1.8' > - endif > - > - gl_priv_libs = [] > - if dep_thread.found() > - gl_priv_libs += ['-lpthread', '-pthread'] > - endif > - if dep_m.found() > - gl_priv_libs += '-lm' > - endif > - if dep_dl.found() > - gl_priv_libs += '-ldl' > - endif > - > pkg.generate( > name : 'gl', > filebase : 'gl', > diff --git a/src/meson.build b/src/meson.build > index 0326be0bfef..9b1b0ae594d 100644 > --- a/src/meson.build > +++ b/src/meson.build > @@ -56,8 +56,13 @@ subdir('intel') > subdir('mesa') > subdir('loader') > subdir('glx') > +if with_platform_wayland > + subdir('egl/wayland/wayland-egl') > +endif > if with_gbm > subdir('gbm') > endif > -# TODO: egl > +if with_egl > + subdir('egl') > +endif > subdir('gallium') > -- > 2.14.2 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev