Introduction and updates from NVIDIA

James Jones jajones at nvidia.com
Wed May 11 20:43:45 UTC 2016


On 05/04/2016 08:56 AM, Daniel Stone wrote:
> Hi,
> Interleaving both replies ...
>
> On 3 May 2016 at 19:44, James Jones <jajones at nvidia.com> wrote:
>> On 05/03/2016 09:53 AM, Daniel Stone wrote:
>>> On 3 May 2016 at 17:07, James Jones <jajones at nvidia.com> wrote:
>>>> No, the necessary extensions can not be contained within the binding.
>>>> There
>>>> is not enough information within the driver layer alone. Something needs
>>>> to
>>>> tell the driver when the configuration changes (E.g., the consumer of a
>>>> wayland surface switches from a texture to a plane) and what the new
>>>> configuration is. This would trigger the protocol notifications &
>>>> subsequent optimization within the driver.  By the nature of their API,
>>>> streams would require the compositor to take action on such configuration
>>>> changes, and streams can discover the new configuration.  Something
>>>> equivalent would be required to make this work in the GBM+wl_drm/EGL
>>>> case.
>>>
>>> I don't think this is the case. As I went through with Andy, we
>>> _already_ have intent expressed in the GBM case, in the exact same way
>>> that EGLStreams does: consider gbm_bo_import as equivalent for
>>> attaching to an EGLOutput(Layer) consumer, and EGLImage import +
>>> TargetTexture2D as equivalent for attaching a gltexture consumer.
>>
>>
>> "Will be used for display on device X" is not sufficient information, as
>> Daniel Vetter outlined.
>
> Indeed, but nothing we have - including both the initial Streams
> patchset, and the subsequent proposals for adding muxing as well as
> KMS config passthrough - is sufficient for that.
>
> The Streams Check/Commit proposal you outlined a couple of mails ago
> isn't sufficient because you often need to know global configuration
> to determine if a configuration is even usable, let alone optimal:
> shared decompression/detiling units, global bandwidth/watermark
> limits, etc. Having just one entrypoint to Streams where it gets very
> limited information about each plane that Streams is using isn't
> enough, because it needs to know the global configuration.
>
> So to actually make this work on other hardware, you'd need to pass
> the full request (including content which came via other sources, e.g.
> dmabuf) through to Streams. And by the time you're handing your entire
> scene graph off to an external component to determine the optimal
> configuration ... well, that's basically HWC.

I'm sorry for mixing them up again by alluding to Daniel Vetter's 
statement, but there are two separate things being discussed here:

-A fully optimal scene-graph.  This is important, but not solved by 
streams alone.  Streams could work as one of several building blocks in 
a solution for this.

-Optimal presentation and allocation of buffers between two endpoints 
(I.e., optimizing frame allocation and delivery for what Weston can do 
right now).  My claim was that current streams solve this, while current 
GBM does not provide enough information for even this optimization.

Solving the global scene graph optimization problem is important, but 
will require additional work.  The incremental gains from using streams 
(worth around 10% raw throughput on Kepler-based NVIDIA GPUs for 
example, supposedly more on later hardware though I've not yet 
benchmarked directly there) should not be ignored just because they 
don't achieve perfection in a single step.  Incremental improvements are 
still valuable.

> I'm also not sure what the plan is for integrating with Vulkan
> compositors: does that end up as an interop extension? Does VK WSI
> gain an equivalent which allows you to mux swapchain/device_swapchain?
> (Similar questions for the Check/Commit API really.)

Yes, if an EGL-based client was presenting to a Vulkan-based compositor, 
interop would be happening somewhere.  Either yet-to-be-developed Vulkan 
primitives could be used to implement the wayland-egl library with 
interop on the client side, or EGLStreams could be used to implement the 
wayland-egl library with interop on the server side.  Or there could be 
EGL->(wl_drm)->Vulkan, which is essentially 2 interop steps, but that 
has the same shortcomings we've been discussing for the current 
EGL->(wl_drm)->EGL/GBM+DRM situation.

>>> This
>>> is the exact same proxy for intent to display, and in fact the GBM
>>> approach is slightly more flexible, because it allows you to both do
>>> direct scanout as well as GPU composition (e.g. if you're
>>> capturing/streaming at the same time as display).
>>>
>>> Again though, without stream-retargeting, this is not something which
>>> exists in Streams today, and doing so is going to require more
>>> extensions: more code in your driver, more code in every
>>> implementation. GBM today, for all its faults, does not require
>>> further API extension to make this work.
>>
>> Agreed.  We're working on similar flexibility for streams via an EGLSwitch
>> muxing extension.  As mentioned above, GBM would require API extensions and
>> driver updates to reach the expressiveness of streams as well though.
>
> Right - but as with the point I was making below, GBM _right now_ is
> more capable than Streams _right now_. GBM right now would require API
> additions to match EGLStreams + EGLSwitch + Streams/KMS-interop, but
> the last two aren't written either, so. (More below.)

The current behavior that enables this, where basically all Wayland 
buffers must be allocated as scanout-capable, isn't reasonable on NVIDIA 
hardware.  The requirements for scanout are too onerous.  I'm sure it 
works in demos on nouveau, but it's not realistic for a production driver.

>> What streams exposes is intended to lower the amount of stuff hidden in
>> drivers, not increase it.  Streams is a generic swapchain mechanism exposed
>> to any user, whereas we would need to write something proprietary (maybe
>> open source, maybe closed source, but NVIDIA-specific none the less) for
>> each window system to get equivalent performance if we pushed the
>> abstraction to a lower level.
>
> Hm, I'm not quite sure how this adds up. Streams + Switch +
> Streams/KMS interop is a _lot_ of complexity that goes buried into
> drivers, with no external visibility. I don't doubt your ability to
> get it right, but I _do_ doubt the ability of others to get this
> right. As you say, Streams is intended to make these problems go away,
> but it doesn't disappear, it just shifts elsewhere.

I agree with much of the above, but I don't think it's at odds with my 
statement.

Yes, something still needs to solve the problem of which type of buffer 
is best for the combination of producer X and consumer Y.  However, this 
is always going to be hardware-specific, so a vendor-specific backend is 
going to be the best place for it regardless of where that backend 
lives.  EGLSwitch/supporting multiple possible consumers with one 
preferred one just makes that decision more complex, but doesn't change 
the HW-specific nature of the process.

Something needs to handle the operations that prepare a buffer for use 
on consumer Y after producer X has completed its work, and vice-versa. 
Again, what exactly those operations are is HW-specific, so they're 
going to live in HW-specific portions of the library (eglSwapBuffers(), 
or the Vulkan layout transitions + memory barriers).

The KMS interactions are trivial: Filling in some framebuffer attributes 
on an atomic request.  The rest of the atomic request setup could still 
be done non-opaquely since, as you've pointed out, EGLStreams don't 
solve the overall configuration optimization problem.

Comparing:

(a) The minimal set (or as close to it as possible) of HW-specific
operations encapsulated in one object (a stream) that can be re-used
across various higher-level projects.

(b) Implementing several similar but slightly different window system
integration modules in each driver along with the above necessary 
encapsulations.

It seems to me that (a) results in less overall encapsulation.

> I worry that, by
> the time you're done building out all the capability you're talking
> about on top of Streams, we'll end up with a spec that will be
> interpreted and implemented quite differently by every vendor.

The same could be said of any standard or API that attempts to address a 
complex use case.  We could agree to require standardized testing at the 
Khronos level (It wouldn't be the first time EGL conformance was 
suggested), or unofficially require piglit tests for the necessary 
stream extensions if that would help.  Arguably, weston could act as the 
de-facto conformance test too, though.

>>> Media falls down because currently there is no zerocopy binding from
>>> either hardware or software media decode engines. Perhaps not the case
>>> on your hardware, unusually blessed with a great deal of memory
>>> bandwidth, but a great many devices physically cannot cope with a
>>> single copy in the pipeline, given the ratio of content size to memory
>>> bandwidth. Doing this in EGL would require a 'draw' step which simply
>>> presented an existing buffer - a step which would unnecessarily
>>> involve the GPU if the pipeline is direct from decode to scanout - or
>>> it would involve having every media engine write their own bindings to
>>> the Streams protocol.
>>
>> Right.  Streams are meant to support lot's of different producers and
>> consumers.
>
> Have you looked much at the media landscape, and discussed it with
> relevant projects - GStreamer, Kodi/XBMC, etc?

I haven't personally.  Others in NVIDIA are working on the multimedia 
aspects of streams.

>>> There are also incredibly exacting timing requirements for media
>>> display, which the Streams model of 'single permanently fixed latency'
>>> does not even come close to achieving. So for that you'd need another
>>> extension, to report actual achieved timings back. Wayland today
>>> fulfills these requirements with the zlinux_dmabuf and
>>> presentation_timing protocols, with the original hardware timings fed
>>> back through KMS.
>>
>>
>> Would it be reasonable to support such existing extensions while using
>> streams?
>
> Again, you'd need to add quite a bit of new API to Streams. In
> particular, every frame would need to gain two EGL objects: one for
> the producer which could be used to obtain presentation feedback, and
> one for the consumer which could be used to submit presentation
> feedback. And with this, you bang hard into EGL's lack of signalling,
> unless clients are expected to either poll or spin up a separate
> thread just to block.

The existing feedback mechanisms couldn't be used along side streams 
without integrating them into EGL?  Streams just deliver frames, but it 
should be possible to correlate those frames with some external 
mechanism providing feedback on them.

>>> Every additional codepath has its cost. Even if you just look at
>>> Mutter and Weston in a vacuum, it seems like it'll be quite the large
>>> patchset(s) by the time it's done, let alone extending it out to all
>>> the other compositors. This is a patchset which will need constant
>>> care and feeding: if it's not tested, it's broken. Right now, there is
>>> only one Streams implementation available, which is in a driver whose
>>> legal status is seen to be sufficiently problematic that it is not
>>> generally distributed by downstreams, which requires a whole set of
>>> external kernel patches to run. So even getting it to run is
>>> non-trivial.
>>>
>>> But then we'd have to do that in such a way that it was generally
>>> available, else any refactoring or changes we wanted to do internally
>>> would have to be blocked on testing/review from someone who knew that
>>> backend well enough. Either that, or it would just get broken.
>>> Introducing these codepaths has a very, very, real cost to the
>>> projects you're talking about.
>>
>>
>> If there were an open source implementation of streams, would that affect
>> your view?
>
> It would definitely make it significantly easier, especially as we
> work towards things like continuous integration (see kernelci.org -
> and then extend that upwards a bit). Something that is open, doesn't
> require non-mainline kernels (or at least has a path where you can see
> it working towards running on mainline), runs on real hardware, etc,
> would really make it much easier.
>
>>> You could quite rightly point to the Raspberry Pi DispManX backend as
>>> an example of the same, and you'd be right. And that's why I'm
>>> extremely enthused about how their new KMS/GBM driver allows us to
>>> nuke the entire backend from orbit, and reduce our testing load by
>>> shifting them to the generic driver.
>>
>>
>> I hope we can avoid an entirely forked compositor-drm/eglstream (and
>> especially gl-renderer) for these reasons.  The majority of the code is
>> still common and would be exercised using either path.
>
> Oh, I'm talking about a three-way split: gl-renderer-common.c,
> gl-renderer-eglimage.c, gl-renderer-eglstreams.c, and the same for
> compositor-drm.c. It's not reasonable to require you to write your own
> DRM backlight property handling, or Weston -> GL scene-graph
> transformation handling.

That does sound like a reasonable direction.  Would you consider such a 
refactoring palatable?

>>> It is unfortunate that you seem to discuss 'Streams' as an abstract
>>> concept of a cross-process swapchain which can be infinitely adjusted
>>> to achieve perfection, and yet 'GBM' gets discussed as a singular
>>> fixed-in-time thing which has all the flaws of just one of its
>>> particular platform implementations.
>>
>> I have a stronger understanding of the design direction for streams than I
>> do for GBM, and EGLStream is indeed intended to evolve towards the best
>> abstraction of a swapchain possible.  My views of GBM are based on the
>> current API.  I'm not that familiar with the Mesa implementation details.
>> I'd be happy to learn more about the direction the GBM API is taking in the
>> future, and that's half of what I was attempting to do in my
>> responses/questions here.
>
> Well, this thread is hopefully shaping it!
>
>>> I don't see how GBM could really perform any worse in such a design.
>>
>> The current GBM API is not expressive enough to support optimal buffer
>> allocation (at least on our hardware) in such a design.
>
> Currently, that's objectively true of both GBM and Streams. Both are
> going to need extension to work as hoped.

Yes.  Given more work is needed (a lot more, apparently), my hope is to 
leverage that work as broadly as possible.  I hope NVIDIA's statements 
thus far have shown that a solution based on streams is more valuable in 
that regard than a solution spread across EGL, Wayland protocol, and GBM.

Thanks,
-James

> Cheers,
> Daniel
>


More information about the wayland-devel mailing list