gstreamer/gst-libs/gst/gl/meson.build

1152 lines
36 KiB
Meson
Raw Normal View History

if get_option('gl').disabled()
message('GStreamer OpenGL integration disabled via options.')
gstgl_dep = dependency('', required: false)
build_gstgl = false
subdir_done()
endif
gl_sources = [
'gstglapi.c',
'gstglbasefilter.c',
'gstglbasememory.c',
'gstglbasesrc.c',
'gstglcolorconvert.c',
'gstglbuffer.c',
'gstglbufferpool.c',
'gstglcontext.c',
'gstgldebug.c',
'gstgldisplay.c',
'gstglfeature.c',
'gstglfilter.c',
'gstglformat.c',
'gstglframebuffer.c',
'gstglmemory.c',
'gstglmemorypbo.c',
'gstgloverlaycompositor.c',
'gstglquery.c',
'gstglrenderbuffer.c',
'gstglshader.c',
'gstglshaderstrings.c',
'gstglsl.c',
'gstglslstage.c',
'gstglsyncmeta.c',
'gstglupload.c',
'gstglutils.c',
'gstglviewconvert.c',
'gstglwindow.c',
]
gl_priv_sources = []
gir_gl_headers = [
'gl.h',
'gl-prelude.h',
'gstgl_enums.h',
'gstgl_fwd.h',
'gstglapi.h',
'gstglbasefilter.h',
'gstglbasememory.h',
'gstglbasesrc.h',
'gstglbuffer.h',
'gstglbufferpool.h',
'gstglcolorconvert.h',
'gstglcontext.h',
'gstgldebug.h',
'gstgldisplay.h',
'gstglfeature.h',
'gstglfilter.h',
'gstglformat.h',
'gstglframebuffer.h',
'gstglmemory.h',
'gstglmemorypbo.h',
'gstgloverlaycompositor.h',
'gstglquery.h',
'gstglrenderbuffer.h',
'gstglshader.h',
'gstglshaderstrings.h',
'gstglsl.h',
'gstglslstage.h',
'gstglsyncmeta.h',
'gstglupload.h',
'gstglutils.h',
'gstglviewconvert.h',
'gstglwindow.h',
]
gl_headers = gir_gl_headers + [
'gstglfuncs.h',
]
gl_prototype_headers = [
'glprototypes/all_functions.h',
'glprototypes/base.h',
'glprototypes/blending.h',
'glprototypes/buffers.h',
'glprototypes/debug.h',
'glprototypes/eglimage.h',
'glprototypes/fbo.h',
'glprototypes/fixedfunction.h',
'glprototypes/gles.h',
'glprototypes/gstgl_compat.h',
'glprototypes/gstgl_gles2compat.h',
'glprototypes/opengl.h',
'glprototypes/query.h',
'glprototypes/shaders.h',
'glprototypes/sync.h',
'glprototypes/vao.h',
]
gl_x11_sources = []
gl_x11_headers = []
gl_wayland_sources = []
gl_wayland_headers = []
gl_egl_sources = []
gl_egl_headers = []
glconf = configuration_data()
glconf_options = [
'GST_GL_HAVE_OPENGL',
'GST_GL_HAVE_GLES2',
'GST_GL_HAVE_GLES3',
'GST_GL_HAVE_GLES3EXT3_H',
'GST_GL_HAVE_WINDOW_X11',
'GST_GL_HAVE_WINDOW_COCOA',
'GST_GL_HAVE_WINDOW_WIN32',
'GST_GL_HAVE_WINDOW_WINRT',
'GST_GL_HAVE_WINDOW_WAYLAND',
'GST_GL_HAVE_WINDOW_ANDROID',
'GST_GL_HAVE_WINDOW_DISPMANX',
'GST_GL_HAVE_WINDOW_EAGL',
'GST_GL_HAVE_WINDOW_VIV_FB',
'GST_GL_HAVE_WINDOW_GBM',
'GST_GL_HAVE_PLATFORM_EGL',
'GST_GL_HAVE_PLATFORM_GLX',
'GST_GL_HAVE_PLATFORM_WGL',
'GST_GL_HAVE_PLATFORM_CGL',
'GST_GL_HAVE_PLATFORM_EAGL',
'GST_GL_HAVE_DMABUF',
'GST_GL_HAVE_VIV_DIRECTVIV',
'GST_GL_HAVE_GLEGLIMAGEOES',
'GST_GL_HAVE_GLCHAR',
'GST_GL_HAVE_GLSIZEIPTR',
'GST_GL_HAVE_GLINTPTR',
'GST_GL_HAVE_GLSYNC',
'GST_GL_HAVE_GLUINT64',
'GST_GL_HAVE_GLINT64',
'GST_GL_HAVE_EGLATTRIB',
'GST_GL_HAVE_EGLUINT64KHR',
]
foreach option : glconf_options
glconf.set10(option, false)
endforeach
unneeded_dep = dependency('', required : false)
if unneeded_dep.found()
error ('Found unfindable dependency')
endif
# OpenGL/GLES2 libraries
gl_lib_deps = []
# GL platform - EGL, GLX, CGL, WGL, etc
gl_platform_deps = []
# GL winsys - wayland, X11, Cocoa, win32, etc
gl_winsys_deps = []
# other things we need.
gl_misc_deps = []
# Other preprocessor arguments
gl_cpp_args = []
gl_includes = []
gl_objc_args = []
enabled_gl_apis = []
enabled_gl_platforms = []
enabled_gl_winsys = []
# parse provided options
libegl_module_name = get_option('egl_module_name')
if libegl_module_name != ''
gl_cpp_args += ['-DGST_GL_LIBEGL_MODULE_NAME="@0@"'.format(libegl_module_name)]
endif
libgles2_module_name = get_option('gles2_module_name')
if libgles2_module_name != ''
gl_cpp_args += ['-DGST_GL_LIBGLESV2_MODULE_NAME="@0@"'.format(libgles2_module_name)]
endif
libgl_module_name = get_option('opengl_module_name')
if libgl_module_name != ''
gl_cpp_args += ['-DGST_GL_LIBGL_MODULE_NAME="@0@"'.format(libgl_module_name)]
endif
gl_apis = get_option('gl_api')
if gl_apis.contains('auto')
need_api_opengl = 'auto'
need_api_gles2 = 'auto'
else
need_api_opengl = 'no'
need_api_gles2 = 'no'
foreach api : gl_apis
if api == 'opengl'
need_api_opengl = 'yes'
elif api == 'gles2'
need_api_gles2 = 'yes'
else
error('Unsupported GL api provided ' + api)
endif
endforeach
endif
gl_platforms = get_option('gl_platform')
if gl_platforms.contains('auto')
need_platform_egl = 'auto'
need_platform_glx = 'auto'
need_platform_cgl = 'auto'
need_platform_wgl = 'auto'
need_platform_eagl = 'auto'
else
need_platform_egl = 'no'
need_platform_glx = 'no'
need_platform_cgl = 'no'
need_platform_wgl = 'no'
need_platform_eagl = 'no'
foreach platform : gl_platforms
if platform == 'egl'
need_platform_egl = 'yes'
elif platform == 'glx'
need_platform_glx = 'yes'
elif platform == 'cgl'
need_platform_cgl = 'yes'
elif platform == 'wgl'
need_platform_wgl = 'yes'
2018-08-02 05:59:20 +00:00
elif platform == 'eagl'
need_platform_eagl = 'yes'
else
error('Unsupported GL platform provided ' + platform)
endif
endforeach
endif
gl_winsys = get_option('gl_winsys')
if gl_winsys.contains('auto')
need_win_x11 = 'auto'
need_win_wayland = 'auto'
need_win_win32 = 'auto'
need_win_winrt = 'auto'
need_win_cocoa = 'auto'
2019-12-16 18:49:09 +00:00
need_win_egl = 'auto'
need_win_eagl = 'auto'
need_win_dispmanx = 'auto'
need_win_viv_fb = 'auto'
need_win_gbm = 'auto'
need_win_android = 'auto'
else
need_win_x11 = 'no'
need_win_wayland = 'no'
need_win_win32 = 'no'
need_win_winrt = 'no'
need_win_cocoa = 'no'
2019-12-16 18:49:09 +00:00
need_win_egl = 'no'
need_win_eagl = 'no'
need_win_dispmanx = 'no'
need_win_viv_fb = 'no'
need_win_gbm = 'no'
need_win_android = 'no'
foreach winsys : gl_winsys
if winsys == 'x11'
need_win_x11 = 'yes'
elif winsys == 'wayland'
need_win_wayland = 'yes'
elif winsys == 'win32'
need_win_win32 = 'yes'
elif winsys == 'winrt'
need_win_winrt = 'yes'
elif winsys == 'cocoa'
need_win_cocoa = 'yes'
2019-12-16 18:49:09 +00:00
elif winsys == 'egl'
need_win_egl = 'yes'
2018-08-02 05:59:20 +00:00
elif winsys == 'eagl'
need_win_eagl = 'yes'
elif winsys == 'dispmanx'
need_win_dispmanx = 'yes'
elif winsys == 'viv-fb'
need_win_viv_fb = 'yes'
elif winsys == 'gbm'
need_win_gbm = 'yes'
elif winsys == 'android'
need_win_android = 'yes'
else
error('Unsupported GL winsys provided ' + winsys)
endif
endforeach
endif
gl_include_header = '''
#ifdef __GNUC__
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wredundant-decls"
#endif
#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES 1
#endif
'''
# convoluted way of getting at the subproject taking into account the wrap-mode
# so we don't download a subproject unless allowed
gl_header_dep = dependency('', fallback : ['gl-headers', 'gl_headers_dummy_dep'],
required : false)
if gl_header_dep.type_name() == 'internal'
# this will only contain the includes of headers that are not found
compat_includes = subproject('gl-headers').get_variable('compatibility_includes')
else
compat_includes = []
endif
# Desktop OpenGL checks
gl_dep = unneeded_dep
glx_dep = unneeded_dep
if need_api_opengl != 'no' or need_platform_glx != 'no'
2018-08-02 05:59:20 +00:00
if host_system == 'darwin'
gl_dep = dependency('appleframeworks', modules : ['OpenGL'], required : false)
else
# override meson's braindead gl detection on osx/windows/etc by forcing pkg-config
gl_dep = dependency('gl', method: 'pkg-config', required : false)
endif
if not gl_dep.found()
2018-08-02 05:59:20 +00:00
if host_system == 'windows'
gl_dep = cc.find_library('opengl32', required : false)
else
gl_dep = cc.find_library('GL', required : false)
endif
if not cc.has_header('GL/gl.h', include_directories : compat_includes)
gl_dep = unneeded_dep
endif
if not gl_dep.found() and need_api_opengl == 'yes'
error ('Could not find requested OpenGL library')
endif
if gl_dep.found()
gl_includes += [compat_includes]
endif
endif
if host_system == 'darwin'
glx_dep = cc.find_library('GL', required : false)
else
glx_dep = gl_dep
endif
if need_api_opengl == 'no'
gl_dep = unneeded_dep
endif
if need_platform_glx == 'no'
glx_dep = unneeded_dep
endif
opengl_includes = ''
2018-08-02 05:59:20 +00:00
if host_system == 'darwin'
opengl_includes += '''
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
# define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
# include <OpenGL/gl3.h>
#endif
'''
else
opengl_includes += '''
#if _MSC_VER
# include <windows.h>
#endif
#include <GL/gl.h>
#if __WIN32__ || _WIN32
# include <GL/glext.h>
#endif
'''
endif
endif
bcm_host_dep = unneeded_dep
if need_win_dispmanx != 'no'
# Try pkg-config for bcm_host then fallback to find_library to also
# support older distribution
bcm_host_dep = dependency('bcm_host', required : false)
if not bcm_host_dep.found()
bcm_host_dep = cc.find_library('bcm_host', required : false)
endif
endif
# GLES2 checks
gles2_dep = unneeded_dep
gles3_h = false
gles3ext3_h = false
if need_api_gles2 != 'no'
2018-08-02 05:59:20 +00:00
if host_system == 'ios'
gles2_dep = dependency('appleframeworks', modules : ['OpenGLES'], required : false)
else
if bcm_host_dep.found()
gles2_dep = dependency('brcmglesv2', required : false)
endif
if not gles2_dep.found()
gles2_dep = dependency('glesv2', required : false)
endif
2018-08-02 05:59:20 +00:00
endif
if not gles2_dep.found()
2018-08-02 05:59:20 +00:00
# if host_system == 'windows'
# elif host_system == ios
# gles2_dep = cc.find_library('GLESv2', required : false)
# else
gles2_dep = cc.find_library('GLESv2', required : false)
# endif
2018-08-02 05:59:20 +00:00
if not cc.has_header('GLES2/gl2.h', include_directories : compat_includes)
gles2_dep = unneeded_dep
endif
if not gles2_dep.found() and need_api_gles2 == 'yes'
error ('Could not find requested OpenGL ES library')
endif
if gles2_dep.found()
gl_includes += [compat_includes]
endif
endif
gles3_h = gles2_dep.found() and cc.has_header('GLES3/gl3.h', dependencies : gles2_dep, include_directories : compat_includes)
2018-08-02 05:59:20 +00:00
gles_includes = ''
if host_system == 'ios'
gles_includes += '''
# include <OpenGLES/ES2/gl.h>
# include <OpenGLES/ES2/glext.h>
2018-08-02 05:59:20 +00:00
'''
else
if gles3_h
gl_includes += [compat_includes]
gles3ext3_h = gles3_h and cc.has_header('GLES3/gl3ext.h', dependencies : gles2_dep, include_directories : compat_includes)
gles_includes += '''
# include <GLES3/gl3.h>
# include <GLES2/gl2ext.h>'''
2018-08-02 05:59:20 +00:00
if gles3ext3_h
gles_includes += '''
# include <GLES3/gl3ext.h>'''
2018-08-02 05:59:20 +00:00
endif
else
gles_includes += '''
# include <GLES2/gl2.h>
# include <GLES2/gl2ext.h>'''
2018-08-02 05:59:20 +00:00
endif
endif
endif
# can we include both gles2 and opengl headers?
if gles2_dep.found() and gl_dep.found()
gl_include_block = gl_include_header + gles_includes + opengl_includes
# TODO: Revert to passing gl_include_block via prefix: once
# https://github.com/mesonbuild/meson/issues/2364 is fixed
if not cc.compiles(gl_include_block + '\n' + 'void f (void) {}',dependencies : [gles2_dep, gl_dep], include_directories : compat_includes)
message ('Cannot include both OpenGL and OpenGL ES headers')
if need_api_gles2 != 'yes'
gles2_dep = unneeded_dep
elif need_api_opengl != 'yes'
gl_dep = unneeded_dep
else
error('Both OpenGL and OpenGL ES were requested but cannot be included together')
endif
endif
endif
gl_include_block = gl_include_header
if gles2_dep.found()
gl_include_block += gles_includes
endif
if gl_dep.found()
gl_include_block += opengl_includes
endif
if gles2_dep.found()
gl_lib_deps += gles2_dep
glconf.set10('GST_GL_HAVE_GLES2', 1)
if gles3_h
glconf.set10('GST_GL_HAVE_GLES3', 1)
if gles3ext3_h
glconf.set10('GST_GL_HAVE_GLES3EXT3_H', 1)
endif
endif
enabled_gl_apis += 'gles2'
endif
if gl_dep.found()
gl_lib_deps += gl_dep
glconf.set10('GST_GL_HAVE_OPENGL', 1)
enabled_gl_apis += 'gl'
endif
# EGL checks
egl_dep = unneeded_dep
if need_platform_egl != 'no'
if bcm_host_dep.found()
egl_dep = dependency('brcmegl', required : false)
endif
if not egl_dep.found()
egl_dep = dependency('egl', required : false)
endif
if not egl_dep.found()
egl_dep = cc.find_library('EGL', required : false)
endif
if egl_dep.found() and not cc.has_header('EGL/egl.h',
dependencies : egl_dep,
include_directories : compat_includes)
egl_dep = unneeded_dep
endif
if egl_dep.found() and not cc.has_header('EGL/eglext.h',
dependencies : egl_dep,
include_directories : compat_includes)
egl_dep = unneeded_dep
endif
if egl_dep.found()
gl_egl_sources += [
'egl/gstegl.c',
'egl/gsteglimage.c',
'egl/gstglcontext_egl.c',
'egl/gstgldisplay_egl.c',
'egl/gstglmemoryegl.c',
'egl/gstgldisplay_egl_device.c',
]
gl_egl_headers += [
'egl/egl.h',
'egl/gstegl.h',
'egl/gsteglimage.h',
'egl/gstgldisplay_egl.h',
'egl/gstglmemoryegl.h',
'egl/gstgldisplay_egl_device.h',
]
gl_platform_deps += egl_dep
glconf.set10('GST_GL_HAVE_PLATFORM_EGL', 1)
if cc.has_header('libdrm/drm_fourcc.h')
gl_misc_deps += allocators_dep
glconf.set10('GST_GL_HAVE_DMABUF', 1)
endif
egl_includes = '''
#include <EGL/egl.h>
#include <EGL/eglext.h>
'''
enabled_gl_platforms += 'egl'
elif need_platform_egl == 'yes'
error ('Could not find requested EGL library')
endif
endif
2019-12-16 18:49:09 +00:00
# winsys_egl checks
if need_win_egl == 'yes'
if need_platform_egl == 'no'
error('Impossible situation requested: Cannot use Winsys egl without EGL support')
elif not egl_dep.found()
error ('Could not find EGL libraries for Winsys egl')
else
enabled_gl_winsys += 'egl'
endif
endif
# wayland checks
wayland_client_dep = unneeded_dep
wayland_cursor_dep = unneeded_dep
wayland_egl_dep = unneeded_dep
if need_win_wayland != 'no'
if need_win_wayland == 'yes'
if need_platform_egl == 'no'
error('Impossible situation requested: Cannot use Wayland without EGL support')
endif
endif
if not egl_dep.found()
if need_win_wayland == 'yes'
error ('Could not find EGL libraries for wayland')
else
message ('Could not find EGL libraries for wayland')
endif
else
wayland_client_dep = dependency('wayland-client', version : '>= 1.11', required : false)
wayland_cursor_dep = dependency('wayland-cursor', version : '>= 1.0', required : false)
wayland_egl_dep = dependency('wayland-egl', version : '>= 1.0', required : false)
wayland_protocols_dep = dependency('wayland-protocols', version : '>= 1.15', required : false)
wayland_scanner = find_program('wayland-scanner', required: false)
if wayland_client_dep.found() and wayland_cursor_dep.found() and wayland_egl_dep.found() and wayland_protocols_dep.found() and wayland_scanner.found()
# Generate the XDG shell interface
wayland_protocols_basedir = wayland_protocols_dep.get_pkgconfig_variable('pkgdatadir')
xdg_shell_xml_spec = join_paths(wayland_protocols_basedir, 'stable', 'xdg-shell', 'xdg-shell.xml')
xdg_shell_header = custom_target('xdg-shell-client-header',
command: [ wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@' ],
input: xdg_shell_xml_spec,
output: 'xdg-shell-client-protocol.h',
)
xdg_shell_code = custom_target('xdg-shell-client-code',
command: [ wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@' ],
input: xdg_shell_xml_spec,
output: 'xdg-shell-client-protocol.c',
)
gl_wayland_sources += [
'wayland/gstgldisplay_wayland.c',
]
gl_priv_sources += [
'wayland/gstglwindow_wayland_egl.c',
'wayland/wayland_event_source.c',
xdg_shell_header,
xdg_shell_code,
]
gl_wayland_headers += [
'wayland/wayland.h',
'wayland/gstgldisplay_wayland.h'
]
glconf.set('GST_GL_HAVE_WINDOW_WAYLAND', 1)
gl_winsys_deps += [wayland_client_dep, wayland_cursor_dep, wayland_egl_dep]
enabled_gl_winsys += 'wayland'
else
if need_win_wayland == 'yes'
error ('Could not find requested Wayland libraries')
endif
wayland_client_dep = unneeded_dep
wayland_cursor_dep = unneeded_dep
wayland_egl_dep = unneeded_dep
wayland_protocols_dep = unneeded_dep
endif
endif
endif
# X11 checks
if need_platform_glx == 'yes'
if need_win_x11 == 'no'
error('Impossible situation requested: Cannot use GLX without X11 support')
elif need_api_opengl == 'no'
error('Impossible situation requested: Cannot use GLX without the OpenGL library')
endif
endif
if need_win_x11 != 'no'
xcb_dep = dependency('x11-xcb', required : false)
if x11_dep.found() and xcb_dep.found()
gl_x11_sources += [
'x11/gstgldisplay_x11.c',
]
gl_priv_sources += [
'x11/gstglwindow_x11.c',
'x11/xcb_event_source.c',
]
gl_x11_headers += [
'x11/x11.h',
'x11/gstgldisplay_x11.h',
]
glconf.set('GST_GL_HAVE_WINDOW_X11', 1)
gl_winsys_deps += [x11_dep, xcb_dep]
enabled_gl_winsys += 'x11'
if need_platform_glx != 'no' and glx_dep.found() and cc.has_function ('glXMakeCurrent', dependencies : glx_dep)
glconf.set('GST_GL_HAVE_PLATFORM_GLX', 1)
gl_priv_sources += [
'x11/gstglcontext_glx.c',
]
# GLX is in the opengl library on linux
gl_platform_deps += glx_dep
enabled_gl_platforms += 'glx'
endif
elif need_win_x11 == 'yes'
error ('Could not find requested X11 libraries')
endif
endif
if need_win_dispmanx != 'no'
if bcm_host_dep.found()
if not egl_dep.found()
error('dispmanx requires the use of egl')
endif
gl_priv_sources += [
'dispmanx/gstglwindow_dispmanx_egl.c'
]
glconf.set('GST_GL_HAVE_WINDOW_DISPMANX', 1)
gl_winsys_deps += bcm_host_dep
enabled_gl_winsys += 'dispmanx'
gl_cpp_args += ['-DUSE_EGL_RPI']
elif need_win_dispmanx == 'yes'
error('Could not find dispmanx libraries')
endif
endif
# win32 checks
if need_platform_wgl == 'yes'
if need_win_win32 == 'no'
error('Impossible situation requested: Cannot use WGL without the win32 window system')
endif
endif
if host_system == 'windows' and need_win_win32 != 'no'
gdi_dep = cc.find_library('gdi32', required : false)
if gdi_dep.found()
have_wgl = false
have_egl_win32 = false
if need_platform_wgl != 'no'
wglext_h = cc.has_header('GL/wglext.h',
prefix : '''#include <windows.h>
#include <GL/gl.h>''',
include_directories : compat_includes)
have_wgl = wglext_h and gl_dep.found()
endif
have_egl_win32 = enabled_gl_platforms.contains('egl') and gles2_dep.found()
if have_wgl or have_egl_win32
gl_includes += [compat_includes]
gl_platform_deps += gdi_dep
gl_priv_sources += [
'win32/gstglwindow_win32.c',
]
enabled_gl_winsys += 'win32'
gl_winsys_deps += gdi_dep
glconf.set('GST_GL_HAVE_WINDOW_WIN32', 1)
endif
if have_wgl
gl_priv_sources += [
'wgl/gstglcontext_wgl.c',
]
enabled_gl_platforms += 'wgl'
glconf.set('GST_GL_HAVE_PLATFORM_WGL', 1)
endif
endif
endif
# WinRT ANGLE checks
if need_win_winrt != 'no' and host_system == 'windows'
if need_win_winrt == 'yes' and not enabled_gl_platforms.contains('egl')
error('Impossible situation requested: Cannot use WinRT ANGLE without EGL support')
endif
if egl_dep.found()
windows_graphics_h = cc.has_header('windows.graphics.h')
windows_app_dep = cc.find_library('WindowsApp', required: false)
runtimeobject_lib = cc.find_library('runtimeobject', required: false)
if windows_graphics_h and windows_app_dep.found() and runtimeobject_lib.found()
enabled_gl_winsys += 'winrt'
glconf.set10('GST_GL_HAVE_WINDOW_WINRT', 1)
gl_priv_sources += [
'winrt/gstglwindow_winrt_egl.cpp'
]
gl_winsys_deps += runtimeobject_lib
elif need_win_winrt == 'yes'
error('WinRT is enabled, but headers/libraries were not found')
endif
elif need_win_winrt == 'yes'
error('WinRT ANGLE is enabled, but EGL was not found')
else
message('WinRT ANGLE disabled because EGL was not found')
endif
endif
if ['darwin', 'ios'].contains(host_system)
if not have_objc
error('No ObjC compiler found')
endif
objc = meson.get_compiler('objc')
if not objc.has_argument('-fobjc-arc')
error('ARC is required for building')
endif
gl_objc_args += ['-fobjc-arc']
2018-08-02 05:59:20 +00:00
endif
# OSX check
if need_platform_cgl == 'yes'
if need_win_cocoa == 'no'
error('Impossible situation requested: Cannot use CGL without Cocoa support')
elif need_api_opengl == 'no'
error('Impossible situation requested: Cannot use CGL without the OpenGL library')
endif
elif need_platform_cgl == 'no' and need_win_cocoa == 'yes'
error('Impossible situation requested: Cannot use Cocoa without CGL support')
endif
2018-08-02 05:59:20 +00:00
if host_system == 'darwin'
foundation_dep = dependency('appleframeworks', modules : ['Foundation'], required : false)
quartzcore_dep = dependency('appleframeworks', modules : ['QuartzCore'], required : false)
corefoundation_dep = dependency('appleframeworks', modules : ['CoreFoundation'], required : false)
if need_platform_cgl != 'no'
2018-08-02 05:59:20 +00:00
if foundation_dep.found() and quartzcore_dep.found() and corefoundation_dep.found()
gl_platform_deps += [quartzcore_dep, corefoundation_dep, foundation_dep]
enabled_gl_platforms += 'cgl'
glconf.set10('GST_GL_HAVE_PLATFORM_CGL', 1)
if need_win_cocoa != 'no'
2018-08-02 05:59:20 +00:00
cocoa_dep = dependency('appleframeworks', modules : ['Cocoa'], required : false)
if cocoa_dep.found()
gl_priv_sources += [
'cocoa/gstglcaopengllayer.m',
'cocoa/gstglcontext_cocoa.m',
'cocoa/gstgldisplay_cocoa.m',
'cocoa/gstglwindow_cocoa.m'
]
gl_winsys_deps += cocoa_dep
enabled_gl_winsys += 'cocoa'
glconf.set10('GST_GL_HAVE_WINDOW_COCOA', 1)
elif need_win_cocoa == 'yes'
error('Could not find Cocoa')
endif
endif
elif need_platform_cgl == 'yes'
error('Could not find CGL dependencies')
endif
endif
endif
2018-08-02 05:59:20 +00:00
if need_platform_eagl == 'yes'
if host_system != 'ios'
error('Can only use EAGL on iOS')
endif
if need_win_eagl == 'no'
error('Impossible situation requested: Cannot use EAGL platform without the EAGL window system')
elif need_api_gles == 'no'
error('Impossible situation requested: Cannot use EAGL platform without the GLES library')
endif
elif need_platform_eagl == 'no' and need_win_eagl == 'yes'
error('Impossible situation requested: Cannot use EAGL window system without the EAGL platform')
endif
if host_system == 'ios' and need_platform_eagl != 'no' and need_win_eagl != 'no'
foundation_dep = dependency('appleframeworks', modules : ['Foundation'], required : false)
corefoundation_dep = dependency('appleframeworks', modules : ['CoreFoundation'], required : false)
coregraphics_dep = dependency('appleframeworks', modules : ['CoreGraphics'], required : false)
quartzcore_dep = dependency('appleframeworks', modules : ['QuartzCore'], required : false)
2018-08-02 05:59:20 +00:00
uikit_dep = dependency('appleframeworks', modules : ['UIkit'], required : false)
if foundation_dep.found() and corefoundation_dep.found() and coregraphics_dep.found() and quartzcore_dep.found() and uikit_dep.found()
2018-08-02 05:59:20 +00:00
gl_platform_deps += [
corefoundation_dep,
foundation_dep,
coregraphics_dep,
quartzcore_dep,
2018-08-02 05:59:20 +00:00
uikit_dep,
]
gl_priv_sources += [
2018-08-02 05:59:20 +00:00
'eagl/gstglcontext_eagl.m',
'eagl/gstglwindow_eagl.m',
]
enabled_gl_winsys += 'eagl'
enabled_gl_platforms += 'eagl'
glconf.set('GST_GL_HAVE_WINDOW_EAGL', 1)
glconf.set('GST_GL_HAVE_PLATFORM_EAGL', 1)
elif need_platform_eagl == 'yes' or need_win_eagl == 'yes'
error('Could not find dependencies for EAGL')
endif
endif
# GBM Checks
gbm_gudev_dep = unneeded_dep
gbm_libdrm_dep = unneeded_dep
gbm_dep = unneeded_dep
if need_win_gbm != 'no'
if need_win_gbm == 'yes'
if need_platform_egl == 'no'
error('Impossible situation requested: Cannot use GBM without EGL support')
endif
endif
gbm_gudev_dep = dependency('gudev-1.0', version : '>=147', required : false)
gbm_libdrm_dep = dependency('libdrm', version : '>= 2.4.55', required : false)
gbm_dep = dependency('gbm', required : false)
if egl_dep.found() and gbm_gudev_dep.found() and gbm_libdrm_dep.found() and gbm_dep.found()
gl_priv_sources += [
'gbm/gstgldisplay_gbm.c',
'gbm/gstgl_gbm_utils.c',
'gbm/gstglwindow_gbm_egl.c',
]
enabled_gl_winsys += 'gbm'
gl_winsys_deps += [gbm_gudev_dep, gbm_libdrm_dep, gbm_dep]
glconf.set('GST_GL_HAVE_WINDOW_GBM', 1)
else
if need_win_gbm == 'yes'
error ('Could not find requested GBM libraries')
endif
gbm_gudev_dep = unneeded_dep
gbm_libdrm_dep = unneeded_dep
gbm_dep = unneeded_dep
endif
endif
if need_platform_egl != 'no' and need_win_viv_fb != 'no'
if egl_dep.found() and cc.has_function ('fbGetDisplay', dependencies : egl_dep)
if cc.has_function ('glTexDirectVIV', dependencies : gles2_dep)
enabled_gl_winsys += 'viv-fb'
glconf.set10('GST_GL_HAVE_WINDOW_VIV_FB', 1)
glconf.set10('GST_GL_HAVE_VIV_DIRECTVIV', 1)
gl_priv_sources += [
'viv-fb/gstgldisplay_viv_fb.c',
'viv-fb/gstglwindow_viv_fb_egl.c',
]
gl_cpp_args += ['-DEGL_API_FB']
endif
endif
endif
if need_win_android == 'yes'
if need_platform_egl == 'no'
error('Impossible situation requested: Cannot build for Android without EGL')
elif need_api_gles2 == 'no'
error('Impossible situation requested: Cannot build for Android without GLES2 support')
elif host_system != 'android'
error('Impossible situation requested: Cannot build for Android without an android system')
endif
endif
if host_system == 'android' and need_win_android != 'no' and need_platform_egl != 'no'
if gles2_dep.found() and egl_dep.found()
enabled_gl_winsys += ['android']
glconf.set10('GST_GL_HAVE_WINDOW_ANDROID', 1)
gl_priv_sources += [
'android/gstglwindow_android_egl.c'
]
endif
endif
# TODO: Add rest of gl config here.
# iOS, specific support
build_gstgl = true
if enabled_gl_apis.length() == 0
message('No OpenGL API libraries found or requested')
build_gstgl = false
endif
if enabled_gl_platforms.length() == 0
message('No OpenGL Platforms found or requested')
build_gstgl = false
endif
if enabled_gl_winsys.length() == 0
message('No OpenGL Window systems found or requested')
build_gstgl = false
endif
gstgl_dep = dependency('', required : false)
gstglproto_dep = dependency('', required : false)
gstglx11_dep = dependency('', required : false)
gstglwayland_dep = dependency('', required : false)
gstglegl_dep = dependency('', required : false)
if build_gstgl
# find some types that may or may not be defined
if cc.has_type('GLeglImageOES', prefix : gl_include_block, dependencies : gl_lib_deps, include_directories : gl_includes)
glconf.set('GST_GL_HAVE_GLEGLIMAGEOES', 1)
endif
if cc.has_type('GLchar', prefix : gl_include_block, dependencies : gl_lib_deps, include_directories : gl_includes)
glconf.set('GST_GL_HAVE_GLCHAR', 1)
endif
if cc.has_type('GLsizeiptr', prefix : gl_include_block, dependencies : gl_lib_deps, include_directories : gl_includes)
glconf.set('GST_GL_HAVE_GLSIZEIPTR', 1)
endif
if cc.has_type('GLintptr', prefix : gl_include_block, dependencies : gl_lib_deps, include_directories : gl_includes)
glconf.set('GST_GL_HAVE_GLINTPTR', 1)
endif
if cc.has_type('GLsync', prefix : gl_include_block, dependencies : gl_lib_deps, include_directories : gl_includes)
glconf.set('GST_GL_HAVE_GLSYNC', 1)
endif
if cc.has_type('GLuint64', prefix : gl_include_block, dependencies : gl_lib_deps, include_directories : gl_includes)
glconf.set('GST_GL_HAVE_GLUINT64', 1)
endif
if cc.has_type('GLint64', prefix : gl_include_block, dependencies : gl_lib_deps, include_directories : gl_includes)
glconf.set('GST_GL_HAVE_GLINT64', 1)
endif
if egl_dep.found() and cc.has_type('EGLAttrib', prefix : gl_include_block + egl_includes, dependencies : gl_lib_deps + [egl_dep], include_directories : gl_includes)
glconf.set('GST_GL_HAVE_EGLATTRIB', 1)
endif
if egl_dep.found() and cc.has_type('EGLuint64KHR', prefix : gl_include_block + egl_includes, dependencies : gl_lib_deps + [egl_dep], include_directories : gl_includes)
glconf.set('GST_GL_HAVE_EGLUINT64KHR', 1)
endif
summary('GL api', enabled_gl_apis, list_sep: ', ')
summary('GL platform', enabled_gl_platforms, list_sep: ', ')
summary('GL winsys', enabled_gl_winsys, list_sep: ', ')
install_headers(gl_headers, subdir : 'gstreamer-1.0/gst/gl')
install_headers(gl_prototype_headers, subdir : 'gstreamer-1.0/gst/gl/glprototypes')
configure_file(input : 'gstglconfig.h.meson',
output : 'gstglconfig.h',
install_dir : get_option('libdir') + '/gstreamer-1.0/include/gst/gl',
configuration : glconf)
glib_mkenums = find_program('glib-mkenums')
mkenums = find_program('gl_mkenum.py')
gl_enumtypes_h = custom_target('gstglenumtypes_h',
output : 'gl-enumtypes.h',
input : gir_gl_headers,
install : true,
install_dir : join_paths(get_option('includedir'), 'gstreamer-1.0/gst/gl/'),
command : [mkenums, glib_mkenums, '@OUTPUT@', '@INPUT@'])
gl_enumtypes_c = custom_target('gstglenumtypes_c',
output : 'gl-enumtypes.c',
input : gir_gl_headers,
depends : [gl_enumtypes_h],
command : [mkenums, glib_mkenums, '@OUTPUT@', '@INPUT@'])
gen_sources = [gl_enumtypes_h]
gstgl = library('gstgl-' + api_version,
gl_sources, gl_egl_sources, gl_x11_sources, gl_wayland_sources, gl_priv_sources, gl_enumtypes_c, gl_enumtypes_h,
libs: fix API export/import and 'inconsistent linkage' on MSVC For each lib we build export its own API in headers when we're building it, otherwise import the API from the headers. This fixes linker warnings on Windows when building with MSVC. The problem was that we had defined all GST_*_API decorators unconditionally to GST_EXPORT. This was intentional and only supposed to be temporary, but caused linker warnings because we tell the linker that we want to export all symbols even those from externall DLLs, and when the linker notices that they were in external DLLS and not present locally it warns. What we need to do when building each library is: export the library's own symbols and import all other symbols. To this end we define e.g. BUILDING_GST_FOO and then we define the GST_FOO_API decorator either to export or to import symbols depending on whether BUILDING_GST_FOO is set or not. That way external users of each library API automatically get the import. While we're at it, add new GST_API_EXPORT in config.h and use that for GST_*_API decorators instead of GST_EXPORT. The right export define depends on the toolchain and whether we're using -fvisibility=hidden or not, so it's better to set it to the right thing directly than hard-coding a compiler whitelist in the public header. We put the export define into config.h instead of passing it via the command line to the compiler because it might contain spaces and brackets and in the autotools scenario we'd have to pass that through multiple layers of plumbing and Makefile/shell escaping and we're just not going to be *that* lucky. The export define is only used if we're compiling our lib, not by external users of the lib headers, so it's not a problem to put it into config.h Also, this means all .c files of libs need to include config.h to get the export marker defined, so fix up a few that didn't include config.h. This commit depends on a common submodule commit that makes gst-glib-gen.mak add an #include "config.h" to generated enum/marshal .c files for the autotools build. https://bugzilla.gnome.org/show_bug.cgi?id=797185
2018-04-28 13:50:11 +00:00
c_args : gst_plugins_base_args + gl_cpp_args + ['-DBUILDING_GST_GL'],
cpp_args : gst_plugins_base_args + gl_cpp_args + ['-DBUILDING_GST_GL'],
libs: fix API export/import and 'inconsistent linkage' on MSVC For each lib we build export its own API in headers when we're building it, otherwise import the API from the headers. This fixes linker warnings on Windows when building with MSVC. The problem was that we had defined all GST_*_API decorators unconditionally to GST_EXPORT. This was intentional and only supposed to be temporary, but caused linker warnings because we tell the linker that we want to export all symbols even those from externall DLLs, and when the linker notices that they were in external DLLS and not present locally it warns. What we need to do when building each library is: export the library's own symbols and import all other symbols. To this end we define e.g. BUILDING_GST_FOO and then we define the GST_FOO_API decorator either to export or to import symbols depending on whether BUILDING_GST_FOO is set or not. That way external users of each library API automatically get the import. While we're at it, add new GST_API_EXPORT in config.h and use that for GST_*_API decorators instead of GST_EXPORT. The right export define depends on the toolchain and whether we're using -fvisibility=hidden or not, so it's better to set it to the right thing directly than hard-coding a compiler whitelist in the public header. We put the export define into config.h instead of passing it via the command line to the compiler because it might contain spaces and brackets and in the autotools scenario we'd have to pass that through multiple layers of plumbing and Makefile/shell escaping and we're just not going to be *that* lucky. The export define is only used if we're compiling our lib, not by external users of the lib headers, so it's not a problem to put it into config.h Also, this means all .c files of libs need to include config.h to get the export marker defined, so fix up a few that didn't include config.h. This commit depends on a common submodule commit that makes gst-glib-gen.mak add an #include "config.h" to generated enum/marshal .c files for the autotools build. https://bugzilla.gnome.org/show_bug.cgi?id=797185
2018-04-28 13:50:11 +00:00
objc_args : gst_plugins_base_args + gl_cpp_args + gl_objc_args + ['-DBUILDING_GST_GL'],
include_directories : [configinc, libsinc, gl_includes],
version : libversion,
soversion : soversion,
darwin_versions : osxversion,
install : true,
dependencies : [gst_base_dep, video_dep, allocators_dep, gmodule_dep,
gl_lib_deps, gl_platform_deps, gl_winsys_deps, gl_misc_deps],
# don't confuse EGL/egl.h with gst-libs/gl/egl/egl.h on case-insensitive file systems
implicit_include_directories : false)
2018-04-08 00:52:12 +00:00
pkgconfig.generate(gstgl,
libraries : [gstvideo, gst_base_dep, gst_dep],
variables : pkgconfig_variables + [
'gl_platforms=' + ' '.join(enabled_gl_platforms),
'gl_winsys=' + ' '.join(enabled_gl_winsys),
'gl_apis=' + ' '.join(enabled_gl_apis),
],
subdirs : pkgconfig_subdirs,
extra_cflags : ['-I${libdir}/gstreamer-1.0/include'],
name : 'gstreamer-gl-1.0',
description : 'Streaming media framework, OpenGL plugins libraries',
)
pkgconfig.generate(gstgl,
libraries : [gstgl, gl_dep],
subdirs : pkgconfig_subdirs,
name : 'gstreamer-gl-prototypes-1.0',
description : 'Streaming media framework, OpenGL plugins libraries (OpenGL Prototypes)',
)
2017-01-23 15:12:06 +00:00
if build_gir
gl_gir = gnome.generate_gir(gstgl,
sources : gl_sources + [gl_enumtypes_h] + [gl_enumtypes_c] + gir_gl_headers,
2017-01-23 15:12:06 +00:00
namespace : 'GstGL',
nsversion : api_version,
identifier_prefix : 'Gst',
symbol_prefix : 'gst',
export_packages : 'gstreamer-gl-1.0',
includes : ['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0'],
install : true,
2017-12-09 20:16:48 +00:00
extra_args : gir_init_section + ['--c-include=gst/gl/gl.h'],
dependencies : [video_dep, gst_dep, gst_base_dep]
2017-01-23 15:12:06 +00:00
)
gen_sources += gl_gir
endif
gstgl_dep = declare_dependency(link_with : gstgl,
include_directories : [libsinc, compat_includes],
2017-01-23 15:12:06 +00:00
sources: gen_sources,
dependencies : [video_dep, gst_base_dep])
gstglproto_dep = declare_dependency(dependencies : [gstgl_dep] + gl_lib_deps)
2018-04-08 00:52:12 +00:00
meson.override_dependency('gstreamer-gl-1.0', gstgl_dep)
meson.override_dependency('gstreamer-gl-prototypes-1.0', gstglproto_dep)
if gl_x11_headers.length() > 0
install_headers(gl_x11_headers, subdir : 'gstreamer-1.0/gst/gl/x11')
2018-04-08 00:52:12 +00:00
pkgconfig.generate(
libraries : [gstgl],
requires: ['x11-xcb'],
subdirs : pkgconfig_subdirs,
name : 'gstreamer-gl-x11-1.0',
description : 'Streaming media framework, OpenGL plugins libraries (X11 specifics)',
)
gl_x11_gir = []
if build_gir
gl_x11_gir = gnome.generate_gir(gstgl,
sources : gl_x11_sources + gl_x11_headers,
namespace : 'GstGLX11',
nsversion : api_version,
identifier_prefix : 'Gst',
symbol_prefix : 'gst',
export_packages : 'gstreamer-gl-x11-1.0',
includes : ['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0', gl_gir[0]],
install : true,
extra_args : gir_init_section + ['--c-include=gst/gl/x11/x11.h'],
dependencies : [video_dep, gst_dep, gst_base_dep]
)
endif
gstglx11_dep = declare_dependency(dependencies : [gstgl_dep],
sources : gl_x11_gir)
2018-04-08 00:52:12 +00:00
meson.override_dependency('gstreamer-gl-x11-1.0', gstglx11_dep)
endif
if gl_wayland_headers.length() > 0
install_headers(gl_wayland_headers, subdir : 'gstreamer-1.0/gst/gl/wayland')
2018-04-08 00:52:12 +00:00
pkgconfig.generate(
libraries : [gstgl],
requires: ['wayland-egl', 'wayland-client'],
subdirs : pkgconfig_subdirs,
name : 'gstreamer-gl-wayland-1.0',
description : 'Streaming media framework, OpenGL plugins libraries (Wayland specifics)',
)
gl_wayland_gir = []
if build_gir
gl_wayland_gir = gnome.generate_gir(gstgl,
sources : gl_wayland_sources + gl_wayland_headers,
namespace : 'GstGLWayland',
nsversion : api_version,
identifier_prefix : 'Gst',
symbol_prefix : 'gst',
export_packages : 'gstreamer-gl-wayland-1.0',
includes : ['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0', gl_gir[0]],
install : true,
extra_args : gir_init_section + ['--c-include=gst/gl/wayland/wayland.h'],
dependencies : [video_dep, gst_dep, gst_base_dep]
)
endif
gstglwayland_dep = declare_dependency(dependencies : [gstgl_dep],
sources : gl_wayland_gir)
2018-04-08 00:52:12 +00:00
meson.override_dependency('gstreamer-gl-wayland-1.0', gstglwayland_dep)
endif
if gl_egl_headers.length() > 0
install_headers(gl_egl_headers, subdir : 'gstreamer-1.0/gst/gl/egl')
2018-04-08 00:52:12 +00:00
pkgconfig.generate(
libraries : [gstgl, egl_dep],
subdirs : pkgconfig_subdirs,
name : 'gstreamer-gl-egl-1.0',
description : 'Streaming media framework, OpenGL plugins libraries (EGL specifics)',
)
gl_egl_gir = []
if build_gir
gl_egl_gir = gnome.generate_gir(gstgl,
sources : gl_egl_sources + gl_egl_headers,
namespace : 'GstGLEGL',
nsversion : api_version,
identifier_prefix : 'Gst',
symbol_prefix : 'gst',
export_packages : 'gstreamer-gl-egl-1.0',
includes : ['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0', gl_gir[0]],
install : true,
extra_args : gir_init_section + ['--c-include=gst/gl/egl/egl.h'],
dependencies : [video_dep, gst_dep, gst_base_dep]
)
endif
gstglegl_dep = declare_dependency(dependencies : [gstgl_dep],
sources : gl_egl_gir)
2018-04-08 00:52:12 +00:00
meson.override_dependency('gstreamer-gl-egl-1.0', gstglegl_dep)
endif
elif get_option('gl').enabled()
error('GStreamer OpenGL integration required via options, but needed dependencies not found.')
endif