[Mesa-dev] [PATCH] mesa: fix spurious wglGetProcAddress / GL_INVALID_OPERATION error

Sinclair Yeh syeh at vmware.com
Fri Oct 3 08:04:23 PDT 2014


This looks reasonable to me.

Acked-by:  Sinclair Yeh <syeh at vmware.com>

On Thu, Oct 02, 2014 at 09:49:04AM -0600, Brian Paul wrote:
> On Windows, the Piglit primitive-restart test was failing a
> glGetError()==0 assertion when it was run w/out any command line
> arguments.  Piglit's all.py script only runs primitive-restart
> with arguments so this case isn't normally hit during a full
> piglit run.
> 
> The basic problem is Microsoft's opengl32.dll calls glFlush
> from wglGetProcAddress() and Piglit uses wglGetProcAddress() to
> resolve glPrimitiveRestartNV() which is called inside glBegin/End.
> See comments in the code for more info.
> 
> Plus, improve the comments for _mesa_alloc_dispatch_table().
> 
> Cc: <mesa-stable at lists.freedesktop.org>
> ---
>  src/mesa/main/context.c |   36 +++++++++++++++++++++++++++++++++++-
>  1 file changed, 35 insertions(+), 1 deletion(-)
> 
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index afe43a6..5a8f718 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -891,7 +891,21 @@ _mesa_generic_nop(void)
>  
>  
>  /**
> - * Allocate and initialize a new dispatch table.
> + * Special no-op glFlush, see below.
> + */
> +#if defined(_WIN32)
> +static void GLAPIENTRY
> +nop_glFlush(void)
> +{
> +   /* don't record an error like we do in _mesa_generic_nop() */
> +}
> +#endif
> +
> +
> +/**
> + * Allocate and initialize a new dispatch table.  All the dispatch
> + * function pointers will point at the _mesa_generic_nop() function
> + * which raises GL_INVALID_OPERATION.
>   */
>  struct _glapi_table *
>  _mesa_alloc_dispatch_table(void)
> @@ -911,6 +925,26 @@ _mesa_alloc_dispatch_table(void)
>        for (i = 0; i < numEntries; i++) {
>           entry[i] = (_glapi_proc) _mesa_generic_nop;
>        }
> +
> +#if defined(_WIN32)
> +      /* This is a special case for Windows in the event that
> +       * wglGetProcAddress is called between glBegin/End().
> +       *
> +       * The MS opengl32.dll library apparently calls glFlush from
> +       * wglGetProcAddress().  If we're inside glBegin/End(), glFlush
> +       * will dispatch to _mesa_generic_nop() and we'll generate a
> +       * GL_INVALID_OPERATION error.
> +       *
> +       * The specific case which hits this is piglit's primitive-restart
> +       * test which calls glPrimitiveRestartNV() inside glBegin/End.  The
> +       * first time we call glPrimitiveRestartNV() Piglit's API dispatch
> +       * code will try to resolve the function by calling wglGetProcAddress.
> +       * This raises GL_INVALID_OPERATION and an assert(glGetError()==0)
> +       * will fail causing the test to fail.  By suppressing the error, the
> +       * assertion passes and the test continues.
> +       */
> +      SET_Flush(table, nop_glFlush);
> +#endif
>     }
>     return table;
>  }
> -- 
> 1.7.10.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=0z9ea8IzZ%2F3am%2F968VnzsA%3D%3D%0A&m=uR%2BbgxEgKLtR41FFJnfOhIvQxuyZU7uaD5Fwrr7QHRI%3D%0A&s=1a422441a95eef77350f89c98b2e593f7aa29a93e9e5fe473ba769f814e12255


More information about the mesa-dev mailing list