mutter/clutter/clutter/meson.build
Jonas Ådahl a9a9a0d1c5 clutter: Paint views with individual frame clocks
Replace the default master clock with multiple frame clocks, each
driving its own stage view. As each stage view represents one CRTC, this
means we draw each CRTC with its own designated frame clock,
disconnected from all the others.

For example this means we when using the native backend will never need
to wait for one monitor to vsync before painting another, so e.g. having
a 144 Hz monitor next to a 60 Hz monitor, things including both Wayland
and X11 applications and shell UI will be able to render at the
corresponding monitor refresh rate.

This also changes a warning about missed frames when sending
_NETWM_FRAME_TIMINGS messages to a debug log entry, as it's expected
that we'll start missing frames e.g. when a X11 window (via Xwayland) is
exclusively within a stage view that was not painted, while another one
was, still increasing the global frame clock.

Addititonally, this also requires the X11 window actor to schedule
timeouts for _NET_WM_FRAME_DRAWN/_NET_WM_FRAME_TIMINGS event emitting,
if the actor wasn't on any stage views, as now we'll only get the frame
callbacks on actors when they actually were painted, while in the past,
we'd invoke that vfunc when anything was painted.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/903
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1285
2020-07-02 19:36:51 +02:00

519 lines
14 KiB
Meson

clutter_clutter_includesubdir = join_paths(clutter_includesubdir, 'clutter')
clutter_clutter_includedir = join_paths(clutter_includedir, 'clutter')
clutter_headers = [
'clutter.h',
'clutter-action.h',
'clutter-actor-meta.h',
'clutter-actor.h',
'clutter-align-constraint.h',
'clutter-animatable.h',
'clutter-autocleanups.h',
'clutter-backend.h',
'clutter-bind-constraint.h',
'clutter-binding-pool.h',
'clutter-bin-layout.h',
'clutter-blur-effect.h',
'clutter-box-layout.h',
'clutter-brightness-contrast-effect.h',
'clutter-cairo.h',
'clutter-canvas.h',
'clutter-child-meta.h',
'clutter-click-action.h',
'clutter-clone.h',
'clutter-color-static.h',
'clutter-color.h',
'clutter-colorize-effect.h',
'clutter-constraint.h',
'clutter-container.h',
'clutter-content.h',
'clutter-deform-effect.h',
'clutter-deprecated.h',
'clutter-desaturate-effect.h',
'clutter-effect.h',
'clutter-enums.h',
'clutter-event.h',
'clutter-feature.h',
'clutter-fixed-layout.h',
'clutter-flow-layout.h',
'clutter-frame-clock.h',
'clutter-gesture-action.h',
'clutter-grid-layout.h',
'clutter-image.h',
'clutter-input-device.h',
'clutter-input-device-tool.h',
'clutter-input-focus.h',
'clutter-input-method.h',
'clutter-interval.h',
'clutter-keyframe-transition.h',
'clutter-keymap.h',
'clutter-keysyms.h',
'clutter-layout-manager.h',
'clutter-layout-meta.h',
'clutter-macros.h',
'clutter-main.h',
'clutter-mutter.h',
'clutter-offscreen-effect.h',
'clutter-page-turn-effect.h',
'clutter-paint-context.h',
'clutter-paint-nodes.h',
'clutter-paint-node.h',
'clutter-pan-action.h',
'clutter-path-constraint.h',
'clutter-path.h',
'clutter-pick-context.h',
'clutter-property-transition.h',
'clutter-rotate-action.h',
'clutter-script.h',
'clutter-scriptable.h',
'clutter-scroll-actor.h',
'clutter-seat.h',
'clutter-settings.h',
'clutter-shader-effect.h',
'clutter-shader-types.h',
'clutter-swipe-action.h',
'clutter-snap-constraint.h',
'clutter-stage.h',
'clutter-stage-manager.h',
'clutter-stage-view.h',
'clutter-tap-action.h',
'clutter-text.h',
'clutter-text-buffer.h',
'clutter-timeline.h',
'clutter-transition-group.h',
'clutter-transition.h',
'clutter-types.h',
'clutter-units.h',
'clutter-virtual-input-device.h',
'clutter-zoom-action.h',
]
clutter_sources = [
'clutter-action.c',
'clutter-actor-box.c',
'clutter-actor-meta.c',
'clutter-actor.c',
'clutter-align-constraint.c',
'clutter-animatable.c',
'clutter-backend.c',
'clutter-base-types.c',
'clutter-bezier.c',
'clutter-bind-constraint.c',
'clutter-binding-pool.c',
'clutter-bin-layout.c',
'clutter-blur-effect.c',
'clutter-box-layout.c',
'clutter-brightness-contrast-effect.c',
'clutter-cairo.c',
'clutter-canvas.c',
'clutter-child-meta.c',
'clutter-click-action.c',
'clutter-clone.c',
'clutter-color.c',
'clutter-colorize-effect.c',
'clutter-constraint.c',
'clutter-container.c',
'clutter-content.c',
'clutter-damage-history.c',
'clutter-deform-effect.c',
'clutter-desaturate-effect.c',
'clutter-effect.c',
'clutter-event.c',
'clutter-feature.c',
'clutter-fixed-layout.c',
'clutter-flatten-effect.c',
'clutter-flow-layout.c',
'clutter-frame-clock.c',
'clutter-gesture-action.c',
'clutter-graphene.c',
'clutter-grid-layout.c',
'clutter-image.c',
'clutter-input-device.c',
'clutter-input-device-tool.c',
'clutter-input-focus.c',
'clutter-input-method.c',
'clutter-input-pointer-a11y.c',
'clutter-virtual-input-device.c',
'clutter-interval.c',
'clutter-keyframe-transition.c',
'clutter-keymap.c',
'clutter-keysyms-table.c',
'clutter-layout-manager.c',
'clutter-layout-meta.c',
'clutter-main.c',
'clutter-offscreen-effect.c',
'clutter-page-turn-effect.c',
'clutter-paint-context.c',
'clutter-paint-nodes.c',
'clutter-paint-node.c',
'clutter-pan-action.c',
'clutter-path-constraint.c',
'clutter-path.c',
'clutter-pick-context.c',
'clutter-property-transition.c',
'clutter-rotate-action.c',
'clutter-script.c',
'clutter-script-parser.c',
'clutter-scriptable.c',
'clutter-scroll-actor.c',
'clutter-seat.c',
'clutter-settings.c',
'clutter-shader-effect.c',
'clutter-shader-types.c',
'clutter-swipe-action.c',
'clutter-snap-constraint.c',
'clutter-stage.c',
'clutter-stage-manager.c',
'clutter-stage-view.c',
'clutter-stage-window.c',
'clutter-tap-action.c',
'clutter-text.c',
'clutter-text-buffer.c',
'clutter-transition-group.c',
'clutter-transition.c',
'clutter-timeline.c',
'clutter-units.c',
'clutter-util.c',
'clutter-paint-volume.c',
'clutter-zoom-action.c',
]
clutter_private_headers = [
'clutter-actor-meta-private.h',
'clutter-actor-private.h',
'clutter-backend-private.h',
'clutter-bezier.h',
'clutter-constraint-private.h',
'clutter-content-private.h',
'clutter-damage-history.h',
'clutter-debug.h',
'clutter-easing.h',
'clutter-effect-private.h',
'clutter-event-private.h',
'clutter-flatten-effect.h',
'clutter-graphene.h',
'clutter-gesture-action-private.h',
'clutter-id-pool.h',
'clutter-input-device-private.h',
'clutter-input-focus-private.h',
'clutter-input-method-private.h',
'clutter-input-pointer-a11y-private.h',
'clutter-offscreen-effect-private.h',
'clutter-paint-context-private.h',
'clutter-paint-node-private.h',
'clutter-paint-volume-private.h',
'clutter-private.h',
'clutter-script-private.h',
'clutter-settings-private.h',
'clutter-stage-manager-private.h',
'clutter-stage-private.h',
'clutter-stage-view-private.h',
'clutter-stage-window.h',
'clutter-timeline-private.h',
]
clutter_nonintrospected_sources = [
'clutter-easing.c',
'clutter-id-pool.c',
]
clutter_deprecated_headers = [
'deprecated/clutter-container.h',
'deprecated/clutter-timeline.h',
]
clutter_backend_sources = []
clutter_backend_nonintrospected_sources = [
'cogl/clutter-stage-cogl.c',
]
clutter_backend_headers = []
clutter_backend_private_headers = [
'cogl/clutter-stage-cogl.h',
]
if have_x11
clutter_x11_sources = [
'x11/clutter-backend-x11.c',
]
clutter_backend_sources += clutter_x11_sources
clutter_x11_headers = [
'x11/clutter-x11.h',
]
clutter_backend_headers += clutter_x11_headers
clutter_x11_private_headers = [
'x11/clutter-backend-x11.h',
'x11/clutter-settings-x11.h',
]
clutter_backend_private_headers += clutter_x11_private_headers
clutter_x11_nonintrospected_sources = [
'x11/xsettings/xsettings-client.c',
'x11/xsettings/xsettings-client.h',
'x11/xsettings/xsettings-common.c',
'x11/xsettings/xsettings-common.h',
]
clutter_backend_nonintrospected_sources += clutter_x11_nonintrospected_sources
endif
if have_native_backend
clutter_native_nonintrospected_sources = [
'egl/clutter-backend-eglnative.c',
]
clutter_backend_nonintrospected_sources += clutter_native_nonintrospected_sources
endif
if have_wayland
clutter_wayland_private_headers = [
'wayland/clutter-wayland-compositor.h',
]
clutter_backend_private_headers += clutter_wayland_private_headers
endif
cally_headers = [
'cally/cally-actor.h',
'cally/cally-clone.h',
'cally/cally-factory.h',
'cally/cally.h',
'cally/cally-main.h',
'cally/cally-root.h',
'cally/cally-stage.h',
'cally/cally-text.h',
'cally/cally-util.h',
]
cally_sources = [
'cally/cally-actor.c',
'cally/cally.c',
'cally/cally-clone.c',
'cally/cally-root.c',
'cally/cally-stage.c',
'cally/cally-text.c',
'cally/cally-util.c',
]
cally_private_headers = [
'cally/cally-actor-private.h',
]
clutter_built_sources = []
clutter_built_headers = []
clutter_built_private_headers = []
cdata = configuration_data()
cdata.set_quoted('MUTTER_VERSION', meson.project_version())
cdata.set('CLUTTER_DRIVERS', '"*"')
cdata.set('HAVE_EVDEV', have_native_backend)
cdata.set('HAVE_LIBWACOM', have_libwacom)
cdata.set('HAVE_PANGO_FT2', have_pango_ft2)
clutter_build_config_h = configure_file(
input: 'clutter-build-config.h.meson',
output: 'clutter-build-config.h',
configuration: cdata,
install: false,
)
clutter_built_private_headers += clutter_build_config_h
cdata = configuration_data()
if have_wayland
cdata.set10('CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT', true)
endif
if have_x11
cdata.set_quoted('CLUTTER_WINDOWING_X11', 'x11')
cdata.set_quoted('CLUTTER_INPUT_X11', 'x11')
cdata.set_quoted('CLUTTER_WINDOWING_GLX', 'glx')
endif
if have_native_backend
cdata.set_quoted('CLUTTER_WINDOWING_EGL', 'eglnative')
cdata.set_quoted('CLUTTER_INPUT_EVDEV', 'evdev')
endif
cdata.set_quoted('CLUTTER_INPUT_NULL', 'null')
clutter_config_h = configure_file(
input: 'clutter-config.h.in',
output: 'clutter-config.h',
configuration: cdata,
install: true,
install_dir: clutter_clutter_includedir,
)
clutter_built_headers += clutter_config_h
clutter_enum_types = gnome.mkenums('clutter-enum-types',
sources: [clutter_headers, clutter_deprecated_headers],
c_template: 'clutter-enum-types.c.in',
h_template: 'clutter-enum-types.h.in',
install_dir: clutter_clutter_includedir,
install_header: true,
)
clutter_built_sources += clutter_enum_types[0]
clutter_built_headers += clutter_enum_types[1]
clutter_marshal = gnome.genmarshal('clutter-marshal',
prefix: '_clutter_marshal',
sources: 'clutter-marshal.list',
valist_marshallers: true,
extra_args: ['--quiet'],
install_dir: clutter_clutter_includedir,
install_header: true,
)
clutter_built_sources += clutter_marshal[0]
clutter_built_headers += clutter_marshal[1]
libmutter_clutter_name = 'mutter-clutter-' + libmutter_api_version
libmutter_clutter = shared_library(libmutter_clutter_name,
sources: [
clutter_sources,
clutter_headers,
clutter_private_headers,
clutter_nonintrospected_sources,
clutter_deprecated_headers,
clutter_backend_sources,
clutter_backend_nonintrospected_sources,
clutter_backend_headers,
clutter_backend_private_headers,
clutter_built_sources,
clutter_built_headers,
cally_sources,
cally_headers,
cally_private_headers,
],
version: '0.0.0',
soversion: 0,
c_args: clutter_c_args,
include_directories: clutter_includes,
dependencies: [clutter_deps],
gnu_symbol_visibility: 'hidden',
link_with: [
libmutter_cogl,
libmutter_cogl_pango,
],
install_rpath: pkglibdir,
install_dir: pkglibdir,
install: true,
)
libmutter_clutter_dep = declare_dependency(
sources: [clutter_enum_types[1]],
link_with: libmutter_clutter,
dependencies: clutter_deps,
)
if have_introspection
clutter_introspection_args = introspection_args + [
'-DCLUTTER_SYSCONFDIR="@0@"'.format(join_paths(prefix, sysconfdir)),
'-DCLUTTER_COMPILATION=1',
'-DCOGL_DISABLE_DEPRECATION_WARNINGS',
'-DG_LOG_DOMAIN="Clutter"'
]
libmutter_clutter_gir = gnome.generate_gir(libmutter_clutter,
sources: [
clutter_built_sources,
clutter_built_headers,
clutter_sources,
clutter_headers,
clutter_deprecated_headers,
],
nsversion: libmutter_api_version,
namespace: 'Clutter',
export_packages: [libmutter_clutter_name],
includes: [
libmutter_cogl_gir[0],
libmutter_cogl_pango_gir[0],
'GL-1.0',
'GObject-2.0',
'cairo-1.0',
'Atk-1.0',
'Json-1.0',
],
dependencies: [cogl_deps],
extra_args: clutter_introspection_args + ['--c-include=clutter/clutter.h'],
install_dir_gir: pkglibdir,
install_dir_typelib: pkglibdir,
install: true,
)
libmutter_cally_gir = gnome.generate_gir(libmutter_clutter,
sources: [
cally_sources,
cally_headers,
],
nsversion: libmutter_api_version,
namespace: 'Cally',
includes: [
libmutter_cogl_gir[0],
libmutter_cogl_pango_gir[0],
libmutter_clutter_gir[0],
],
dependencies: [cogl_deps],
extra_args: clutter_introspection_args,
install_dir_gir: pkglibdir,
install_dir_typelib: pkglibdir,
install: true
)
if have_x11
libmutter_clutter_x11_gir = gnome.generate_gir(libmutter_clutter,
sources: [
clutter_x11_sources,
clutter_x11_headers,
],
nsversion: libmutter_api_version,
namespace: 'ClutterX11',
export_packages: ['mutter-clutter-x11-' + libmutter_api_version],
includes: [
libmutter_cogl_gir[0],
libmutter_cogl_pango_gir[0],
libmutter_clutter_gir[0],
'xlib-2.0',
],
dependencies: [],
extra_args: clutter_introspection_args,
install_dir_gir: pkglibdir,
install_dir_typelib: pkglibdir,
install: true
)
endif
endif
install_headers(clutter_headers,
subdir: clutter_clutter_includesubdir)
install_headers(cally_headers,
subdir: join_paths(clutter_includesubdir, 'cally'))
install_headers(clutter_deprecated_headers,
subdir: join_paths(clutter_clutter_includesubdir, 'deprecated'))
install_headers(clutter_x11_headers,
subdir: join_paths(clutter_clutter_includesubdir, 'x11'))
pkg.generate(libmutter_clutter,
name: 'Mutters Clutter',
filebase: libmutter_clutter_name,
description: 'Mutters Clutter Private Library',
libraries: [m_dep],
subdirs: join_paths(pkgname, 'clutter'),
requires: [clutter_pkg_deps, libmutter_cogl_name],
version: meson.project_version(),
variables: [
'apiversion=' + libmutter_api_version,
],
install_dir: pcdir,
)
pkg.generate(libmutter_clutter,
name: 'Mutters ClutterX11',
filebase: 'mutter-clutter-x11-' + libmutter_api_version,
description: 'Mutters ClutterX11 Private Library',
libraries: [m_dep],
subdirs: join_paths(pkgname, 'clutter'),
requires: [clutter_pkg_deps, libmutter_cogl_name],
version: meson.project_version(),
variables: [
'apiversion=' + libmutter_api_version,
],
install_dir: pcdir,
)