[PATCH weston v4 1/3] compositor: If the output is inhibited, don't idle it off
Bryce Harrington
bryce at osg.samsung.com
Tue Aug 16 02:33:16 UTC 2016
On Mon, Aug 15, 2016 at 06:57:52PM -0500, Derek Foreman wrote:
> On 10/08/16 07:25 PM, Bryce Harrington wrote:
> > Adds a helper routine weston_output_inhibited_outputs() which returns a
> > mask of outputs that should inhibit screen idling.
> >
> > Use this routine to check for inhibiting outputs for handling of idle
> > behaviors in core: In sleep mode, only halt repainting outputs that
> > don't have valid inhibits. Don't send these monitors DPMS off commands
> > either, if the system would otherwise be powering them down.
> >
> > Signed-off-by: Bryce Harrington <bryce at osg.samsung.com>
> > ---
> > libweston/compositor.c | 57 ++++++++++++++++++++++++++++++++++++++++++++------
> > libweston/compositor.h | 10 +++++++++
> > 2 files changed, 61 insertions(+), 6 deletions(-)
> >
> > diff --git a/libweston/compositor.c b/libweston/compositor.c
> > index b17c76d..aa14504 100644
> > --- a/libweston/compositor.c
> > +++ b/libweston/compositor.c
> > @@ -485,6 +485,8 @@ weston_surface_create(struct weston_compositor *compositor)
> >
> > wl_list_init(&surface->pointer_constraints);
> >
> > + surface->inhibit_idling = false;
> > +
> > return surface;
> > }
> >
> > @@ -2320,15 +2322,42 @@ weston_output_schedule_repaint_reset(struct weston_output *output)
> > TL_POINT("core_repaint_exit_loop", TLP_OUTPUT(output), TLP_END);
> > }
> >
> > +/** Retrieves a mask of outputs that should inhibit screensaving
> > + *
> > + * \param compositor The compositor instance.
> > + * \return An output mask indicating the ids of all inhibiting outputs
> > + *
> > + * Checks for surfaces whose clients have requested that they
> > + * disable the screenserver and display powersaving. Note
> > + * the output ids for these surfaces.
> > + */
> > +WL_EXPORT uint32_t
> > +weston_compositor_inhibited_outputs(struct weston_compositor *compositor)
> > +{
> > + struct weston_view *view;
> > + uint32_t inhibited_outputs_mask = 0;
> > +
> > + wl_list_for_each(view, &compositor->view_list, link) {
> > + /* Does the view's surface inhibit this output? */
> > + if (!view->surface->inhibit_idling)
> > + continue;
> > +
> > + inhibited_outputs_mask |= view->output_mask;
> > + }
> > + return inhibited_outputs_mask;
> > +}
> > +
> > static int
> > output_repaint_timer_handler(void *data)
> > {
> > struct weston_output *output = data;
> > struct weston_compositor *compositor = output->compositor;
> > + uint32_t inhibited_outputs_mask = weston_compositor_inhibited_outputs(compositor);
> >
> > if (output->repaint_needed &&
> > - compositor->state != WESTON_COMPOSITOR_SLEEPING &&
>
> I don't like that this patch changes the meaning of
> "WESTON_COMPOSITOR_SLEEPING" - should at least make an effort to update
> all relevant comments such as the one immediately before
> "weston_compositor_sleep" and the one in the enum definition in
> compositor.h...
I'm not sure what you mean?
> > compositor->state != WESTON_COMPOSITOR_OFFSCREEN &&
> > + (compositor->state != WESTON_COMPOSITOR_SLEEPING
> > + || inhibited_outputs_mask & (1 << output->id)) &&
> > weston_output_repaint(output) == 0)
> > return 0;
> >
> > @@ -2450,9 +2479,15 @@ weston_output_schedule_repaint(struct weston_output *output)
> > {
> > struct weston_compositor *compositor = output->compositor;
> > struct wl_event_loop *loop;
> > + uint32_t inhibited_outputs_mask = weston_compositor_inhibited_outputs(compositor);
> >
> > - if (compositor->state == WESTON_COMPOSITOR_SLEEPING ||
> > - compositor->state == WESTON_COMPOSITOR_OFFSCREEN)
> > + /* If we're offscreen, or if we're sleeping and the monitor
> > + * isn't currently being inhibited by an active surface, then
> > + * skip repainting.
> > + */
> > + if (compositor->state == WESTON_COMPOSITOR_OFFSCREEN ||
> > + (compositor->state == WESTON_COMPOSITOR_SLEEPING &&
> > + !(inhibited_outputs_mask & (1 << output->id))))
> > return;
> >
> > if (!output->repaint_needed)
> > @@ -3859,10 +3894,20 @@ weston_compositor_dpms(struct weston_compositor *compositor,
> > enum dpms_enum state)
> > {
>
> The doxy block before this function has now become wrong, hasn't it?
Not sure exactly what you mean by 'wrong', but I suppose it could
benefit from being updated to mention that idled outputs won't be
toggled off. Is that what you're referring to?
> > struct weston_output *output;
> > + struct weston_view *view;
> > + uint32_t inhibited_outputs_mask = weston_compositor_inhibited_outputs(compositor);
> >
> > - wl_list_for_each(output, &compositor->output_list, link)
> > - if (output->set_dpms)
> > - output->set_dpms(output, state);
> > + wl_list_for_each(output, &compositor->output_list, link) {
> > + if (!output->set_dpms)
> > + continue;
> > +
> > + /* If output is idle-inhibited, don't toggle to any DPMS state except ON. */
> > + if (state != WESTON_DPMS_ON &&
> > + inhibited_outputs_mask & (1 << output->id))
> > + continue;
> > +
> > + output->set_dpms(output, state);
> > + }
> > }
> >
> > /** Restores the compositor to active status
> > diff --git a/libweston/compositor.h b/libweston/compositor.h
> > index 0133084..3a9a098 100644
> > --- a/libweston/compositor.h
> > +++ b/libweston/compositor.h
> > @@ -1140,6 +1140,14 @@ struct weston_surface {
> >
> > /* An list of per seat pointer constraints. */
> > struct wl_list pointer_constraints;
> > +
> > + /*
> > + * Indicates the surface prefers no screenblanking, screensaving,
> > + * or other automatic obscurement to kick in while the surface is
> > + * considered "active" by the shell.
> > + */
> > + bool inhibit_idling;
>
> I find this a bit unclear - "idling" doesn't feel properly descriptive,
> and the comment gives me the impression that an "idle inhibit surface"
> will be redrawn even if it's obscured - does that mean surface frame
> events for the surface will be generated even if it's not visible in any
> way?
Suggestions? If the surface in in the view_list and assigned to an
output, then the idle inhibition will be honored.
> Also, what's the bit about the surface being considered active by the
> shell mean?
That functionality got axed in an earlier review, this bit of doc was
missed. Just ignore everything after "while".
Thanks,
Bryce
> Thanks,
> Derek
>
> > +
> > };
> >
> > struct weston_subsurface {
> > @@ -1316,6 +1324,8 @@ void
> > weston_output_schedule_repaint(struct weston_output *output);
> > void
> > weston_output_damage(struct weston_output *output);
> > +uint32_t
> > +weston_compositor_inhibited_outputs(struct weston_compositor *compositor);
> > void
> > weston_compositor_schedule_repaint(struct weston_compositor *compositor);
> > void
> >
More information about the wayland-devel
mailing list