[V2] modesetting: code refactor for PRIME sync
jimqu
jimqu at amd.com
Wed Aug 29 02:53:50 UTC 2018
On 2018年08月29日 09:20, Alex Goins wrote:
> I'm still having issues with my local setup for testing it with
> modesetting<->modesetting PRIME, but I think it looks good by inspection, and
> would expect it to work. It does work with NVIDIA<->modesetting PRIME.
>
> It would be a good idea to test modesetting<->modesetting PRIME Sync with this
> patch before merging it, but I don't have any further objections.
>
> Reviewed-by: Alex Goins <agoins at nvidia.com>
>
> Thanks!
> Alex
Thanks very much! Alex.
I tested it on Intel(modesetting) + AMD(modesetting/amdgpu) and
Intel(modesetting)+NV(modesetting/nouveau), PRIME, reverse PRIME and
also PRIME offloading cases.
For the NV card, I don't know what issue you encountered, In my side ,
at first, I found a GTX690, but PRIME can not work duo to there were two
DRM device nodes from NV card, so there are totally three screens(one
master and two GPUs) on the system. then I found a GTX500, it had only
one device node.
Did you encounter the same issue?
BTW, could you do me a favor to help me push the patch to the master or
other proper branch? I do not familiar with the processes that push the
patch to Xorg.
Thanks
JimQu
>> Hi AlexG,
>>
>> What's about new patch?
>>
>> Thanks
>> JimQu
>>
>>
>> 在 2018/8/27 13:37, Jim Qu 写道:
>>> The X will be crashed on the system with other DDX driver,
>>> such as amdgpu.
>>>
>>> show the log like:
>>>
>>> randr: falling back to unsynchronized pixmap sharing
>>> (EE)
>>> (EE) Backtrace:
>>> (EE) 0: /usr/lib/xorg/Xorg (xorg_backtrace+0x4e)
>>> (EE) 1: /usr/lib/xorg/Xorg (0x55cb0151a000+0x1b5ce9)
>>> (EE) 2: /lib/x86_64-linux-gnu/libpthread.so.0 (0x7f1587a1d000+0x11390)
>>> (EE)
>>> (EE) Segmentation fault at address 0x0
>>> (EE)
>>>
>>> The issue is that modesetting as the master, and amdgpu as the slave.
>>> Thus, when the master attempts to access pSlavePixPriv in ms_dirty_update(),
>>> problems result due to the fact that it's accessing AMD's 'ppriv' using the
>>> modesetting structure definition.
>>>
>>> Apart from fixing crash issue, the patch fix other issue in master interface
>>> in which driver should refer to master pixmap.
>>>
>>> Change-Id: I274633c9657c3621c95efd7632355662b9f5052c
>>> Signed-off-by: Jim Qu <Jim.Qu at amd.com>
>>> ---
>>> hw/xfree86/drivers/modesetting/driver.c | 36
>>> +++++++++++++++++----------------
>>> 1 file changed, 19 insertions(+), 17 deletions(-)
>>>
>>> diff --git a/hw/xfree86/drivers/modesetting/driver.c
>>> b/hw/xfree86/drivers/modesetting/driver.c
>>> index 9362370..792dfb6 100644
>>> --- a/hw/xfree86/drivers/modesetting/driver.c
>>> +++ b/hw/xfree86/drivers/modesetting/driver.c
>>> @@ -640,19 +640,21 @@ ms_dirty_update(ScreenPtr screen, int *timeout)
>>> xorg_list_for_each_entry(ent, &screen->pixmap_dirty_list, ent) {
>>> region = DamageRegion(ent->damage);
>>> if (RegionNotEmpty(region)) {
>>> - msPixmapPrivPtr ppriv =
>>> - msGetPixmapPriv(&ms->drmmode, ent->slave_dst);
>>> + if (!screen->isGPU) {
>>> + msPixmapPrivPtr ppriv =
>>> + msGetPixmapPriv(&ms->drmmode,
>>> ent->slave_dst->master_pixmap);
>>> - if (ppriv->notify_on_damage) {
>>> - ppriv->notify_on_damage = FALSE;
>>> + if (ppriv->notify_on_damage) {
>>> + ppriv->notify_on_damage = FALSE;
>>> - ent->slave_dst->drawable.pScreen->
>>> - SharedPixmapNotifyDamage(ent->slave_dst);
>>> - }
>>> + ent->slave_dst->drawable.pScreen->
>>> + SharedPixmapNotifyDamage(ent->slave_dst);
>>> + }
>>> - /* Requested manual updating */
>>> - if (ppriv->defer_dirty_update)
>>> - continue;
>>> + /* Requested manual updating */
>>> + if (ppriv->defer_dirty_update)
>>> + continue;
>>> + }
>>> redisplay_dirty(screen, ent, timeout);
>>> DamageEmpty(ent->damage);
>>> @@ -1251,8 +1253,8 @@ msStartFlippingPixmapTracking(RRCrtcPtr crtc,
>>> DrawablePtr src,
>>> ScreenPtr pScreen = src->pScreen;
>>> modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen));
>>> - msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode, slave_dst1),
>>> - ppriv2 = msGetPixmapPriv(&ms->drmmode, slave_dst2);
>>> + msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode,
>>> slave_dst1->master_pixmap),
>>> + ppriv2 = msGetPixmapPriv(&ms->drmmode,
>>> slave_dst2->master_pixmap);
>>> if (!PixmapStartDirtyTracking(src, slave_dst1, x, y,
>>> dst_x, dst_y, rotation)) {
>>> @@ -1280,10 +1282,10 @@ msStartFlippingPixmapTracking(RRCrtcPtr crtc,
>>> DrawablePtr src,
>>> static Bool
>>> msPresentSharedPixmap(PixmapPtr slave_dst)
>>> {
>>> - ScreenPtr pScreen = slave_dst->drawable.pScreen;
>>> + ScreenPtr pScreen = slave_dst->master_pixmap->drawable.pScreen;
>>> modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen));
>>> - msPixmapPrivPtr ppriv = msGetPixmapPriv(&ms->drmmode, slave_dst);
>>> + msPixmapPrivPtr ppriv = msGetPixmapPriv(&ms->drmmode,
>>> slave_dst->master_pixmap);
>>> RegionPtr region = DamageRegion(ppriv->dirty->damage);
>>> @@ -1304,8 +1306,8 @@ msStopFlippingPixmapTracking(DrawablePtr src,
>>> ScreenPtr pScreen = src->pScreen;
>>> modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen));
>>> - msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode, slave_dst1),
>>> - ppriv2 = msGetPixmapPriv(&ms->drmmode, slave_dst2);
>>> + msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode,
>>> slave_dst1->master_pixmap),
>>> + ppriv2 = msGetPixmapPriv(&ms->drmmode,
>>> slave_dst2->master_pixmap);
>>> Bool ret = TRUE;
>>> @@ -1471,7 +1473,7 @@ msRequestSharedPixmapNotifyDamage(PixmapPtr ppix)
>>> ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
>>> modesettingPtr ms = modesettingPTR(scrn);
>>> - msPixmapPrivPtr ppriv = msGetPixmapPriv(&ms->drmmode, ppix);
>>> + msPixmapPrivPtr ppriv = msGetPixmapPriv(&ms->drmmode,
>>> ppix->master_pixmap);
>>> ppriv->notify_on_damage = TRUE;
>>>
More information about the xorg-devel
mailing list