[V2] modesetting: code refactor for PRIME sync
jimqu
jimqu at amd.com
Tue Aug 28 14:52:49 UTC 2018
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