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 <ago...@nvidia.com> Thanks! Alex > 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...@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; > > > >
_______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel