Initial DRI3000 protocol specs available

Owen Taylor otaylor at redhat.com
Tue Feb 26 13:01:35 PST 2013


Sorry for joining the discussion late here. I went through the specs and
discussion and have various comments and questions.

- Owen

* It would be great if we could figure out a plan to get to the
  point where the exact same application code is going to work for
  proprietary and open source drivers. When you get down to the details
  of swap this isn't close to the case currently.

  - Because swap handled client side in some drivers, INTEL_swap_event
    is seen as awkward to implement.

  - There is divergence on some basic behaviors, e.g.,  whether
    glXSwapBuffers() glFinish() waits for the swap to complete or not.

  - When rendering with a compositor, the X server is innocent of
    relevant information about timing and when the application should
    draw additional new frames. I've been working on handing this
    via client <=> compositor protocols

(https://mail.gnome.org/archives/wm-spec-list/2013-January/msg00000.html)

    But this adds a lot of complexity to the minimal client, especially
    when a client wants to work both redirected and unredirected. 

  I think it would be great if we could sit down and figure out what
  the Linux-ecosystem API is for this in a way we could give to
  application authors.
  
* One significant problem that I have currently is that the default mode
  for the Intel drivers is to use triple buffering and send back swap
  events *when rendering the next frame would not block* - that is,
  immediately. This results in a frame of unnecessary latency.
  (The too-early events are also missing ust/msc/sbc information.)

  So I'd like to make sure that we know exactly what SwapComplete means
  and not have creative reinterpretations based on what works well
  for one client or another.

  The SwapComplete event is specified as - "This event is delivered
  when a SwapRegion operation completes" - but the specification
  of SwapRegion itself is fuzzy enough that I'm unclear exactly what
  that means.

  - The description SwapRegion needs to define "swap" since the
    operation has only a vague resemblance to the English-language
    meaning of "swap".

  - My interpretation of SwapRegion is that the actual propagation of
    source to destination is *asynchronous* to the X protocol stream.
    This is implied by "Schedule a swap..." but probably should be
    explicitly stated, since it is radically different from other
    rendering in X.

  - Is the serial in the SwapComplete event synchronous to the protocol
    stream? E.g., can you assume that any CopyArea from the destination
    drawable before that serial will get the old contents, and a
    CopyArea from the destination after that serial will get the new
    contents?

  - What happens when multiple SwapRegion requests are made with a
    swap-interval of zero. Are previous ones discarded?

  - Is it an error to render to a non-idle pixmap? Is it an error to
    pass a non-idle pixmap as the source to SwapRegion?

  - What's the interaction between swap-interval and target-msc, etc?

  - When a window is redirected, what's the interpretation of 
    swap-interval, target-msc, etc? Is it that the server performs the
    operation at the selected blanking interval (as if they window
    wasn't redirected), and then damage/other events are generated
    and the server picks it up and renders to the real front buffer
    at the next opportunity - usually a frame later.

* Do I understand correctly that the idle pixmaps returned from
  a SwapRegion request are the pixmaps that *will* be idle once the
  corresponding SwapComplete event is received?

  If this is correct, what happens if things change before the swap
  actually happens and what was scheduled as a swap ends up being
  a copy? Is it sufficient to assume that a ConfigureNotify on a
  destination window means that all pixmaps passed to previous
  SwapRegion requests are now idle?

* In the definition of SWAPIDLE you say:

    If valid is TRUE, swap-hi/swap-lo form a 64-bit
    swap count value from the SwapRegion request which matches the
    data that the pixmap currently contains

 If I'm not misunderstanding things, this is a confusing statement
 because, leaving aside damage to the front buffer, pixmaps always
 contain the same contents (whatever the client rendered into it.)

 Is the use of the swap-hi/swap-lo identify the SwapRegion problematical
 in the case where swaps aren't throttled? Would it be better to use
 sequence number of the request? Or is the pixmap itself sufficient?

* What control, if any, will applications have over the number of
  buffers used - what the behavior will be when an application starts
  rendering another frame in terms of allocating a new buffer versus
  swapping?

* Do we need to deal with stereo as part of this?




More information about the xorg-devel mailing list