On Tue, Aug 16, 2016 at 09:51:01AM -0500, Derek Foreman wrote:
> On 15/08/16 09:33 PM, Bryce Harrington wrote:
> > 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 <br...@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?
>
> Well, as a quick example, in compositor.h, the comment after
> WESTON_COMPOSITOR_SLEEPING is:
> /* same as offscreen, but also set dpms to off */
>
> This isn't accurate anymore as it's possible for us to be
> WESTON_COMPOSITOR_SLEEPING and not actually have any displays with dpms
> off at all, isn't it?

Yes that's true, if there are idle inhibits being honored, some or all
of the displays would not be dpms'd off.

> It becomes very confusing to figure out what's going on when "sleeping"
> doesn't necessarily mean anything is asleep at all.  Maybe a new state
> should be introduced, but at a minimum all of the comments related to
> sleeping should be updated to be in sync with the new behaviour.

Do you mean rename WESTON_COMPOSITOR_SLEEPING to something more
descriptive, or to actually split SLEEP state into two different states?

If the former, what would be a better term than "sleeping" in this case?
WESTON_COMPOSITOR_INACTIVE?  _STOPPED?  ... _DROWSY?

Or, for just updating the comments, would tacking on "...where
applicable" be adequate, or would you want something more elaborate?

> >>>       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?
>
> Well, the doxy says "Set a DPMS mode on all of the compositor's outputs"
>
> After the patch it doesn't do that, it conditionally turns off monitors
> that aren't being governed by a blanker inhibitor.

Ok, does this strike you as better?

/** Apply a DPMS mode to the compositor's outputs.
 *
 * Outputs may skip setting the DPMS state if they are being used to
 * display an surface that is requesting idle behaviors be inhibited.
 *
 * \param compositor The compositor instance
 * \param state The DPMS state the outputs will be set 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.
>
> I guess I'm fine with it, no need to bike shed this point.

Ok.

> >> 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".
>
> Ah, ok, thought that might be the case.  Would be good to see a patch
> with the text fixed.

I've applied this fix locally.  I can repost the patchset once the
remainder of your review comments are resolved (and rebased to
trunk... which is proving to be a bit of a head scratcher due to the
libweston-desktop port.)

Thanks again for reviewing!

Bryce

> Thanks,
> Derek
>
> > 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
> >>>
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to