[Mesa-dev] [PATCH 2/3] glx: Lift sending the MakeCurrent request to top-level code (v2)
Emil Velikov
emil.l.velikov at gmail.com
Wed Dec 6 15:14:29 UTC 2017
On 5 December 2017 at 21:22, Adam Jackson <ajax at redhat.com> wrote:
> Somewhat terrifyingly, we never sent this for direct contexts, which
> means the server never knew the context/drawable bindings.
>
> To handle this sanely, pull the request code up out of the indirect
> backend, and rewrite the context switch path to call it as appropriate.
> This attempts to preserve the existing behavior of not calling unbind()
> on the context if its refcount would not drop to zero, which is why the
> diff is a little uglier than I'd like.
>
> Fixes glx-make-context, glx-multi-context-single-window and
> glx-query-drawable-glx_fbconfig_id-window with both direct and indirect
> contexts. glx-make-glxdrawable-current regresses, but I believe the test
> is in error, as the fbconfig it uses to create the context is just
> "something double-buffered and rgba" as opposed to "corresponds to the
> visual I used to create the windows".
>
> v2: Style fixups (Ian Romanick)
>
Adam, can we make this 1/3 and cc stable?
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
> src/glx/glxcurrent.c | 182 +++++++++++++++++++++++++++++++++++++------------
> src/glx/indirect_glx.c | 140 +++++++------------------------------
> 2 files changed, 162 insertions(+), 160 deletions(-)
>
> diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c
> index 9f8bf7cee1..0ce80670d2 100644
> --- a/src/glx/glxcurrent.c
> +++ b/src/glx/glxcurrent.c
> @@ -165,17 +165,85 @@ glXGetCurrentDrawable(void)
> return gc->currentDrawable;
> }
>
> -/**
> - * Make a particular context current.
> - *
> - * \note This is in this file so that it can access dummyContext.
> - */
> +static Bool
> +SendMakeCurrentRequest(Display * dpy, GLXContextID gc_id,
> + GLXContextTag gc_tag, GLXDrawable draw,
> + GLXDrawable read, GLXContextTag *out_tag)
> +{
Nit: I would keep the code move a separate patch, I might be too
pedantic though ;-)
> static Bool
> MakeContextCurrent(Display * dpy, GLXDrawable draw,
> GLXDrawable read, GLXContext gc_user)
> {
> struct glx_context *gc = (struct glx_context *) gc_user;
> struct glx_context *oldGC = __glXGetCurrentContext();
> + Bool ret = GL_FALSE;
Bool is True False. Then again I would drop the variable and
__glXUnlock/return as applicable.
> - if (gc->vtable->bind(gc, oldGC, draw, read) != Success) {
> + if (gc->vtable->bind(gc, gc, draw, read) != Success) {
> __glXSetCurrentContextNull();
This line seems inconsistent/wrong.
The glXMakeCurrent manpage says "If False is returned, the previously
current rendering context and drawable (if any) remain unchanged."
> + if (gc->thread_refcount == 0) {
> + SetGC(gc, dpy, draw, read);
> + }
Nit: drop the brackets for the single like if statement.
> + if (state != NULL && state->array_state != NULL)
> + return Success;
>
> - return !sent;
> + return BadAlloc;
Nit: diverge the exception (error path) keeping the main codeflow straight.
if (state == NULL || state->array_state == NULL)
return BadAlloc;
return Success;
> }
>
> static void
> indirect_unbind_context(struct glx_context *gc, struct glx_context *new)
> {
Nit: add a comment to link "nothing to do here - MakeContextCurrent
sends the required protocol as applicable"
-Emil
More information about the mesa-dev
mailing list