Confirmed users
586
edits
No edit summary |
(→Where to go for more answers: point to slack) |
||
(9 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
== Introduction == | == Introduction == | ||
The '''Async Pan/Zoom module (APZ)'''<sup>1</sup> is a platform component that allows panning and zooming to be performed asynchronously (on the compositor thread rather than the main | The '''Async Pan/Zoom module (APZ)'''<sup>1</sup> is a platform component that allows panning and zooming to be performed asynchronously (on the compositor thread rather than the main thread). | ||
For '''zooming''', this means that the APZ reacts to a pinch gesture immediately and instructs the compositor to scale the already-rendered layers at whatever resolution they have been rendered (so e.g. text becomes more blurry as you zoom in), and meanwhile sends a request to Gecko to re-render the content at a new resolution (with sharp text and all). | For '''zooming''', this means that the APZ reacts to a pinch gesture immediately and instructs the compositor to scale the already-rendered layers at whatever resolution they have been rendered (so e.g. text becomes more blurry as you zoom in), and meanwhile sends a request to Gecko to re-render the content at a new resolution (with sharp text and all). | ||
Line 11: | Line 11: | ||
== Supported platforms == | == Supported platforms == | ||
The APZ module is | The APZ module is enabled on Fennec as of version 48. It is also enabled on desktop as of version 48 if e10s is enabled. The easiest way to check if it is enabled is by going to about:support and checking the "Asynchronous Pan/Zoom" line in the Graphics section. | ||
The APZ module relies on [[Platform/GFX/OffMainThreadCompositing|OMTC]], so a prerequisite for porting it to a platform is for OMTC to work on that platform. | The APZ module relies on [[Platform/GFX/OffMainThreadCompositing|OMTC]], so a prerequisite for porting it to a platform is for OMTC to work on that platform. | ||
Line 17: | Line 17: | ||
== AsyncPanZoomControllers == | == AsyncPanZoomControllers == | ||
Inside the APZ module, every scrollable layer has an [ | Inside the APZ module, every scrollable layer has an [http://dxr.mozilla.org/mozilla-central/source/gfx/layers/apz/src/AsyncPanZoomController.h AsyncPanZoomController] (APZC). Scrollable layers roughly correspond to the root document, documents in iframes, and overflow:scroll elements. See [[Platform/GFX/OffMainThreadCompositing|OMTC]] for more information about layers. | ||
The APZCs are arranged in a tree whose structure reflects the structure of the layer tree containing the layers that they correspond to, except that the APZC tree only has nodes for scrollable layers, while the layer tree has nodes for all layers. The APZC tree is managed by a class called [ | The APZCs are arranged in a tree whose structure reflects the structure of the layer tree containing the layers that they correspond to, except that the APZC tree only has nodes for scrollable layers, while the layer tree has nodes for all layers. The APZC tree is managed by a class called [http://dxr.mozilla.org/mozilla-central/source/gfx/layers/apz/src/APZCTreeManager.h APZCTreeManager]. The APZCTreeManager is the interface through which the outside world interacts with the APZ module - there is no access to the APZCs directly, but the APZCTreeManager provides methods that operate on a specific APZC in the tree. | ||
These methods identify an APZC using three integer identifiers, grouped in a structure called '''ScrollableLayerGuid'''. The three identifiers are: | These methods identify an APZC using three integer identifiers, grouped in a structure called '''ScrollableLayerGuid'''. The three identifiers are: | ||
# A '''layers id''', which identifies the layer tree that the scrollable layer belongs to. Layers ids are maintained by the compositor, with CompositorParent::RootLayerTreeId() returning the layers id for the root layer tree, and CompositorParent::AllocateLayerTreeId() allocating a layers id for a new layer tree. | # A '''layers id''', which identifies the layer tree that the scrollable layer belongs to. Layers ids are maintained by the compositor, with CompositorParent::RootLayerTreeId() returning the layers id for the root layer tree, and CompositorParent::AllocateLayerTreeId() allocating a layers id for a new layer tree. | ||
Line 34: | Line 34: | ||
* When the compositor receives an update to the layer tree, it propagates this update to the APZCTreeManager by calling APZCTreeManager::UpdatePanZoomControllerTree(). This function updates the tree of APZCs to reflect the tree of scrollable layers in the updated layer tree. | * When the compositor receives an update to the layer tree, it propagates this update to the APZCTreeManager by calling APZCTreeManager::UpdatePanZoomControllerTree(). This function updates the tree of APZCs to reflect the tree of scrollable layers in the updated layer tree. | ||
* Every time the compositor composites a frame, it queries each APZC for its current async transform (see AsyncPanZoomController:: | * Every time the compositor composites a frame, it queries each APZC for its current async transform (see AsyncPanZoomController::GetCurrentAsyncTransform()). The APZC modifies this transform as the user pans and zooms. | ||
* APZCs can schedule a composite by calling CompositorParent::ScheduleRenderOnCompositorThread(). | * APZCs can schedule a composite (for the next frame of a scroll animation, for instance) by calling CompositorParent::ScheduleRenderOnCompositorThread(). | ||
=== Widget code === | === Widget code === | ||
The '''widget code''' is a platform-specific component of a browser implementation that interfaces with the native widget implementation. | The '''widget code''' is a platform-specific component of a browser implementation that interfaces with the native widget implementation. The widget code interacts with the APZ in the following ways: | ||
The widget code interacts with the APZ in the following ways: | |||
* forwards relevant input events to the APZ (APZCTreeManager::ReceiveInputEvent()) | * forwards relevant input events to the APZ (APZCTreeManager::ReceiveInputEvent()) | ||
* notifies the APZ about Gecko events that are relevant to it, such as: | * notifies the APZ about Gecko events that are relevant to it, such as: | ||
** | ** how content responded to an input event (APZCTreeManager::ContentReceivedInputBlock()) | ||
** a | ** a change in the zoom constraints (APZCTreeManager::UpdateZoomConstraints()) | ||
** a request to zoom in to a rectangle (APZCTreeManager::ZoomToRect()) | ** a request to zoom in to a rectangle (APZCTreeManager::ZoomToRect()) | ||
In addition, the widget code provides APZ with an interface for interacting with Gecko, called '''[ | In addition, the widget code provides APZ with an interface for interacting with Gecko, called '''[http://dxr.mozilla.org/mozilla-central/source/gfx/layers/apz/public/GeckoContentController.h GeckoContentController]'''. The implementation of this interface is different for different platforms. It may even be different for different APZCs within one platform, depending on which process the controller lives in. | ||
GeckoContentController allows the APZ to do the following: | GeckoContentController allows the APZ to do the following: | ||
* request a repaint (GeckoContentController::RequestContentRepaint()) | * request a repaint (GeckoContentController::RequestContentRepaint()) | ||
* request handling of various gestures, such as single taps, double taps, and long taps (GeckoContentController:: | * request handling of various gestures, such as single taps, double taps, and long taps (GeckoContentController::HandleTap() etc.) | ||
* fire | * fire state change notifications (GeckoContentController::NotifyAPZStateChange()) | ||
* schedule arbitrary actions to be performed | * schedule arbitrary actions to be performed with a delay (GeckoContentController::PostDelayedTask()) | ||
== Threads and processes == | == Threads and processes == | ||
When OMTC is enabled on a platform (which is a requirement for using the APZC), the compositor runs on its own thread, called the '''compositor thread'''. APZCs and the APZCTreeManager can be thought of as living on the compositor thread, although they can be used in certain ways by other threads (usually the Gecko thread, or the platform UI thread if there is one). [ | When OMTC is enabled on a platform (which is a requirement for using the APZC), the compositor runs on its own thread, called the '''compositor thread'''. APZCs and the APZCTreeManager can be thought of as living on the compositor thread, although they can be used in certain ways by other threads (usually the Gecko thread, or the platform UI thread if there is one). [http://dxr.mozilla.org/mozilla-central/source/gfx/layers/apz/src/APZCTreeManager.h APZCTreeManager.h] documents which APZCTreeManager methods can be called on which threads. | ||
On | On some platforms there are not only multiple threads but also multiple processes. In this setup, the compositor lives in the GPU process (if there is one - currently Windows only), or the UI process otherwise. All the APZCs live in the same process as the compositor, even ones corresponding to layers from a content process. | ||
== Coordinate systems == | == Coordinate systems == | ||
Line 73: | Line 68: | ||
* [https://staktrace.com/spout/entry.php?id=800 Unraveling coordinate systems] | * [https://staktrace.com/spout/entry.php?id=800 Unraveling coordinate systems] | ||
* [https://staktrace.com/spout/entry.php?id=801 Unraveling coordinate systems, part 2] | * [https://staktrace.com/spout/entry.php?id=801 Unraveling coordinate systems, part 2] | ||
* [ | * [https://searchfox.org/mozilla-central/rev/6f86cc3479f80ace97f62634e2c82a483d1ede40/gfx/layers/apz/src/APZCTreeManager.cpp#2795 The comment above APZCTreeManager::GetScreenToAPZCTransform()] | ||
* [https://bug935219.bugzilla.mozilla.org/attachment.cgi?id=8380975 Diagram illustrating the coordinate confusion that gave rise to bug 935219] | * [https://bug935219.bugzilla.mozilla.org/attachment.cgi?id=8380975 Diagram illustrating the coordinate confusion that gave rise to bug 935219] | ||
Line 81: | Line 76: | ||
This logging can be turned on by setting the "apz.printtree" pref to "true". | This logging can be turned on by setting the "apz.printtree" pref to "true". | ||
Additional logging can be enabled by looking for *_LOG macros at the top of .cpp files, and setting the MOZ_LOG environment variable appropriately. For example, setting <tt>MOZ_LOG=apz.inputqueue:4</tt> is often useful for tracing input events through the APZ code. | |||
== Main APZ-related projects on the horizon == | == Main APZ-related projects on the horizon == | ||
See [https://github.com/orgs/FirefoxGraphics/projects/7 the APZ planning GitHub project]. | |||
== FAQ == | == FAQ == | ||
Line 103: | Line 87: | ||
If you have questions about anything APZ-related, please add them here, and somebody watching this page will try to answer it. | If you have questions about anything APZ-related, please add them here, and somebody watching this page will try to answer it. | ||
; What platforms is APZ currently enabled on? [ | ; What platforms is APZ currently enabled on? [2016-09-13] : APZ is currently enabled in all B2G processes, Firefox desktop with e10s enabled, and Fennec. | ||
; How does APZ impact the onload event? Will this impact user perceived performance? [2014-01-28] : In general APZ shouldn't really impact the onload event. We might be painting a larger area now but if the app is well-behaved and doesn't trigger a lot of paints the impact from this should not be very large. If there are reports of delayed onload because of APZ, it would be useful to get profiles with and without APZ enabled to compare. | ; How does APZ impact the onload event? Will this impact user perceived performance? [2014-01-28] : In general APZ shouldn't really impact the onload event. We might be painting a larger area now but if the app is well-behaved and doesn't trigger a lot of paints the impact from this should not be very large. If there are reports of delayed onload because of APZ, it would be useful to get profiles with and without APZ enabled to compare. | ||
Line 115: | Line 99: | ||
== Where to go for more answers == | == Where to go for more answers == | ||
APZ now has its own | APZ now has its own matrix channel, #apz:mozilla.org. You can also try #gfx:mozilla.org and #developers:mozilla.org. Ping kats, botond, mstange, or tnikkel. |