opengl32: Get rid of the X11 locking.
This commit is contained in:
parent
b6a7a3fe23
commit
312dd5297b
|
@ -69,7 +69,7 @@ my $norm_file = "opengl_norm.c";
|
||||||
my $ext_file = "opengl_ext.c";
|
my $ext_file = "opengl_ext.c";
|
||||||
|
|
||||||
# Set to 0 for removing the ENTER / LEAVE GL calls
|
# Set to 0 for removing the ENTER / LEAVE GL calls
|
||||||
my $gen_thread_safe = 1;
|
my $gen_thread_safe = 0;
|
||||||
# Prefix used for the local variables
|
# Prefix used for the local variables
|
||||||
my $ext_prefix = "func_";
|
my $ext_prefix = "func_";
|
||||||
# If set to 1, generate TRACEs for each OpenGL function
|
# If set to 1, generate TRACEs for each OpenGL function
|
||||||
|
@ -285,7 +285,7 @@ sub GenerateThunk($$$$$)
|
||||||
}
|
}
|
||||||
$ret .= 'void ' if (!@{$func_ref->[2]});
|
$ret .= 'void ' if (!@{$func_ref->[2]});
|
||||||
$ret = "$ret) {\n";
|
$ret = "$ret) {\n";
|
||||||
if ($func_ref->[1] ne "void") {
|
if ($func_ref->[1] ne "void" && $thread_safe) {
|
||||||
$ret = "$ret " . ConvertType($func_ref->[1]) . " ret_value;\n";
|
$ret = "$ret " . ConvertType($func_ref->[1]) . " ret_value;\n";
|
||||||
}
|
}
|
||||||
$ret .= $local_var;
|
$ret .= $local_var;
|
||||||
|
@ -297,18 +297,23 @@ sub GenerateThunk($$$$$)
|
||||||
$ret = "$ret);\n";
|
$ret = "$ret);\n";
|
||||||
}
|
}
|
||||||
if ($thread_safe) {
|
if ($thread_safe) {
|
||||||
$ret = "$ret ENTER_GL();\n";
|
$ret .= " ENTER_GL();\n";
|
||||||
}
|
$ret .= " ";
|
||||||
$ret = "$ret ";
|
|
||||||
if ($func_ref->[1] ne "void") {
|
if ($func_ref->[1] ne "void") {
|
||||||
$ret = $ret . "ret_value = ";
|
$ret .= "ret_value = ";
|
||||||
}
|
|
||||||
$ret = "$ret$prefix$func_ref->[0]( $call_arg);\n";
|
|
||||||
if ($thread_safe) {
|
|
||||||
$ret = "$ret LEAVE_GL();\n";
|
|
||||||
}
|
}
|
||||||
|
$ret .= "$prefix$func_ref->[0]( $call_arg);\n";
|
||||||
|
$ret .= " LEAVE_GL();\n";
|
||||||
if ($func_ref->[1] ne "void") {
|
if ($func_ref->[1] ne "void") {
|
||||||
$ret = "$ret return ret_value;\n"
|
$ret .= " return ret_value;\n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$ret .= " ";
|
||||||
|
if ($func_ref->[1] ne "void") {
|
||||||
|
$ret .= "return ";
|
||||||
|
}
|
||||||
|
$ret .= "$prefix$func_ref->[0]( $call_arg);\n";
|
||||||
}
|
}
|
||||||
$ret = "$ret}\n";
|
$ret = "$ret}\n";
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -36,15 +36,6 @@
|
||||||
#define WINAPI __stdcall
|
#define WINAPI __stdcall
|
||||||
#define APIENTRY WINAPI
|
#define APIENTRY WINAPI
|
||||||
|
|
||||||
/* X11 locking */
|
|
||||||
|
|
||||||
extern void (*wine_tsx11_lock_ptr)(void);
|
|
||||||
extern void (*wine_tsx11_unlock_ptr)(void);
|
|
||||||
|
|
||||||
/* As GLX relies on X, this is needed */
|
|
||||||
#define ENTER_GL() wine_tsx11_lock_ptr()
|
|
||||||
#define LEAVE_GL() wine_tsx11_unlock_ptr()
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *name; /* name of the extension */
|
const char *name; /* name of the extension */
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -76,9 +76,6 @@ MAKE_FUNCPTR(gluTessVertex)
|
||||||
#undef MAKE_FUNCPTR
|
#undef MAKE_FUNCPTR
|
||||||
#endif /* SONAME_LIBGLU */
|
#endif /* SONAME_LIBGLU */
|
||||||
|
|
||||||
void (*wine_tsx11_lock_ptr)(void) = NULL;
|
|
||||||
void (*wine_tsx11_unlock_ptr)(void) = NULL;
|
|
||||||
|
|
||||||
static HMODULE opengl32_handle;
|
static HMODULE opengl32_handle;
|
||||||
static void* libglu_handle = NULL;
|
static void* libglu_handle = NULL;
|
||||||
|
|
||||||
|
@ -588,10 +585,8 @@ static BOOL wglUseFontBitmaps_common( HDC hdc, DWORD first, DWORD count, DWORD l
|
||||||
int org_alignment;
|
int org_alignment;
|
||||||
BOOL ret = TRUE;
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
ENTER_GL();
|
|
||||||
glGetIntegerv(GL_UNPACK_ALIGNMENT, &org_alignment);
|
glGetIntegerv(GL_UNPACK_ALIGNMENT, &org_alignment);
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||||
LEAVE_GL();
|
|
||||||
|
|
||||||
for (glyph = first; glyph < first + count; glyph++) {
|
for (glyph = first; glyph < first + count; glyph++) {
|
||||||
static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} };
|
static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} };
|
||||||
|
@ -661,7 +656,6 @@ static BOOL wglUseFontBitmaps_common( HDC hdc, DWORD first, DWORD count, DWORD l
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ENTER_GL();
|
|
||||||
glNewList(listBase++, GL_COMPILE);
|
glNewList(listBase++, GL_COMPILE);
|
||||||
if (needed_size != 0) {
|
if (needed_size != 0) {
|
||||||
glBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY,
|
glBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY,
|
||||||
|
@ -673,12 +667,9 @@ static BOOL wglUseFontBitmaps_common( HDC hdc, DWORD first, DWORD count, DWORD l
|
||||||
glBitmap(0, 0, 0, 0, gm.gmCellIncX, gm.gmCellIncY, NULL);
|
glBitmap(0, 0, 0, 0, gm.gmCellIncX, gm.gmCellIncY, NULL);
|
||||||
}
|
}
|
||||||
glEndList();
|
glEndList();
|
||||||
LEAVE_GL();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENTER_GL();
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, org_alignment);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, org_alignment);
|
||||||
LEAVE_GL();
|
|
||||||
HeapFree(GetProcessHeap(), 0, bitmap);
|
HeapFree(GetProcessHeap(), 0, bitmap);
|
||||||
HeapFree(GetProcessHeap(), 0, gl_bitmap);
|
HeapFree(GetProcessHeap(), 0, gl_bitmap);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -794,17 +785,11 @@ static BOOL wglUseFontOutlines_common(HDC hdc,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ENTER_GL();
|
|
||||||
tess = pgluNewTess();
|
tess = pgluNewTess();
|
||||||
if(tess)
|
if(!tess) return FALSE;
|
||||||
{
|
|
||||||
pgluTessCallback(tess, GLU_TESS_VERTEX, (_GLUfuncptr)tess_callback_vertex);
|
pgluTessCallback(tess, GLU_TESS_VERTEX, (_GLUfuncptr)tess_callback_vertex);
|
||||||
pgluTessCallback(tess, GLU_TESS_BEGIN, (_GLUfuncptr)tess_callback_begin);
|
pgluTessCallback(tess, GLU_TESS_BEGIN, (_GLUfuncptr)tess_callback_begin);
|
||||||
pgluTessCallback(tess, GLU_TESS_END, tess_callback_end);
|
pgluTessCallback(tess, GLU_TESS_END, tess_callback_end);
|
||||||
}
|
|
||||||
LEAVE_GL();
|
|
||||||
|
|
||||||
if(!tess) return FALSE;
|
|
||||||
|
|
||||||
GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf);
|
GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf);
|
||||||
rc.left = rc.right = rc.bottom = 0;
|
rc.left = rc.right = rc.bottom = 0;
|
||||||
|
@ -856,7 +841,6 @@ static BOOL wglUseFontOutlines_common(HDC hdc,
|
||||||
lpgmf++;
|
lpgmf++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ENTER_GL();
|
|
||||||
glNewList(listBase++, GL_COMPILE);
|
glNewList(listBase++, GL_COMPILE);
|
||||||
pgluTessBeginPolygon(tess, NULL);
|
pgluTessBeginPolygon(tess, NULL);
|
||||||
|
|
||||||
|
@ -919,7 +903,6 @@ error_in_list:
|
||||||
pgluTessEndPolygon(tess);
|
pgluTessEndPolygon(tess);
|
||||||
glTranslated((GLdouble)gm.gmCellIncX / em_size, (GLdouble)gm.gmCellIncY / em_size, 0.0);
|
glTranslated((GLdouble)gm.gmCellIncX / em_size, (GLdouble)gm.gmCellIncY / em_size, 0.0);
|
||||||
glEndList();
|
glEndList();
|
||||||
LEAVE_GL();
|
|
||||||
HeapFree(GetProcessHeap(), 0, buf);
|
HeapFree(GetProcessHeap(), 0, buf);
|
||||||
HeapFree(GetProcessHeap(), 0, vertices);
|
HeapFree(GetProcessHeap(), 0, vertices);
|
||||||
}
|
}
|
||||||
|
@ -1056,29 +1039,23 @@ static char *build_gl_extensions( const char *extensions )
|
||||||
*/
|
*/
|
||||||
const GLubyte * WINAPI wine_glGetString( GLenum name )
|
const GLubyte * WINAPI wine_glGetString( GLenum name )
|
||||||
{
|
{
|
||||||
static const char *gl_extensions;
|
static const GLubyte *gl_extensions;
|
||||||
const GLubyte *ret;
|
|
||||||
const char* GL_Extensions = NULL;
|
|
||||||
|
|
||||||
/* this is for buggy nvidia driver, crashing if called from a different
|
/* this is for buggy nvidia driver, crashing if called from a different
|
||||||
thread with no context */
|
thread with no context */
|
||||||
if(wglGetCurrentContext() == NULL)
|
if(wglGetCurrentContext() == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (GL_EXTENSIONS != name) {
|
if (name != GL_EXTENSIONS) return glGetString(name);
|
||||||
ENTER_GL();
|
|
||||||
ret = glGetString(name);
|
|
||||||
LEAVE_GL();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gl_extensions) {
|
if (!gl_extensions)
|
||||||
ENTER_GL();
|
{
|
||||||
GL_Extensions = (const char *) glGetString(GL_EXTENSIONS);
|
const char *orig_ext = (const char *)glGetString(GL_EXTENSIONS);
|
||||||
gl_extensions = build_gl_extensions( GL_Extensions );
|
char *new_ext = build_gl_extensions( orig_ext );
|
||||||
LEAVE_GL();
|
if (InterlockedCompareExchangePointer( (void **)&gl_extensions, new_ext, NULL ))
|
||||||
|
HeapFree( GetProcessHeap(), 0, new_ext );
|
||||||
}
|
}
|
||||||
return (const GLubyte *)gl_extensions;
|
return gl_extensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -1101,21 +1078,17 @@ BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc )
|
||||||
creating a rendering context.... */
|
creating a rendering context.... */
|
||||||
static BOOL process_attach(void)
|
static BOOL process_attach(void)
|
||||||
{
|
{
|
||||||
HMODULE mod_x11, mod_gdi32;
|
HMODULE mod_gdi32;
|
||||||
|
|
||||||
GetDesktopWindow(); /* make sure winex11 is loaded (FIXME) */
|
GetDesktopWindow(); /* make sure winex11 is loaded (FIXME) */
|
||||||
mod_x11 = GetModuleHandleA( "winex11.drv" );
|
|
||||||
mod_gdi32 = GetModuleHandleA( "gdi32.dll" );
|
mod_gdi32 = GetModuleHandleA( "gdi32.dll" );
|
||||||
|
|
||||||
if (!mod_x11 || !mod_gdi32)
|
if (!mod_gdi32)
|
||||||
{
|
{
|
||||||
ERR("X11DRV or GDI32 not loaded. Cannot create default context.\n");
|
ERR("GDI32 not loaded. Cannot create default context.\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
wine_tsx11_lock_ptr = (void *)GetProcAddress( mod_x11, "wine_tsx11_lock" );
|
|
||||||
wine_tsx11_unlock_ptr = (void *)GetProcAddress( mod_x11, "wine_tsx11_unlock" );
|
|
||||||
|
|
||||||
wine_wgl.p_wglGetProcAddress = (void *)GetProcAddress(mod_gdi32, "wglGetProcAddress");
|
wine_wgl.p_wglGetProcAddress = (void *)GetProcAddress(mod_gdi32, "wglGetProcAddress");
|
||||||
wine_wgl.p_wglMakeCurrent = (void *)GetProcAddress(mod_gdi32, "wglMakeCurrent");
|
wine_wgl.p_wglMakeCurrent = (void *)GetProcAddress(mod_gdi32, "wglMakeCurrent");
|
||||||
wine_wgl.p_wglCreateContext = (void *)GetProcAddress(mod_gdi32, "wglCreateContext");
|
wine_wgl.p_wglCreateContext = (void *)GetProcAddress(mod_gdi32, "wglCreateContext");
|
||||||
|
|
Loading…
Reference in New Issue