# PrimaryPlane
Primary Plane is the word I heard during the discussion in the context of delegated compositing.
This note is a survey not for what is Primary Plane.
## Overlay Strategy
Delegated compositing is one of the overlay and it uses the strategy implemented as [OvelayProcessorStrategy](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/overlay_processor_strategy.h;l=23;drc=8e78783dc1f7007bad46d657c9f332614e240fd8).
[OvelayProcessorStrategy](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/overlay_processor_strategy.h;l=23;drc=8e78783dc1f7007bad46d657c9f332614e240fd8) describes each strategy for promoting a DrawQuad to overlays.
There are OverlayStrategyFullscreen, OverlayStrategySingleOnTop and OverlayStrategyUnderlay.
Each strategy implements following APIs
- [Propose](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/overlay_processor_strategy.h;l=32;drc=8e78783dc1f7007bad46d657c9f332614e240fd8): Appends all legitimate overlay candidates
- [Attemp](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/overlay_processor_strategy.h;l=49;drc=8e78783dc1f7007bad46d657c9f332614e240fd8): Checks each `proposed_candidate` can make it work with the render pass.
- [CommitCandidate](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/overlay_processor_strategy.h;l=64;drc=8e78783dc1f7007bad46d657c9f332614e240fd8): Commits the proposed candidate by updating `render_pass` when presented in overlay plane
And some others.
Here, we have concept of PrimaryPlane.
Each strategy can return the display rect for primary plane via [GetPrimaryPlaneDisplayRect](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/overlay_processor_strategy.h;l=84;drc=8e78783dc1f7007bad46d657c9f332614e240fd8).
## PrimaryPlane
[PrimaryPlane](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/overlay_processor_strategy.h;l=26;drc=8e78783dc1f7007bad46d657c9f332614e240fd8) is [OutputSurfaceOverlayPlane](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/overlay_processor_interface.h;l=73;drc=8e78783dc1f7007bad46d657c9f332614e240fd8), the data needed to represent OutputSurface as an overlay plane.
OutputSurfaceOverlayPlane seems to correspond to one overlay candidate.
It contains a info such as display_rect, rounded_corners, transform, damage_rect...
It also has [OverlayPriorityHint](https://source.chromium.org/chromium/chromium/src/+/main:ui/gfx/overlay_priority_hint.h;l=14;drc=8e78783dc1f7007bad46d657c9f332614e240fd8) which is used to compute which overlay candidate should be prioritized to the overlay.
Primary plane fisrt constructed inside [DirectRenderer::DrawFrame](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/direct_renderer.cc;l=307;drc=8e78783dc1f7007bad46d657c9f332614e240fd8).
It [ProcessOutputSurfaceAsOverlay](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/direct_renderer.cc;l=303;drc=8e78783dc1f7007bad46d657c9f332614e240fd8) and set it as `output_surface_plane` and this value is the one passed to each processor as `primary_plane`.
Assuming from this usage, `primary_plane` is assigned per frame.
There are no critical documentation, but I guess primary plane is just a unique plane where the overlay candidates will be drawn.
It looks like it can take null, and not really sure whether what it actually is resonsible for.
TODO(elkurin): More survey
## Note: damage rect
[DrawFrame](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/direct_renderer.cc;l=217;drc=8e78783dc1f7007bad46d657c9f332614e240fd8) poassed `surface_damage_rect_list` as [vector of gfx::Rect](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/aggregated_frame.h;l=21;drc=8e78783dc1f7007bad46d657c9f332614e240fd8).
But not related to that, the root_damage_rect of the frame takes the [intersection with device_viewport_size](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/direct_renderer.cc;l=253;drc=8e78783dc1f7007bad46d657c9f332614e240fd8).
This does not check whether there is a surface outside of the device viewport size, so we need to be careful.