[RFC] Exposing plane type mask and handling 'all' planes

Emil Velikov emil.l.velikov at gmail.com
Fri Jun 28 18:54:06 UTC 2019


On 2019/06/28, Matt Roper wrote:
> On Fri, Jun 28, 2019 at 05:14:51PM +0100, Emil Velikov wrote:
> > Hi Matt,
> > 
> > Thanks for the enlightening input :-)
> > 
> > On 2019/06/25, Matt Roper wrote:
> > 
> > > PLANE_CURSOR is basically just an indication that that specific plane is
> > > the one that's also hooked up to the legacy cursor ioctls; like Ville
> > > says, it shouldn't directly indicate that the plane is less
> > > feature-capable than other planes.  You can either detect the true
> > > capabilities of the cursor plane by checking for the presence/absence of
> > > other plane properties and/or experimenting with atomic TEST_ONLY
> > > commits to see what's really possible.
> > > 
> > Interesting, my understanding was the plane type was a hint about the
> > capabilities. Although yes, userspace must check via TEST_ONLY to ensure
> > the properties chosen will work.
> > 
> > 
> > > The ideal solution for Intel gen9 hardware would have been to just never
> > > have the driver advertise or program the dedicated hardware cursor at
> > > all, but to instead expose the top-most universal plane to userspace,
> > > describe it as PLANE_CURSOR, and route the legacy cursor ioctl's to that
> > > plane instead.  That would allow legacy cursor behavior to work as
> > > usual, but would also allow atomic userspace to use the plane in a more
> > > full-featured manner.  I wrote patches to do exactly this a couple years
> > > ago, but sadly we discovered that the universal planes on gen9 have a
> > > slight alpha blending defect that the dedicated hardware cursor does not
> > > exhibit.  Thus replacing the hardware cursor with the topmost universal
> > > plane led to a slight regression for existing users and we had to scrap
> > > the whole idea.  :-(
> > > 
> > > For reference, the relevant patch from a few years ago is here:
> > >         https://patchwork.kernel.org/patch/9398571/
> > > 
> > In that thread you mention:
> > 
> > "... I believe the color correction settings are different for the
> > universal plane vs the cursor plane (which causes IGT CRC mismatches at
> > the moment and may be visually noticeable if you have good eyes); that
> > shouldn't be hard to track down and fix."
> > 
> > Yet above you mention that universal planes have alpha blending defect.
> > Did you confirm that with HW/simulation teams or is that based on the
> > documentation? I would love to read a bit more on the topic.
> > 
> > In particular, but not limited to, if this defect is applicable only for
> > plane3 or literally all universal planes.
> 
> We only figured out exactly what was going on a while after I wrote that
> message in the thread, but we did ultimately confirm the problem with
> the hardware architects.  Sadly, all of the gen9 universal planes suffer
> from the slight blending issue and only the dedicated hardware cursor is
> immune because it has some special bypass logic.
> 
> Specifically, you'd usually expect blending between two planes' pixels
> to give you a final color value of
> 
>         bottom * (1.0-alpha) + top * alpha
> 
> However due to the way the alpha values are interpreted in the hardware,
> there's a problematic case when the top plane's pixel alpha is 0.  You
> wind up getting
> 
>         bottom * (255/256) + top * 0  = .996 * bottom
> 
> meaning pixels with a fully transparent plane above them are very
> slightly fainter than pixels that didn't go through blending.  You'll
> pretty much only perceive the difference when you have transparent
> pixels at the edge of a plane (and even then only if you have a good
> monitor and good eyes).  Of course "transparent pixels at the edge of
> plane" is pretty common when you're using the plane as a mouse pointer.
> You wind up with a faint ghost rectangle around your mouse pointer. :-(
> 
So we have a couple of problems here:
 - general faided bottom image - not much we can do here, also an issue
even w/o using plane3 as cursor.

 - ghosting - w/a: make sure the edge of a plane, is never within the
viewport (scanout region)

Since the fading is a generic problem, we might as well make use of
plane3 regardless.

What I'm proposing is that we pick up dimensions X and Y as cut-off.
Everything larger will use plane3, smaller - cursor.

To determine X/Y I see two approaches:
 - based off the max cursor size exposed by DRM drivers - say Zx larger
 - consider the current resolution +/- delta

We could also extrapolate that with the fact that most drivers expose
and hence user-space handle cursor identical width and height.

Personally, I'm inclined to pick 512x512 as a threshold and re-spin your
patches. Let me know what you think.

Thanks,
Emil


More information about the dri-devel mailing list