mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 03:48:06 +02:00
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:
parent
ecd2d078ac
commit
ada5fd6e85
1 changed files with 35 additions and 1 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue