On Tue, 8 May 2018 at 20:47 Adam Jackson <a...@redhat.com> wrote: > dri*_bind_context, when switching current drawables, will drop the > reference on the old one; since that refcount has probably now gone to > zero that means we lose all the state we applied to that drawable > before, like when swaps are expected to complete. > > Dropping this reference might make some sense for drawables that aren't > _ours_, since we don't get events for destroyed resources and need to > rely on the server throwing errors when we name a no-longer-valid > drawable. But if the resource is one that this client created, we can be > reasonably sure that it will be explicitly destroyed by the same client > - and if not, the client is likely to exit anyway, so the memory leak > doesn't matter. > > So, bump the refcnt if the XID of the drawable indicates that it's one > of ours. This is, admittedly, a hack. The proper solution would involve > rather more surgery to the MakeCurrent path than I can type quickly, let > alone test promptly against a wide enough range of servers and DRIs to > have any confidence in. I'll work on the real solution, but in the > meantime this is effectively not a memory leak for any real scenario, > and fixes a real bug. > > Signed-off-by: Adam Jackson <a...@redhat.com> > Cc: Michel Dänzer <michel.daen...@amd.com> > Cc: Mike Lothian <m...@fireburn.co.uk> > Cc: Mario Kleiner <mario.kleiner...@gmail.com> > Cc: Tobias Klausmann <tobias.johannes.klausm...@mni.thm.de> > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106351 > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106372 > --- > src/glx/dri_common.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c > index ab5d6c5bc0..d42ca71124 100644 > --- a/src/glx/dri_common.c > +++ b/src/glx/dri_common.c > @@ -411,7 +411,8 @@ driInferDrawableConfig(struct glx_screen *psc, > GLXDrawable draw) > _X_HIDDEN __GLXDRIdrawable * > driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable) > { > - struct glx_display *const priv = __glXInitialize(gc->psc->dpy); > + Display *dpy = gc->psc->dpy; > + struct glx_display *const priv = __glXInitialize(dpy); > __GLXDRIdrawable *pdraw; > struct glx_screen *psc; > struct glx_config *config = gc->config; > @@ -449,6 +450,8 @@ driFetchDrawable(struct glx_context *gc, GLXDrawable > glxDrawable) > return NULL; > } > pdraw->refcount = 1; > + if ((glxDrawable & dpy->resource_mask) == dpy->resource_base) > + pdraw->refcount ++; > > return pdraw; > } > -- > 2.17.0 > > Hi
This doesn't fix the freezes in Plasmashell Both of Mario's patches improved things Regards Mike
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev