mutter/src/compositor
Daniel van Vugt 14c706e51b clutter: Introduce geometric picking
Currently, Clutter does picking by drawing with Cogl and reading
the pixel that's beneath the given point. Since Cogl has a journal
that records drawing operations, and has optimizations to read a
single pixel from a list of rectangle, it would be expected that
we would hit this fast path and not flush the journal while picking.

However, that's not the case: dithering, clipping with scissors, etc,
can all flush the journal, issuing commands to the GPU and making
picking slow. On NVidia-based systems, this glReadPixels() call is
extremely costly.

Introduce geometric picking, and avoid using the Cogl journal entirely.
Do this by introducing a stack of actors in ClutterStage. This stack
is cached, but for now, don't use the cache as much as possible.

The picking routines are still tied to painting.

When projecting the actor vertexes, do it manually and take the modelview
matrix of the framebuffer into account as well.

CPU usage on an Intel i7-7700, tested with two different GPUs/drivers:

  |         |     Intel | Nvidia |
  | ------: | --------: | -----: |
  | Moving the mouse:            |
  | Before  |       10% |    10% |
  | After   |        6% |     6% |
  | Moving a window:             |
  | Before  |       23% |    81% |
  | After   |       19% |    40% |

Closes: https://gitlab.gnome.org/GNOME/mutter/issues/154,
        https://gitlab.gnome.org/GNOME/mutter/issues/691

Helps significantly with: https://gitlab.gnome.org/GNOME/mutter/issues/283,
                          https://gitlab.gnome.org/GNOME/mutter/issues/590,
                          https://gitlab.gnome.org/GNOME/mutter/issues/700

v2: Fix code style issues
    Simplify quadrilateral checks
    Remove the 0.5f hack
    Differentiate axis-aligned rectangles

https://gitlab.gnome.org/GNOME/mutter/merge_requests/189
2019-09-02 16:41:13 +00:00
..
plugins cleanup: Don't use G_TYPE_INSTANCE_GET_PRIVATE() 2019-07-18 11:01:09 +02:00
clutter-utils.c compositor: Make meta_actor_painting_untransformed take a framebuffer 2019-01-03 10:26:13 +00:00
clutter-utils.h compositor: Make meta_actor_painting_untransformed take a framebuffer 2019-01-03 10:26:13 +00:00
cogl-utils.c cogl: Remove CoglError wrapper 2019-06-20 18:25:04 +02:00
cogl-utils.h Use a consistent style for enum braces 2019-02-28 09:31:01 +01:00
compositor-private.h compositor: Move out X11 compositing code into sub type 2019-08-19 08:44:58 +00:00
compositor.c compositor: Trace pre/post paint functions 2019-08-31 12:22:39 +00:00
meta-background-actor-private.h Clean up include macros mess 2018-11-06 17:17:36 +01:00
meta-background-actor.c background-actor: Clip obscured background areas 2019-07-30 23:17:14 +02:00
meta-background-group.c meta: Make MetaBackgroundGroup derivable 2019-06-24 13:49:31 +00:00
meta-background-image.c cogl: Remove CoglError wrapper 2019-06-20 18:25:04 +02:00
meta-background-private.h Clean up include macros mess 2018-11-06 17:17:36 +01:00
meta-background.c background: Reload when GPU memory is invalidated 2019-07-16 16:24:41 +08:00
meta-compositor-server.c compositor: Let MetaDisplay choose the correct compositor type 2019-08-19 08:44:58 +00:00
meta-compositor-server.h compositor: Let MetaDisplay choose the correct compositor type 2019-08-19 08:44:58 +00:00
meta-compositor-x11.c clutter: Move X11 input to src/backends/x11 2019-08-24 08:59:08 +00:00
meta-compositor-x11.h compositor: Let MetaDisplay choose the correct compositor type 2019-08-19 08:44:58 +00:00
meta-cullable.c Clean up include macros mess 2018-11-06 17:17:36 +01:00
meta-cullable.h Use G_DECLARE_DERIVABLE/FINAL_TYPE on some types 2018-12-21 19:48:50 +00:00
meta-dnd-actor-private.h Use G_DECLARE_DERIVABLE/FINAL_TYPE on some types 2018-12-21 19:48:50 +00:00
meta-dnd-actor.c wayland/feedback-actor: Use float for position and anchor 2019-08-26 11:57:49 +00:00
meta-dnd.c clutter: Move X11 input to src/backends/x11 2019-08-24 08:59:08 +00:00
meta-feedback-actor-private.h wayland/feedback-actor: Use float for position and anchor 2019-08-26 11:57:49 +00:00
meta-feedback-actor.c wayland/feedback-actor: Use float for position and anchor 2019-08-26 11:57:49 +00:00
meta-module.c cleanup: Don't use G_TYPE_INSTANCE_GET_PRIVATE() 2019-07-18 11:01:09 +02:00
meta-module.h Changed obsolete FSF postal address into generic URL. 2014-01-13 11:35:47 -05:00
meta-plugin-manager.c compositor: Make type derivable 2019-08-19 08:44:58 +00:00
meta-plugin-manager.h compositor: Add "locate_pointer" vmethod 2019-06-05 09:34:39 +00:00
meta-plugin.c compositor: Make type derivable 2019-08-19 08:44:58 +00:00
meta-shadow-factory.c shadow-factory: Optimize shadows entirely if clip region is empty 2019-07-30 23:08:30 +02:00
meta-shaped-texture-private.h shaped-texture: Move private function to private header 2019-08-23 13:23:07 +00:00
meta-shaped-texture.c shaped-texture: Move MetaCullable helpers to MetaSurfaceActor 2019-08-23 13:23:07 +00:00
meta-surface-actor-wayland.c surface-actor-wayland: Handle stex being disposed 2019-08-27 08:55:51 +00:00
meta-surface-actor-wayland.h Use G_DECLARE_DERIVABLE/FINAL_TYPE on some types 2018-12-21 19:48:50 +00:00
meta-surface-actor-x11.c surface-actor-x11: Bind the surface actor resources to window actor life 2019-06-28 19:36:47 +02:00
meta-surface-actor-x11.h Use G_DECLARE_DERIVABLE/FINAL_TYPE on some types 2018-12-21 19:48:50 +00:00
meta-surface-actor.c clutter: Introduce geometric picking 2019-09-02 16:41:13 +00:00
meta-surface-actor.h shaped-texture: Add support for viewports 2019-02-06 12:24:02 +00:00
meta-sync-ring.c Clean up include macros mess 2018-11-06 17:17:36 +01:00
meta-sync-ring.h Clean up include macros mess 2018-11-06 17:17:36 +01:00
meta-texture-tower.c cogl: Remove CoglError wrapper 2019-06-20 18:25:04 +02:00
meta-texture-tower.h Clean up include macros mess 2018-11-06 17:17:36 +01:00
meta-window-actor-private.h window-actor: Add 'damaged' signal 2019-08-27 15:31:25 +00:00
meta-window-actor-wayland.c wayland: Implement subsurface.place_below() for parents 2019-08-27 11:31:00 +03:00
meta-window-actor-wayland.h wayland: Implement subsurface.place_below() for parents 2019-08-27 11:31:00 +03:00
meta-window-actor-x11.c wayland: Implement subsurface.place_below() for parents 2019-08-27 11:31:00 +03:00
meta-window-actor-x11.h Add MetaWindowActorX11 and MetaWindowActorWayland 2019-01-04 09:32:51 -02:00
meta-window-actor.c window-actor: Use new get_image() API to screen casting window content 2019-08-27 15:31:25 +00:00
meta-window-group-private.h Clean up include macros mess 2018-11-06 17:17:36 +01:00
meta-window-group.c compositor: Make meta_actor_painting_untransformed take a framebuffer 2019-01-03 10:26:13 +00:00
meta-window-shape.c Clean up include macros mess 2018-11-06 17:17:36 +01:00
README Document window and surface actors 2019-01-04 09:32:58 -02:00
region-utils.c region-utils: Add API to crop and scale an integer region 2019-02-06 12:24:02 +00:00
region-utils.h region-utils: Add API to crop and scale an integer region 2019-02-06 12:24:02 +00:00

Intro
=====

In general, the compositor splits the window from the contents of
the window from the shape of the window. In other words, a window
has contents, and the contents of the window have a shape. This is
represented by the actor hierarchy:

 +--------------------------------------+
 | MetaWindowActor                      |
 | +----------------------------------+ |
 | | MetaSurfaceActor                 | |
 | | +------------------------------+ | |
 | | | MetaShapedTexture            | | |
 | | |                              | | |
 | | |                              | | |
 | | |                              | | |
 | | |                              | | |
 | | +------------------------------+ | |
 | +----------------------------------+ |
 +--------------------------------------+

Surfaces may also contain subsurfaces. The MetaWindowActor and
MetaSurfaceActor subclasses that will be created depend on the client
type, and the display server type.

## Subsurfaces

Additionally, there is also the case of subsurfaces: surfaces that
are child of other surfaces. That is also represented in the actor
hierarchy by having one or many MetaSurfaceActors (the subsurfaces)
added as children of a parent MetaSurfaceActor. There are no limits
to how many subsurfaces a surface may have. With subsurfaces, the
actor hierarchy looks like this:

 MetaWindowActor
  ↳ MetaSurfaceActor (surface)
     ↳ MetaShapedTexture
     ↳ MetaSurfaceActor (subsurface)
        ↳ MetaShapedTexture
        ↳ MetaSurfaceActor (sub-subsurface)
           ↳ MetaShapedTexture
     ↳ MetaSurfaceActor (subsurface)
        ↳ MetaShapedTexture

In this example, the main surface has 2 subsurfaces. One of these
subsurfaces contains a subsurface as well.

All MetaWindowActors contain at least one MetaSurfaceActor, and all
MetaSurfaceActors contain a MetaShapedTexture.

## Client and compositor

MetaWindowActor and its subclasses represent the client window's
type. A X11 client will have a MetaWindowActorX11 representing it,
and a Wayland client will have a MetaWindowActorWayland.

On the compositor side, the surface where the contents of the window
are drawn into are represented by MetaSurfaceActor subclasses. On a
Wayland session, windows are backed by a MetaSurfaceActorWayland
surface, whereas on X11 sessions, by MetaSurfaceActorX11.

XWayland windows are X11 client windows (MetaWindowActorX11) backed
by Wayland surfaces (MetaWindowActorWayland).


Env Vars
========

MUTTER_DISABLE_MIPMAPS - set to disable use of mipmaped windows.