[PATCH] exa: fix gnome-panel corruption
Maarten Maathuis
madman2003 at gmail.com
Fri Feb 12 01:06:34 PST 2010
One possibility would be to put "exaDoMigration" with src with preg on
the deferred pixmap list, i haven't tested this, but i could try this
evening or tomorrow.
Maarten.
2010/2/11 Maarten Maathuis <madman2003 at gmail.com>:
> 2010/2/11 Michel Dänzer <michel at daenzer.net>:
>>
>> Thanks for tackling this, Maarten!
>>
>> On Thu, 2010-02-11 at 19:05 +0100, Maarten Maathuis wrote:
>>> - A mapped pixmap can't be used for acceleration, any decent memory manager
>>> will refuse this.
>>> - Source pixmaps may need updating, so move in the pixmap unconditionally, it
>>> should be a no-op in most cases anyway.
>>
>> 'May need'? Have you actually observed this in practice? Only the mixed
>> pixmap pointed to by pExaScr->deferred_mixed_pixmap should ever have
>> valid bits in the system memory copy with no corresponding valid bits in
>> the GPU copy. In which case the new code could still be conditionalized
>> on
>
> Yes i have observed this in practice, the reason is "fairly" obvious.
>
> Do software rendering on full pixmap, do hardware rendering as src
> with preg (driver pixmap created), do software rendering (sw pixmap is
> killed, but not everything is in hardware pixmap yet).
>
>>
>> if (pExaScr->deferred_mixed_pixmap == pPixmap)
>>
>> (the part before the && was never necessary as pPixmap can never be NULL
>> here).
>>
>> It should be possible to restructure the code such that the late_failure
>> label and goto aren't necessary.
>
> You cannot assume the prepare access to succeed the 2nd time, although
> it will in 99.99% of the time.
>
>>
>> Is there a bug report that can be referenced in the commit message?
>
> Not to my knowledge.
>
>>
>>
>>> Signed-off-by: Maarten Maathuis <madman2003 at gmail.com>
>>> ---
>>> exa/exa_migration_mixed.c | 18 ++++++++++++------
>>> 1 files changed, 12 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c
>>> index 6816e6c..77b2b2b 100644
>>> --- a/exa/exa_migration_mixed.c
>>> +++ b/exa/exa_migration_mixed.c
>>> @@ -167,9 +167,12 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg)
>>> ExaPixmapPriv(pPixmap);
>>>
>>> if (!ExaDoPrepareAccess(pPixmap, index)) {
>>> - Bool has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
>>> + Bool has_gpu_copy;
>>> ExaMigrationRec pixmaps[1];
>>>
>>> +late_failure:
>>> + has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
>>> +
>>> /* Do we need to allocate our system buffer? */
>>> if (!pExaPixmap->sys_ptr) {
>>> pExaPixmap->sys_ptr = malloc(pExaPixmap->sys_pitch *
>>> @@ -231,12 +234,15 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg)
>>> /* We have a gpu pixmap that can be accessed, we don't need the cpu copy
>>> * anymore. Drivers that prefer DFS, should fail prepare access. */
>>> } else if (pExaPixmap->pDamage && exaPixmapHasGpuCopy(pPixmap)) {
>>> - ExaScreenPriv(pPixmap->drawable.pScreen);
>>>
>>> - /* Copy back any deferred content if needed. */
>>> - if (pExaScr->deferred_mixed_pixmap &&
>>> - pExaScr->deferred_mixed_pixmap == pPixmap)
>>> - exaMoveInPixmap_mixed(pPixmap);
>>> + /* You cannot do accelerated operations while a buffer is mapped. */
>>> + exaFinishAccess(&pPixmap->drawable, index);
>>> + /* Sources with pReg are not fully in the gpu pixmap yet, as well
>>> + * as deferred destination pixmaps.
>>> + */
>>> + exaMoveInPixmap_mixed(pPixmap);
>>> + if (!ExaDoPrepareAccess(pPixmap, index))
>>> + goto late_failure;
>>>
>>> DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage);
>>> DamageDestroy(pExaPixmap->pDamage);
>>
>>
>> --
>> Earthling Michel Dänzer | http://www.vmware.com
>> Libre software enthusiast | Debian, X and DRI developer
>>
>
More information about the xorg-devel
mailing list