[Mesa-dev] [PATCH 7/8] glx: fix the refcounting of dri drawables

Ian Romanick idr at freedesktop.org
Thu Apr 7 05:32:55 UTC 2016


Why would you do that?  I've NAKed this patch several times.

On 04/06/2016 03:52 AM, Marek Olšák wrote:
> This looks good to me. I'll commit this on April 9th if there are
> other comments.
> 
> Marek
> 
> On Thu, Mar 24, 2016 at 1:13 AM, Miklós Máté <mtmkls at gmail.com> wrote:
>> This fixes premature deallocation on unbind, and introduces
>> support for deleting GLX drawables while they are current to a context.
>>
>> Note that in practice this also introduces a resource leak, because nobody
>> uses the GLX 1.3 glXDestroyWindow and glXDestroyPixmap calls.
>>
>> This fixes disappearing characters in SW:KotOR when soft shadows are enabled.
>>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93955
>>
>> Signed-off-by: Miklós Máté <mtmkls at gmail.com>
>> ---
>>  src/glx/dri_common.c  | 3 ++-
>>  src/glx/glx_pbuffer.c | 8 ++++++--
>>  src/glx/glxcmds.c     | 8 ++++++--
>>  3 files changed, 14 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c
>> index 6728d38..7051fa0 100644
>> --- a/src/glx/dri_common.c
>> +++ b/src/glx/dri_common.c
>> @@ -420,7 +420,8 @@ driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable)
>>        (*pdraw->destroyDrawable) (pdraw);
>>        return NULL;
>>     }
>> -   pdraw->refcount = 1;
>> +   /* created and bound */
>> +   pdraw->refcount = 1 + 1;
>>
>>     return pdraw;
>>  }
>> diff --git a/src/glx/glx_pbuffer.c b/src/glx/glx_pbuffer.c
>> index 231ab20..860c039 100644
>> --- a/src/glx/glx_pbuffer.c
>> +++ b/src/glx/glx_pbuffer.c
>> @@ -217,6 +217,7 @@ CreateDRIDrawable(Display *dpy, struct glx_config *config,
>>        (*pdraw->destroyDrawable) (pdraw);
>>        return GL_FALSE;
>>     }
>> +   pdraw->refcount = 1;
>>
>>     pdraw->textureTarget = determineTextureTarget(attrib_list, num_attribs);
>>     pdraw->textureFormat = determineTextureFormat(attrib_list, num_attribs);
>> @@ -233,8 +234,11 @@ DestroyDRIDrawable(Display *dpy, GLXDrawable drawable, int destroy_xdrawable)
>>
>>     if (priv != NULL && pdraw != NULL) {
>>        xid = pdraw->xDrawable;
>> -      (*pdraw->destroyDrawable) (pdraw);
>> -      __glxHashDelete(priv->drawHash, drawable);
>> +      pdraw->refcount --;
>> +      if (pdraw->refcount == 0) {
>> +         (*pdraw->destroyDrawable) (pdraw);
>> +         __glxHashDelete(priv->drawHash, drawable);
>> +      }
>>        if (destroy_xdrawable)
>>           XFreePixmap(priv->dpy, xid);
>>     }
>> diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c
>> index 93e8db5..ce798c6 100644
>> --- a/src/glx/glxcmds.c
>> +++ b/src/glx/glxcmds.c
>> @@ -753,6 +753,7 @@ glXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap)
>>           xid = None;
>>           break;
>>        }
>> +      pdraw->refcount = 1;
>>     } while (0);
>>
>>     if (xid == None) {
>> @@ -806,8 +807,11 @@ glXDestroyGLXPixmap(Display * dpy, GLXPixmap glxpixmap)
>>        __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, glxpixmap);
>>
>>        if (priv != NULL && pdraw != NULL) {
>> -         (*pdraw->destroyDrawable) (pdraw);
>> -         __glxHashDelete(priv->drawHash, glxpixmap);
>> +         pdraw->refcount --;
>> +         if (pdraw->refcount == 0) {
>> +            (*pdraw->destroyDrawable) (pdraw);
>> +            __glxHashDelete(priv->drawHash, glxpixmap);
>> +         }
>>        }
>>     }
>>  #endif
>> --
>> 2.8.0.rc3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 



More information about the mesa-dev mailing list