[PATCH xserver] damage: Add screen func called before damage event delivery

Hans de Goede hdegoede at redhat.com
Fri Sep 16 09:14:22 UTC 2016


Hi,

On 16-09-16 10:59, Michel Dänzer wrote:
> On 16/09/16 05:37 PM, Hans de Goede wrote:
>> On 16-09-16 08:26, Michel Dänzer wrote:
>>> On 16/09/16 01:37 PM, Keith Packard wrote:
>>>> This lets the video driver flush rendering to the kernel before the
>>>> client receives a damage event to a pixmap which the client has direct
>>>> rendering access to.
>>>
>>> I'm afraid I'm not sure this is going in a good direction.
>>>
>>> At the very least, the damage and glamor parts should be split into
>>> separate patches.
>>>
>>>
>>>> diff --git a/damageext/damageext.c b/damageext/damageext.c
>>>> index 86b54ee..547f048 100644
>>>> --- a/damageext/damageext.c
>>>> +++ b/damageext/damageext.c
>>>> @@ -98,6 +98,7 @@ DamageExtNotify(DamageExtPtr pDamageExt, BoxPtr
>>>> pBoxes, int nBoxes)
>>>>      damageGetGeometry(pDrawable, &x, &y, &w, &h);
>>>>
>>>>      UpdateCurrentTimeIf();
>>>> +    DamageFlushDrawable(pDrawable);
>>>>      ev = (xDamageNotifyEvent) {
>>>>          .type = DamageEventBase + XDamageNotify,
>>>>          .level = pDamageExt->level,
>>>
>>> Does FlushClient get called after every DamageExtNotify call? Otherwise,
>>> some of the GPU flushes performed by DamageFlushDrawable will be wasted,
>>> hurting performance.
>
> Assuming GPU screens don't need to be flushed for damage events, our
> drivers could use the damage Flush hook instead of an EventCallback
> scanning for damage events though.
>
>
>>>> @@ -1943,3 +1948,13 @@ DamageReportDamage(DamagePtr pDamage,
>>>> RegionPtr pDamageRegion)
>>>>          break;
>>>>      }
>>>>  }
>>>> +
>>>> +void
>>>> +DamageFlushDrawable(DrawablePtr pDrawable)
>>>> +{
>>>> +    ScreenPtr pScreen = pDrawable->pScreen;
>>>> +    damageScrPriv(pScreen);
>>>> +
>>>> +    if (pScrPriv->funcs.Flush)
>>>> +        (*pScrPriv->funcs.Flush)(pDrawable);
>>>> +}
>>>
>>> FWIW, this will do nothing for GPU screens. I'm not sure whether or not
>>> GPU screens need to be flushed for damage events, what are others'
>>> thoughts on that?
>>
>> With render offloading I do think we want to flush,
>
> Do you have a specific scenario in mind where a GPU screen needs to be
> flushed before damage events are sent to a client?

If a client is somehow tracking a pixmap which gets rendered
by a secondary GPU, but I did not think about the copy that
involves, so thinking about this again in that scenario we
will have:

1) Rendering on secondary GPU (aka a GPU screen)
2) We need a flush here, but that should already be taken care of
3) Copy to buffer/pixmap on primary GPU
4) The copy will do damage to the pixmap, but then we're already
on the primary GPU

> I've actually almost convinced myself that it's not necessary, because
> damage events can't refer to any pixmaps directly rendered to by GPU
> screens?

See above I think you're right. Following the same logic though
I do not think the code this patch adds will ever get called on
a GPU screen, so no need to check for that ?

>> for the slave output case we should never get any>> Damage marked on the slave GPU pixmaps to begin with
>> (and we do want the flush on master GPU pixmaps before
>>  they get passed to the slave).
>
> This patch only affects client damage records, not PRIME slave output.

Ah rights, it sits in damageext not in mi/damageext.

>> I assume that there is a check somewhere in the call chain
>> to not do the flush if there is no damage on the pixmap ?
>
> I don't know of such a thing FWIW.

If it is not there yet, it really should be, I do not think
we want to do flushes to make sure an undamaged pixmap
is completely rendered, as it already should be completely
rendered.

Regards,

Hans


More information about the xorg-devel mailing list