mesa: fix spurious wglGetProcAddress / GL_INVALID_OPERATION error

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@lists.freedesktop.org>
Acked-by: Sinclair Yeh <syeh@vmware.com>
(cherry picked from commit c7f0755caa)
This commit is contained in:
Brian Paul 2014-10-02 09:36:54 -06:00 committed by Emil Velikov
parent ecd2d078ac
commit ada5fd6e85

View file

@ -896,7 +896,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()
@ -916,6 +930,26 @@ _mesa_alloc_dispatch_table()
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;
}