diff options
author | Brian Paul <[email protected]> | 2014-10-02 09:36:54 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2014-10-03 10:04:48 -0600 |
commit | c7f0755caa1c39d5433e37c53242ef251aa4fc3a (patch) | |
tree | 3484bb8eed993aba214c09fefaf4a14d71af1eba /src | |
parent | 33c9ad97bf25271fcb034bc6054b74fff8a552fb (diff) |
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: <[email protected]>
Acked-by: Sinclair Yeh <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/context.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index afe43a6af8c..5a8f7184ad9 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; } |