[V2] modesetting: code refactor for PRIME sync
Alex Goins
agoins at nvidia.com
Wed Aug 29 01:20:38 UTC 2018
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
> 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