14c706e51b
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 |
||
---|---|---|
.. | ||
plugins | ||
clutter-utils.c | ||
clutter-utils.h | ||
cogl-utils.c | ||
cogl-utils.h | ||
compositor-private.h | ||
compositor.c | ||
meta-background-actor-private.h | ||
meta-background-actor.c | ||
meta-background-group.c | ||
meta-background-image.c | ||
meta-background-private.h | ||
meta-background.c | ||
meta-compositor-server.c | ||
meta-compositor-server.h | ||
meta-compositor-x11.c | ||
meta-compositor-x11.h | ||
meta-cullable.c | ||
meta-cullable.h | ||
meta-dnd-actor-private.h | ||
meta-dnd-actor.c | ||
meta-dnd.c | ||
meta-feedback-actor-private.h | ||
meta-feedback-actor.c | ||
meta-module.c | ||
meta-module.h | ||
meta-plugin-manager.c | ||
meta-plugin-manager.h | ||
meta-plugin.c | ||
meta-shadow-factory.c | ||
meta-shaped-texture-private.h | ||
meta-shaped-texture.c | ||
meta-surface-actor-wayland.c | ||
meta-surface-actor-wayland.h | ||
meta-surface-actor-x11.c | ||
meta-surface-actor-x11.h | ||
meta-surface-actor.c | ||
meta-surface-actor.h | ||
meta-sync-ring.c | ||
meta-sync-ring.h | ||
meta-texture-tower.c | ||
meta-texture-tower.h | ||
meta-window-actor-private.h | ||
meta-window-actor-wayland.c | ||
meta-window-actor-wayland.h | ||
meta-window-actor-x11.c | ||
meta-window-actor-x11.h | ||
meta-window-actor.c | ||
meta-window-group-private.h | ||
meta-window-group.c | ||
meta-window-shape.c | ||
README | ||
region-utils.c | ||
region-utils.h |
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.