<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Hello,<br>
      <br>
      I've read carefully your new protocol proposition, <br>
      but I think it doesn't meet the requirements to implement <br>
      the X Present extension for XWayland.<br>
      <br>
      The problem is that I need to be able to use the frame<br>
      request too (I need the frame callback and the presentation time).<br>
      <br>
      Except this problem, I think your protocol proposition is fine.<br>
      I suggest to change the spec<br>
      to include the fact that queue is a more complete commit, <br>
      and will take into account a pending frame request,<br>
      and associate it to the wl_buffer we queue.<br>
      Since the frame request is linked to a callback, the client<br>
      can find to which buffer it is associated when it gets the<br>
      frame feedback.<br>
      <br>
      Note: to be able to get the presentation time, when the X client <br>
      doesn't ask a specific presentation time, I'll have to use a queue<br>
      of length one with a requested time of 0. Your spec says it should<br>
      behave correctly.<br>
      <br>
      I'm adding a few comments behind.<br>
      <br>
      Axel Davy<br>
      <br>
      On 08/11/2013,  Frederic Plourde wrote :<br>
    </div>
    <blockquote cite="mid:527CD22A.3090605@collabora.co.uk" type="cite">
      <meta content="text/html; charset=ISO-8859-1"
        http-equiv="Content-Type">
      <div class="moz-cite-prefix">Hi, <br>
        <br>
        I have gathered comments and suggestions from colleagues and
        wayland-devel reviewers and here is RFC v.2 of our buffer queue
        + presentation feedback protocol extension.<br>
        <br>
        Notice the following changes :<br>
        -----------------------------------------<br>
         - it's changed name to make it more general. (comments/ideas on
        the protocol and interfaces names are welcome). We believe this
        wl_surface extension really is down to adding a timed buffer
        queue, hence the wl_buffer_queue interface name.<br>
        <br>
         - it's been extended to include presentation time feedback
        (wl_presentation_time)<br>
        <br>
         - Extensive comments were added.<br>
        <br>
        please, see the code below:<br>
        <br>
        <br>
        <br>
        <tt><?xml version="1.0" encoding="UTF-8"?></tt><tt><br>
        </tt><tt><protocol name="presentation_timing"></tt><tt><br>
        </tt><tt><br>
        </tt><tt>  <copyright></tt><tt><br>
        </tt><tt>    Copyright © 2012-2013 Collabora, Ltd.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>    Permission to use, copy, modify, distribute, and
          sell this</tt><tt><br>
        </tt><tt>    software and its documentation for any purpose is
          hereby granted</tt><tt><br>
        </tt><tt>    without fee, provided that the above copyright
          notice appear in</tt><tt><br>
        </tt><tt>    all copies and that both that copyright notice and
          this permission</tt><tt><br>
        </tt><tt>    notice appear in supporting documentation, and that
          the name of</tt><tt><br>
        </tt><tt>    the copyright holders not be used in advertising or
          publicity</tt><tt><br>
        </tt><tt>    pertaining to distribution of the software without
          specific,</tt><tt><br>
        </tt><tt>    written prior permission.  The copyright holders
          make no</tt><tt><br>
        </tt><tt>    representations about the suitability of this
          software for any</tt><tt><br>
        </tt><tt>    purpose.  It is provided "as is" without express or
          implied</tt><tt><br>
        </tt><tt>    warranty.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>    THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH
          REGARD TO THIS</tt><tt><br>
        </tt><tt>    SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
          MERCHANTABILITY AND</tt><tt><br>
        </tt><tt>    FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE
          LIABLE FOR ANY</tt><tt><br>
        </tt><tt>    SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
          DAMAGES</tt><tt><br>
        </tt><tt>    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
          PROFITS, WHETHER IN</tt><tt><br>
        </tt><tt>    AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
          ACTION,</tt><tt><br>
        </tt><tt>    ARISING OUT OF OR IN CONNECTION WITH THE USE OR
          PERFORMANCE OF</tt><tt><br>
        </tt><tt>    THIS SOFTWARE.</tt><tt><br>
        </tt><tt>  </copyright></tt><tt><br>
        </tt><tt><br>
        </tt><tt>  <interface name="wl_presentation" version="1"></tt><tt><br>
        </tt><tt>    <description summary="buffer queues with
          presentation timing information/</tt><tt><br>
        </tt><tt>                          for surfaces"></tt><tt><br>
        </tt><tt>      The global factory interface exposing timestamped
          buffer queuing composi-</tt><tt><br>
        </tt><tt>      ting capabilities.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>      The aim of presentation timing is to support
          streaming video generally</tt><tt><br>
        </tt><tt>      coming from videosink clients that typically need
          to queue video buffers</tt><tt><br>
        </tt><tt>      with presentation timestamps in order to
          accurately synchronize video </tt><tt><br>
        </tt><tt>      and audio streams.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>      This global interface allows for the creation of
          timestamped buffer </tt><tt><br>
        </tt><tt>      queues for wl_surface objects.</tt><tt><br>
        </tt><tt>    </description></tt><tt><br>
        </tt><tt><br>
        </tt><tt>    <request name="destroy" type="destructor"></tt><tt><br>
        </tt><tt>      <description summary="unbind from the
          wl_presentation interface"></tt><tt><br>
        </tt><tt>        Tell the server that the client will not be
          using this</tt><tt><br>
        </tt><tt>        protocol object anymore. This does not affect
          any other</tt><tt><br>
        </tt><tt>        objects, wl_buffer_queue objects included.</tt><tt><br>
        </tt><tt>      </description></tt><tt><br>
        </tt><tt>    </request></tt><tt><br>
        </tt><tt><br>
        </tt><tt>    <enum name="error"></tt><tt><br>
        </tt><tt>      <entry name="buffer_queue_exists" value="0"</tt><tt><br>
        </tt><tt>             summary="the surface already has a
          buffer_queue object/</tt><tt><br>
        </tt><tt>                      associated to it"/></tt><tt><br>
        </tt><tt>    </enum></tt><tt><br>
        </tt><tt><br>
        </tt><tt>    <event name="clock_id", type="uint"></tt><tt><br>
        </tt><tt>      <description summary="clock ID to use"></tt><tt><br>
        </tt><tt>        Tell the client which clock ID is the
          compositor going to use for time-</tt><tt><br>
        </tt><tt>        stamps and presentation feedback.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>        Compositor sends that event once to a client
          right after it binds to </tt><tt><br>
        </tt><tt>        the global interface.</tt><tt><br>
        </tt><tt>      </description></tt><tt><br>
        </tt><tt>    </event></tt><tt><br>
        </tt><tt><br>
        </tt></div>
    </blockquote>
    <tt>Could you be more precise? To what corresponds the IDs? If I'm a
      client, and I have the<br>
      choice between some IDs, which one should I take? Will the IDs
      mean the same on all Wayland<br>
      compositors?<br>
    </tt>
    <blockquote cite="mid:527CD22A.3090605@collabora.co.uk" type="cite">
      <div class="moz-cite-prefix"><tt> </tt><tt>    <request
          name="create_queue"></tt><tt><br>
        </tt><tt>      <description summary="add buffer queueing
          capabilities to a wl_surface"></tt><tt><br>
        </tt><tt>        Create and attach a wl_buffer_queue interface
          to the given wl_sur-</tt><tt><br>
        </tt><tt>        face. This effectively adds buffer queueing and
          presentation timing</tt><tt><br>
        </tt><tt>        feedback capabilities to the surface through
          the use of buffer queues</tt><tt><br>
        </tt><tt>        and presentation callbacks.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>        If the given wl_surface already has a
          wl_buffer_queue object associated</tt><tt><br>
        </tt><tt>        to it, the buffer_queue_exists protocol error
          is raised.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>        Here, clock_id is needed to negociate time
          domain with the compositor</tt><tt><br>
        </tt><tt>        as a common basis when specifing timestamps and
          presentation callbacks.</tt><tt><br>
        </tt><tt>        clock_id is an implementation-specific integer
          representing the clock</tt><tt><br>
        </tt><tt>        identification.</tt><tt><br>
        </tt><tt>      </description></tt><tt><br>
        </tt><tt><br>
        </tt><tt>      <arg name="id" type="new_id"
          interface="wl_buffer_queue"</tt><tt><br>
        </tt><tt>           summary="the new buffer_queue object
          id"/></tt><tt><br>
        </tt><tt>      <arg name="surface" type="object"
          interface="wl_surface"</tt><tt><br>
        </tt><tt>           summary="the surface to be turned intio a
          buffer_queue surface"/></tt><tt><br>
        </tt><tt>      <arg name="clock_id" type="uint"
          summary="clock ID to be used for/</tt><tt><br>
        </tt><tt>                                               
          timestamps"></tt><tt><br>
        </tt><tt>    </request></tt><tt><br>
        </tt><tt>  </interface></tt><tt><br>
        </tt><tt><br>
        </tt><tt>  <interface name="wl_buffer_queue" version="1"></tt><tt><br>
        </tt><tt>    <description summary="buffer queue interface to
          a wl_surface"></tt><tt><br>
        </tt><tt>      An additional interface to a wl_surface object to
          enable buffer queueing</tt><tt><br>
        </tt><tt>      capabilities. A buffer_queue-enabled surface
          contains a buffer queue and</tt><tt><br>
        </tt><tt>      exposes protocol that allows for queuing
          timestamped wl_buffer objects</tt><tt><br>
        </tt><tt>      into the queue and requesting presentation time
          feedback.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>      Buffer_queue-enabled surfaces do not declare any
          state in addition to the</tt><tt><br>
        </tt><tt>      ones wl_surfaces already use by default. Thus,
          once a plain wl_surface has</tt><tt><br>
        </tt><tt>      been turned into a buffer_queue-enabled surface,
          buffer queuing hap-</tt><tt><br>
        </tt><tt>      pens through the "queue" request. This means that
          queuing up</tt><tt><br>
        </tt><tt>      buffers does *not* require any surface.attach nor
          surface.commit. More-</tt><tt><br>
        </tt><tt>      over, such an attach + commit sequence will clear
          the buffer queue in</tt><tt><br>
        </tt><tt>      order to exclusively consider the newly attached
          buffer. Hence,</tt><tt><br>
        </tt><tt>      surface.attach and surface.commit should *not* be
          used when specifying</tt><tt><br>
        </tt><tt>      streaming surface content via buffer_queue. Also,
          queuing up a wl_buffer</tt><tt><br>
        </tt><tt>      makes it "reserved" in the compositor just like
          attach + commit does.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>      Besides, it is perfectly acceptable to commit
          (without attach) some</tt><tt><br>
        </tt><tt>      states on a buffer_queue-enabled surface, as it
          will not clear the buffer</tt><tt><br>
        </tt><tt>      queue nor interfere with any presentation timing
          mechanism brought by</tt><tt><br>
        </tt><tt>      the presentation_timing interfaces.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>      The compositor will attempt to repaint so that
          each queued buffer gets</tt><tt><br>
        </tt><tt>      presented at the requested target time. However,
          this may not always be</tt><tt><br>
        </tt><tt>      possible e.g. when a requested presentation time
          cannot be met accurately</tt><tt><br>
        </tt><tt>      or when the target time has completely passed
          already and been replaced by</tt><tt><br>
        </tt><tt>      another buffer by the time the compositor can
          repaint again. Therefore,     </tt><tt><br>
        </tt><tt>      At every repaint cycle, enqueued buffers with
          past-timestamps, if any,</tt><tt><br>
        </tt><tt>      will be considered and the compositor will
          present the most recent one</tt><tt><br>
        </tt><tt>      among them. At that point, buffers with older
          timestamps will be removed</tt><tt><br>
        </tt><tt>      from the queue and released (a BUFFER_RELEASE
          event will be fired for</tt><tt><br>
        </tt><tt>      every removed one). Also, at every repaint cycle,
          future-timestamped</tt><tt><br>
        </tt><tt>      buffers will be kept untouched in the queue.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>      When applying a buffer from the queue, the
          compositor implies full</tt><tt><br>
        </tt><tt>      surface damage. If the client manages to attach +
          damage + commit in the</tt><tt><br>
        </tt><tt>      meantime, then the damage is what it explicitely
          specified (and the</tt><tt><br>
        </tt><tt>      buffer_queue gets cleared)</tt><tt><br>
        </tt><tt>    </description></tt><tt><br>
        </tt><tt><br>
        </tt><tt>    <request name="destroy" type="destructor"></tt><tt><br>
        </tt><tt>      <description summary="remove buffer_queue
          interface"></tt><tt><br>
        </tt><tt>        The buffer_queue interface is removed from the
          buffer_queue-enabled</tt><tt><br>
        </tt><tt>        surface.</tt><tt><br>
        </tt><tt>      </description></tt><tt><br>
        </tt><tt>    </request></tt><tt><br>
        </tt><tt><br>
        </tt><tt>    <request name="queue"></tt><tt><br>
        </tt><tt>      <description summary="enqueue a buffer into
          the surface's buffer queue"></tt><tt><br>
        </tt><tt>        Queue a buffer along with its timestamp into
          the surface's internal</tt><tt><br>
        </tt><tt>        buffer queue. This timestamp is the intended
          presentation time. While</tt><tt><br>
        </tt><tt>        clients generally want to queue posterior
          timestamps (future), queueing</tt><tt><br>
        </tt><tt>        up anterior timestamps (in the past) is allowed
          and does not raise any</tt><tt><br>
        </tt><tt>        protocol error.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>        The speficied timestamp is two-part. tv_sec is
          the number of seconds</tt><tt><br>
        </tt><tt>        and tv_nsec defines the number of nanoseconds
          spent after tv_sec.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>        Calling queue() will create a
          wl_presentation_time object that is ex-</tt><tt><br>
        </tt><tt>        clusively associated with the provided
          wl_buffer lifetime in the queue</tt><tt><br>
        </tt><tt>        at the moment the object was created. This
          means that presentation</tt><tt><br>
        </tt><tt>        feedback concerning this wl_buffer will be
          provided through wl_presen-</tt><tt><br>
        </tt><tt>        tation_time events, but only once. As soon as
          the buffer is presented</tt><tt><br>
        </tt><tt>        and removed from the queue by the compositor,
          it's internal link to</tt><tt><br>
        </tt><tt>        the wl_presentation_time object is broken and
          associated presentation</tt><tt><br>
        </tt><tt>        events will never be called again. So a client,
          right after having recei-</tt><tt><br>
        </tt><tt>        ved a wl_presentation_time event will generally
          destroy that object.</tt><tt><br>
        </tt><tt>        On the other hand, if a client does not want
          feedback, it may destroy</tt><tt><br>
        </tt><tt>        presentation_time object right after queuing a
          buffer.</tt><tt><br>
        </tt><tt>      </description></tt><tt><br>
        </tt><tt><br>
        </tt><tt>      <arg name="buffer" type="object"
          interface="wl_buffer"</tt><tt><br>
        </tt><tt>           summary="the buffer to queue"/></tt><tt><br>
        </tt><tt>      <arg name="id" type="new_id"
          interface="wl_presentation_time"</tt><tt><br>
        </tt><tt>           summary="the new presentation_time object
          id"/></tt><tt><br>
        </tt><tt>      <arg name="tv_sec" type="uint"</tt><tt><br>
        </tt><tt>           summary="seconds value of the buffer target
          timestamp"/></tt><tt><br>
        </tt><tt>      <arg name="tv_nsec" type="uint"</tt><tt><br>
        </tt><tt>           summary="nanoseconds value of the buffer
          target timestamp"/></tt><tt><br>
        </tt><tt>    </request></tt><tt><br>
        </tt></div>
    </blockquote>
    <blockquote cite="mid:527CD22A.3090605@collabora.co.uk" type="cite">
      <div class="moz-cite-prefix"><tt> </tt><tt><br>
        </tt><tt>    <request name="clear"></tt><tt><br>
        </tt><tt>      <description summary="clear the surface's
          buffer queue"></tt><tt><br>
        </tt><tt>        Clear the surface's buffer queue. All buffers
          are removed from the</tt><tt><br>
        </tt><tt>        queue and released as appropriate. The
          requested presentation times are</tt><tt><br>
        </tt><tt>        discarded. The surface retains the contents it
          currently has, at the</tt><tt><br>
        </tt><tt>        time the compositor processes this request. The
          compositor may not</tt><tt><br>
        </tt><tt>        release the buffer(s) currently being displayed
          if it is needed for</tt><tt><br>
        </tt><tt>        repainting or scanout, as usual.</tt><tt><br>
        </tt><tt>      </description></tt><tt><br>
        </tt><tt>    </request></tt><tt><br>
        </tt><tt>  </interface></tt><tt><br>
        </tt><tt><br>
        </tt><tt>  <interface name="wl_presentation_time"
          version="1"></tt><tt><br>
        </tt><tt>    <description summary="presentation time feedback
          event"></tt><tt><br>
        </tt><tt>      The wl_presentation_time object encapsulates
          presentation time events</tt><tt><br>
        </tt><tt>      sent as feedback by the compositor to a client
          that previously queued</tt><tt><br>
        </tt><tt>      a wl_buffer. wl_presentation_time objects are
          created and returned when</tt><tt><br>
        </tt><tt>      a client enqueues a buffer through the
          wl_buffer_queue.queue() request.</tt><tt><br>
        </tt><tt><br>
        </tt><tt>      Note that presentation time only tells client
          when the compositor presen-</tt><tt><br>
        </tt><tt>      ted the buffer to display hardware, not when the
          buffer was turned into</tt><tt><br>
        </tt><tt>      light (actually displayed on screen) by this
          hardware. As there could</tt><tt><br>
        </tt><tt>      be anything displaying those buffers, from very
          fast, low-latency</tt><tt><br>
        </tt><tt>      computer monitors to slow, hi-latency HDMI TV
          screens, it is the client's</tt><tt><br>
        </tt><tt>      responsibility to make sure it knows what display
          hardware is currently</tt><tt><br>
        </tt><tt>      connected and what is its latency.</tt><tt><br>
        </tt><tt>    </description></tt><tt><br>
        </tt></div>
    </blockquote>
    It should be even more precise here, else we might not see the
    difference with <br>
    the frame request (which, by the way, should be clarified).<br>
    <br>
    For example when you schedule a pageflip, you would send the
    presented event only when you know<br>
    the pageflip has succeeded, not when you schedule the pageflip.<br>
    I believe "when the compositor presented the buffer to display
    hardware" <br>
    could be interpreted the wrong way in this example (scheduling a
    pageflip can<br>
    be considered presenting the buffer to display hardware).<br>
    <br>
    <blockquote cite="mid:527CD22A.3090605@collabora.co.uk" type="cite">
      <div class="moz-cite-prefix"><tt> </tt><tt><br>
        </tt><tt>    <request name="destroy" type="destructor"></tt><tt><br>
        </tt><tt>      <description summary="destroy presentation
          time request"></tt><tt><br>
        </tt><tt>        The presentation_time object is destroyed and
          none of its events will</tt><tt><br>
        </tt><tt>        ever be called again.</tt><tt><br>
        </tt><tt>      </description></tt><tt><br>
        </tt><tt>    </request></tt><tt><br>
        </tt><tt><br>
        </tt><tt>    <event name="presented"></tt><tt><br>
        </tt><tt>      <description summary="buffer was
          displayed"></tt><tt><br>
        </tt><tt>         Tell the client that a buffer was presented at
          time T=tv_sec+tv_nsec.</tt><tt><br>
        </tt><tt>         This event only pertains to the one wl_buffer
          that was passed in when</tt><tt><br>
        </tt><tt>         calling the buffer_queue.queue Thus, a
          particular presentation time</tt><tt><br>
        </tt><tt>         feeback event is always associated with
          specific wl_buffer lifetime in</tt><tt><br>
        </tt><tt>         the buffer queue.</tt><tt><br>
        </tt><tt>      </description></tt><tt><br>
        </tt><tt>      <arg name="tv_sec" type="uint"</tt><tt><br>
        </tt><tt>           summary="seconds value of the buffer
          presentation timestamp"/></tt><tt><br>
        </tt><tt>      <arg name="tv_nsec" type="uint"</tt><tt><br>
        </tt><tt>           summary="nanoseconds value of the buffer
          presentation timestamp"/></tt><tt><br>
        </tt><tt>    </event></tt><tt><br>
        </tt></div>
    </blockquote>
    <tt>It should be precised that tv_nsec won't go over 999,999,999</tt>.
    <blockquote cite="mid:527CD22A.3090605@collabora.co.uk" type="cite">
      <div class="moz-cite-prefix"><tt> </tt><tt>    <event
          name="discarded"></tt><tt><br>
        </tt><tt>      <description summary="buffer was not
          displayed"></tt><tt><br>
        </tt><tt>        The buffer scheduled for presentation was not
          displayed and was</tt><tt><br>
        </tt><tt>        removed from the buffer_queue.</tt><tt><br>
        </tt><tt>      </description></tt><tt><br>
        </tt><tt>    </event></tt><tt><br>
        </tt><tt>  </interface></tt><tt><br>
        </tt><tt></protocol></tt><br>
        <br>
        <br>
        <br>
        <br>
        <br>
        <div class="moz-signature">
          <meta http-equiv="content-type" content="text/html;
            charset=ISO-8859-1">
          <title></title>
          <a moz-do-not-send="true"
            href="http://ca.linkedin.com/in/fredericplourde"><img alt=""
              src="cid:part1.01050604.02080006@clipper.ens.fr"
              border="0" height="15" width="15"></a>  <b>Frédéric
            Plourde</b><br>
          <div class="moz-signature"> <i>Senior Software engineer</i><br>
            <blockquote><b> T</b> :: (450) 415-0855<br>
              <b>@</b>:: <a moz-do-not-send="true"
                class="moz-txt-link-abbreviated"
                href="mailto:frederic.plourde@collabora.co.uk">frederic.plourde@collabora.co.uk</a><br>
            </blockquote>
          </div>
        </div>
        <br>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
wayland-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:wayland-devel@lists.freedesktop.org">wayland-devel@lists.freedesktop.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freedesktop.org/mailman/listinfo/wayland-devel">http://lists.freedesktop.org/mailman/listinfo/wayland-devel</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>