gl_sources = [ 'gstglapi.c', 'gstglbasefilter.c', 'gstglbasememory.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_headers = [ 'gl.h', 'gl-prelude.h', 'gstgl_enums.h', 'gstgl_fwd.h', 'gstglapi.h', 'gstglbasefilter.h', 'gstglbasememory.h', 'gstglbuffer.h', 'gstglbufferpool.h', 'gstglcolorconvert.h', 'gstglcontext.h', 'gstgldebug.h', 'gstgldisplay.h', 'gstglfeature.h', 'gstglfilter.h', 'gstglformat.h', 'gstglfuncs.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_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_headers = [] gl_wayland_headers = [] gl_win32_headers = [] gl_cocoa_headers = [] 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_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', ] foreach option : glconf_options glconf.set10(option, false) endforeach gmodule_dep = dependency('gmodule-no-export-2.0', fallback: ['glib', 'libgmodule_dep']) 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 = [] 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' # 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_cocoa = 'auto' need_win_eagl = 'auto' need_win_dispmanx = 'auto' need_win_viv_fb = 'auto' need_win_gbm = 'auto' else need_win_x11 = 'no' need_win_wayland = 'no' need_win_win32 = 'no' need_win_cocoa = 'no' need_win_eagl = 'no' need_win_dispmanx = 'no' need_win_viv_fb = 'no' need_win_gbm = '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 == 'cocoa' # need_win_cocoa = 'yes' # 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 = 'no' 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 # FIXME: dependency() needs a valid name to attempt to find otherwise meson # short-circuits and will always fail and never look into the fallback # subproject. https://github.com/mesonbuild/meson/issues/3754 gl_header_dep = dependency('gl-headers-not-findable', method : 'pkg-config', 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' # override meson's braindead gl detection on osx/windows/etc by forcing pkg-config gl_dep = dependency('gl', method: 'pkg-config', required : false) if not gl_dep.found() if host_machine.system() == 'windows' gl_dep = cc.find_library('opengl32', required : false) # elif host_machine.system() == 'darwin' # gl_dep = cc.find_library('OpenGL', 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 glx_dep = gl_dep if need_api_opengl == 'no' gl_dep = unneeded_dep endif if need_platform_glx == 'no' glx_dep = unneeded_dep endif opengl_includes = ''' #ifdef __APPLE__ # include # include # if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 # define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED # include # endif #else # if _MSC_VER # include # endif # include # if __WIN32__ || _WIN32 # include # endif #endif ''' endif # GLES2 checks gles2_dep = unneeded_dep gles3_h = false gles3ext3_h = false if need_api_gles2 != 'no' gles2_dep = dependency('glesv2', required : false) if not gles2_dep.found() # if host_machine.system() == 'windows' # elif host_machine.system() == 'darwin' # gles2_dep = cc.find_library('GLESv2', required : false) # else gles2_dep = cc.find_library('GLESv2', required : false) # endif 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) gles_includes = ''' #ifdef HAVE_IOS /* FIXME */ # include # include #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 # include ''' if gles3ext3_h gles_includes += ''' # include ''' endif else gles_includes += ''' # include # include ''' endif gles_includes += ''' #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 += 'opengl' endif # EGL checks egl_dep = unneeded_dep if need_platform_egl != 'no' egl_dep = dependency('egl', required : false) if not egl_dep.found() egl_dep = cc.find_library('EGL', required : false) if not egl_dep.found() and need_platform_egl == 'yes' error ('Could not find requested EGL library') endif endif if egl_dep.found() gl_sources += [ 'egl/gstegl.c', 'egl/gsteglimage.c', 'egl/gstglcontext_egl.c', 'egl/gstgldisplay_egl.c', 'egl/gstglmemoryegl.c', ] gl_egl_headers += [ 'egl/gstegl.h', 'egl/gsteglimage.h', 'egl/gstgldisplay_egl.h', 'egl/gstglmemoryegl.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 #include ''' enabled_gl_platforms += '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.0', required : false) wayland_cursor_dep = dependency('wayland-cursor', version : '>= 1.0', required : false) wayland_egl_dep = dependency('wayland-egl', version : '>= 1.0', required : false) if wayland_client_dep.found() and wayland_cursor_dep.found() and wayland_egl_dep.found() gl_sources += [ 'wayland/gstgldisplay_wayland.c', 'wayland/gstglwindow_wayland_egl.c', 'wayland/wayland_event_source.c', ] gl_wayland_headers += [ '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 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_sources += [ 'x11/gstgldisplay_x11.c', 'x11/gstglwindow_x11.c', 'x11/xcb_event_source.c', ] gl_x11_headers += [ '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() glconf.set('GST_GL_HAVE_PLATFORM_GLX', 1) gl_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 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 if bcm_host_dep.found() if not egl_dep.found() error('dispmanx requires the use of egl') endif gl_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 need_platform_wgl != 'no' and need_win_win32 != 'no' gdi_dep = cc.find_library('gdi32', required : false) # FIXME: Revert back to has_header once it gains prefix support wglext_h = cc.has_header_symbol('GL/wglext.h', 'WGL_WGLEXT_VERSION', prefix : '''#include #include ''', include_directories : compat_includes) if wglext_h and gdi_dep.found() and gl_dep.found() gl_includes += [compat_includes] gl_platform_deps += gdi_dep gl_sources += [ 'win32/win32_message_source.c', 'win32/gstglwindow_win32.c', 'win32/gstglwindow_win32.c', 'win32/gstglcontext_wgl.c', ] enabled_gl_winsys += 'win32' gl_winsys_deps += gdi_dep enabled_gl_platforms += 'wgl' glconf.set('GST_GL_HAVE_WINDOW_WIN32', 1) glconf.set('GST_GL_HAVE_PLATFORM_WGL', 1) endif endif if host_machine.system() == 'darwin' # FIXME: how to know if we're on iOS or OS X? # gl_cocoa_headers += [ # 'gstglcontext_cocoa.h', # 'gstglcaopengllayer.h', # ] endif # GDM 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_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_sources += [ 'viv-fb/gstgldisplay_viv_fb.c', 'viv-fb/gstglwindow_viv_fb_egl.c', ] gl_cpp_args += ['-DEGL_API_FB'] endif endif endif # TODO: Add rest of gl config here. # iOS, OS X 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 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 message('Building libgstgl with GL api: ' + ' '.join(enabled_gl_apis)) message('Building libgstgl with GL platform: ' + ' '.join(enabled_gl_platforms)) message('Building libgstgl with GL winsys: ' + ' '.join(enabled_gl_winsys)) install_headers(gl_headers, subdir : 'gstreamer-1.0/gst/gl') install_headers(gl_cocoa_headers, subdir : 'gstreamer-1.0/gst/gl/cocoa') install_headers(gl_egl_headers, subdir : 'gstreamer-1.0/gst/gl/egl') install_headers(gl_prototype_headers, subdir : 'gstreamer-1.0/gst/gl/glprototypes') install_headers(gl_x11_headers, subdir : 'gstreamer-1.0/gst/gl/x11') install_headers(gl_wayland_headers, subdir : 'gstreamer-1.0/gst/gl/wayland') configure_file(input : 'gstglconfig.h.meson', output : 'gstglconfig.h', install_dir : get_option('libdir') + '/gstreamer-1.0/include/gst/gl', configuration : glconf) gstgl = library('gstgl-' + api_version, gl_sources, c_args : gst_plugins_base_args + gl_cpp_args, include_directories : [configinc, libsinc, gl_includes], version : libversion, soversion : soversion, install : true, dependencies : [gst_base_dep, video_dep, allocators_dep, gmodule_dep, gl_lib_deps, gl_platform_deps, gl_winsys_deps, gl_misc_deps]) gen_sources = [] if build_gir gl_gir = gnome.generate_gir(gstgl, sources : gl_sources + gl_headers, 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, extra_args : gir_init_section + ['--c-include=gst/gl/gl.h'], dependencies : [video_dep, gst_dep, gst_base_dep] ) gen_sources += gl_gir endif gstgl_dep = declare_dependency(link_with : gstgl, include_directories : [libsinc, compat_includes], sources: gen_sources, dependencies : [video_dep, gst_base_dep] + gl_winsys_deps) endif