[RFC dri3proto v6 01/14] Add modifier/multi-plane requests, bump to v1.1
Louis-Francis Ratté-Boulianne
lfrb at collabora.com
Thu Feb 22 08:52:08 UTC 2018
Hi,
On Wed, 2018-02-21 at 11:32 -0800, Keith Packard wrote:
> Louis-Francis Ratté-Boulianne <lfrb at collabora.com> writes:
>
> I'll review just the specification today; once we've got that wired,
> I'll go ahead and verify that the encoding matches this spec.
>
> > diff --git a/dri3proto.txt b/dri3proto.txt
> > index dac11d3..636c789 100644
> > --- a/dri3proto.txt
> > +++ b/dri3proto.txt
> > @@ -1,11 +1,12 @@
> > The DRI3 Extension
> > - Version 1.0
> > - 2013-6-4
> > + Version 1.1
> > + 2017-06-27
> >
> > Keith Packard
> > keithp at keithp.com
> > Intel Corporation
>
> You should add yourself to the authors list here.
Actually, Daniel is the one who should add his name :)
> > @@ -199,6 +202,125 @@ The name of this extension is "DRI3"
> > associated with a direct rendering device that 'fence' can
> > work with, otherwise a Match error results.
> >
> > +┌───
> > + DRI3GetSupportedModifiers
> > + window: WINDOW
> > + depth: CARD8
> > + bpp: CARD8
>
> Hrm. You've uncovered a weird "feature" of the existing DRI3
> protocol. Why does it include both depth and bpp? In the server, each
> depth has a defined bpp for image format purposes, and (currently at
> least), image bpp always matches the pixmap bpp. I'm afraid the
> original
> DRI3 proposal has no clues for us, and I'm afraid the author doesn't
> remember...
>
> The only thing I can think is that including both allows us to catch
> circumstances where the client guesses wrong about the bpp and
> creates
> an image in the wrong format. Checking a few drivers, I find that
> modesetting uses it to detect this kind of error, but (at least)
> nouveau
> simply ignores it.
>
> Should you use a visual here instead of depth? While visuals are
> actually allowed to be shared across depths in the core protocol
> specification, we currently rely on them being unique, and in fact
> the
> server implementation has always enforced that.
>
> I think using a visual would also let you support DeepColor visuals
> and
> gain access to those extended pixel formats. I'm not sure what bpp
> would
> need to be in those cases. Alternatively, we could explicitly allow
> depth to be more than 32 here?
>
> Using a visual would also allow other visual-dependent modifiers to
> be
> supported; one can imagine that TrueColor and DirectColor having a
> different set of modifiers supported. Of course, anything other than
> TrueColor isn't well supported these days anyways, so that's probably
> less important.
Wouldn't that be weird to have a totally different way of specifying
the format from the old requests. I honestly don't know enough about
DeepColor/HDR to really have an opinion about this though.
> > + ▶
> > + num_drawable_modifiers: CARD32
> > + num_screen_modifiers: CARD32
> > + drawable_modifiers: ListOfCARD64
> > + screen_modifiers: ListOfCARD64
> > +└───
> > + Errors: Window, Match
> > +
> > + For the Screen associated with 'window', return two lists
> > of
> > + supported DRM FourCC modifiers, as defined in
> > drm_fourcc.h,
> > + supported for DRI3 pixmap/buffer interchange. The first
> > list
> > + 'drawable_modifiers' contains modifiers that are specific
> > to
> > + this window and should be used over the more generic
> > + 'screen_modifiers' set.
>
> This is somewhat confusing. We use 'window' as a proxy for 'screen'
> in
> many requests, but in this request it doesn't seem to be just a proxy
> as
> you also have a set of modifiers that are specific to it.
>
> I think what makes sense is to use 'window' only to name the screen,
> and
> then to have the specific modifiers depend on the depth requested,
> not
> the drawable specified. That way you can reliably request information
> about how to create pixmaps without needing to create a temporary
> window
> of the right format before using DRI3PixmapFromBuffers.
Like was mentionned by Daniel on #xorg-devel, we really need to have
the 'drawable' here and can't easily retrieve the drawable-specific
modifiers just from the 'depth'. (We check if the window is a possible
candidate for scanout to avoid useless client buffer reallocation).
We don't explicitely state that in the spec though to be as general as
possible. I guess it wouldn't hurt to add an example though if you
think it would make things clearer.
> > +┌───
> > + DRI3PixmapFromBuffers
> > + pixmap: PIXMAP
> > + drawable: DRAWABLE
> > + num_buffers: CARD8
> > + width, height: CARD16
> > + stride0, offset0: CARD32
> > + stride1, offset1: CARD32
> > + stride2, offset2: CARD32
> > + stride3, offset3: CARD32
>
> Of course, it's weird to have a fixed list of values here. I suspect
> we
> will avoid numerous buffer overflow bugs in applications by doing it
> this way though. Given that KMS only supports 4, I guess this will be
> fine.
Yeah, using lists for requests was really cumbersome.
>
> > + depth, bpp: CARD8
>
> See above for questions about these fields...
>
> > + modifier: CARD64
> > + buffers: ListOfFD
> > +└───
> > + Errors: Alloc, Drawable, IDChoice, Value, Match
> > +
> > + Creates a pixmap for the direct rendering object
> > associated
> > + with 'buffers'. Changes to pixmap will be visible in that
> > + direct rendered object and changes to the direct rendered
> > + object will be visible in the pixmap.
That paragraph was directly copy/pasted from PixmapFromBuffer. So if
things are confusing, we might want to update the documentation there
as well.
> Do we want to define synchronization mechanisms for this? We might
> explicitly state the ordering between X rendering and Damage events,
> for
> instance?
Do you mean adding a new synchronization mechanism (between X rendering
and client rendering) that would only apply to this request (not
PixapFromBuffer)? Was it considered problematic with DRI3 v1.0?
> I assume that the pixmap is created for the screen associated with
> 'drawable'?
Indeed
> > + DRM_FORMAT_MOD_INVALID may be passed for 'modifier', in
> > which
> > + case the driver may make its own inference as to the exact
> > + layout of the buffer(s).
>
> Presumably using information acquired externally?
Or internally; some drivers add metadata to the buffer to know about
tiling, etc.
> > + Precisely how any additional information about the buffer
> > is
> > + shared is outside the scope of this extension.
>
> I think this applies to the MOD_INVALID mechanism. Does it also apply
> to
> anything else?
This was copy/pasted from PixmapFromBuffer as well. I still think it's
valid though and would mean, in that context, any additional
information except the modifier (if specified). It's a blanket
statement to avoid adding too much metadata in this API.
> > + If the buffer(s) cannot be used with the screen associated
> > with
> > + 'pixmap', a Match error is returned.
>
> Screen associated with 'drawable' -- 'pixmap' is a new resource ID,
> you're creating it here.
Absolutely right.
> > +┌───
> > + DRI3BuffersFromPixmap
> > + pixmap: PIXMAP
> > + ▶
> > + nfd: CARD8
> > + width, height: CARD16
> > + depth, bpp: CARD8
> > + modifier: CARD64
> > + strides: ListOfCARD32
> > + offsets: ListOfCARD32
> > + buffers: ListOfFD
> > +└───
> > + Errors: Pixmap, Match
> > +
> > + Returns direct rendering objects associated with 'pixmap'.
> > + Changes to 'pixmap' will be visible in the direct rendered
> > + objects and changes to the direct rendered objects will be
> > + visible in 'pixmap' after flushing and synchronization.
>
> What kind of flushing and synchronization? Maybe synchronization
> stuff
> should be added to the overall description of the extension so that
> it
> applies equally to all buffer/pixmap associations?
>
> > + See PixmapFromBuffers for more details on DRM modifiers
> > usage.
>
> In what case might this return DRM_FORMAT_MOD_INVALID?
If the buffers don't have any modifier attached (e.g. if the driver
doesn't support them).
>
> > + Precisely how any additional information about the buffer
> > is
> > + shared is outside the scope of this extension.
>
> What additional information about the buffer might be relevant?
Memory alignment, compression, tiling (when modifier is not
used/supported).
--
Louis-Francis
More information about the xorg-devel
mailing list