On Fri, 2015-12-04 at 14:16 -0200, Guilherme Quentel Melo wrote:

> diff --git a/glx/glxext.c b/glx/glxext.c
> index e41b881..16b8039 100644
> --- a/glx/glxext.c
> +++ b/glx/glxext.c
> @@ -469,6 +469,24 @@ __glXForceCurrent(__GLXclientState * cl, GLXContextTag 
> tag, int *error)
>  
>      /* Make this context the current one for the GL. */
>      if (!cx->isDirect) {
> +        /*
> +         ** If we are forcing the context it means someone already called 
> makeCurrent before. If
> +         ** we just call makeCurrent again, the drawable of this context 
> will be left with one
> +         ** refcount more forever and will never be freed.
> +         **
> +         ** This situation happens when there are many X clients using GL:
> +         **
> +         ** 1 - client1: calls glXMakeCurrent
> +         **
> +         ** 2 - client2: calls glXMakeCurrent
> +         **     This is the first context switch for this client. So 
> old_context_tag=0
> +         **
> +         ** 3 - client1: calls glXRender
> +         **     For the client, its context is already current.
> +         **     For the server side lastGLContext points to client2's 
> context. So the execution path
> +         **     will get here.
> +         */
> +        (*cx->loseCurrent) (cx);

This should be lastGLContext->loseCurrent(lastGLContext) I think. cx
here is the current context from client2's perspective, you want to
release client1's context.

While you're at it, it'd be nice to move that big block comment into
the commit message and just note /* drop previous client's context */
or similar in the code.

- ajax
_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to