# When we produce new frame We predict whether we need to produce frame in [OnStateUpdate](https://source.chromium.org/chromium/chromium/src/+/main:ui/aura/window_tree_host_platform.cc;l=330-344;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) from state updates and visibility. Then in what condition it does actually produce a frame? This is a code reading note for learning purpose. ## Seq id seq id is set on [SkiaRenderer::SwapBuffers](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/skia_renderer.cc;l=1232;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090). This is set to [parent sequence's local_surface_id](https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/display.cc;l=1014;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090). ## Needs commit [needs_commit](https://source.chromium.org/chromium/chromium/src/+/main:ui/ozone/platform/wayland/host/wayland_frame_manager.cc;l=289;drc=896c8affa4958aefe0ab750cdc4a69b15d97816d) calculates whether the incoming frame should be committed. `needs_commit` is calculated per subsurface contained in the WaylandFrame in the reverse order. If a subsurface needs to commit, [WaylandSurface::Commit](https://source.chromium.org/chromium/chromium/src/+/main:ui/ozone/platform/wayland/host/wayland_surface.cc;l=306;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) is called and sends `wl_surface_commit` message. [ConfigureAndShowSurface](https://source.chromium.org/chromium/chromium/src/+/main:ui/ozone/platform/wayland/host/wayland_subsurface.cc;l=129;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) sets up `wl_subsurface` by stacking order of subsurfaces. It returns whether or not changes require a commit to `wl_surface`. 1. [WaylandSubsurface::Show](https://source.chromium.org/chromium/chromium/src/+/main:ui/ozone/platform/wayland/host/wayland_subsurface.cc;l=58;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) returns false if the frame is already visible. `visible_` becomes true by `Show` and false by `Hide`. 2. true if origin is changed (<- this may not be needed) 3. true if clip is changed 4. true if transform is changed 5. true if below frame or above frame is changed [ApplySurfaceConfigure](https://source.chromium.org/chromium/chromium/src/+/main:ui/ozone/platform/wayland/host/wayland_frame_manager.cc;l=340;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) calculates `need_commit` again. This configures surface without committing `wl_surface` and returns if we should commit to the `wl_surface`. `need_commit` is true if - [WaylandSurface::AttachBuffer](https://source.chromium.org/chromium/chromium/src/+/main:ui/ozone/platform/wayland/host/wayland_surface.cc;l=279;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) returns true + frame callback is null. AttachBuffer returns true if buffer id is different between `state_` and `pending_state_`. - if presentation is non-null - calculatres [ApplyPendingState](https://source.chromium.org/chromium/chromium/src/+/main:ui/ozone/platform/wayland/host/wayland_surface.cc;l=451;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090): if the state has been changed for example: buffer id, color space, transform, opacity, use blending, priority hint, input region, opaque region, background color, rounded clip boiunds, clip rect, contains video...