--- slug: surface-aggregation type: concept summary: "How the Viz display compositor combines CompositorFrames from the browser UI and every sandboxed renderer into one screen image without any client trusting another's pixels." created: 2026-06-15 updated: 2026-06-16 last_edited: 2026-06-16 last_link_verified: 2026-06-16 related: compositor-scheduling: relation: builds-on note: "Compositor Frame Scheduling produces one client's CompositorFrame and submits it at Draw; surface aggregation is the downstream step that combines that frame with every other client's frame into one screen image." rendering-pipeline: relation: refines note: "The Rendering Pipeline names Display as its seventh stage and defers how the GPU process composites; surface aggregation is that mechanism, naming the surfaces, SurfaceManager, and SurfaceAggregator the stage list leaves opaque." multi-process-architecture: relation: builds-on note: "Viz runs in the GPU process and receives frames over the CompositorFrameSink Mojo interface that crosses the renderer/GPU boundary; the multi-process decision is what makes aggregation a cross-process operation." site-isolation: relation: complements note: "Site Isolation places each cross-site iframe in its own renderer as a separate Viz client; surface embedding aggregates those clients into one scene without sharing pixel data across the trust boundary." skia-graphite: relation: complements note: "The Skia Graphite Transition reorganizes the raster backend whose output tiles the aggregated frame references; aggregation is downstream of raster and unchanged by the backend swap." --- # Surface Aggregation > **Concept** > > Vocabulary that names a phenomenon. *The Viz display compositor's model for combining the CompositorFrames submitted by the browser's own UI and every sandboxed renderer into the single image presented to the screen, where each client's surface is embedded into the scene without any client trusting another's contents.* > **📝 Where the name comes from** > > *Viz* is the Chromium project's contraction of *visuals*: the `components/viz/` subsystem that holds, in the project's own words, "the client library and service implementations for compositing and gpu presentation." The service half runs in the GPU process and is the *display compositor*. A *surface* is the unit of compositing it works in: one client's submitted frame, identified and embeddable by other clients. *Aggregation* is the step that walks the tree of embedded surfaces and flattens them into one frame to draw. The trace category that surfaces all of this is `viz`, distinct from the `cc` category that names the per-renderer [compositor frame scheduling](compositor-scheduling.md) upstream of it. ## What It Is [Compositor Frame Scheduling](compositor-scheduling.md) ends when one renderer's compositor thread submits a `CompositorFrame` across the process boundary. Surface aggregation is what the GPU process does next: the browser's own UI is one frame source, each renderer is another, and the display compositor combines those sources into the one image the platform presents. The display compositor "uses Gpu or software to composite a set of frames, from multiple clients, into a single backing store for display to the user." Each client submits frames through a `CompositorFrameSink`, a Mojo interface that carries a `CompositorFrame` from the client to the GPU process. The browser's UI compositor has a sink; each renderer has a sink; an embedded `