This patch broke nvidia SDK opengl demos, i cant run it with this patch. Here is some small report from terminal: cvswine glsl_bump_mapping.exe err:wgl:process_attach X11DRV or GDI32 not loaded. Cannot create default context. err:module:LdrInitializeThunk "opengl32.dll" failed to initialize, aborting err:module:LdrInitializeThunk Main exe initialization for L"G:\\usr\\games\\nvidiaSDK\\DEMOS\\OpenGL\\bin\\Release\\glsl_bump_mapping.exe" failed, status c0000142 Mirek Roderick Colenbrander napsal(a):
Hi,
This patch removes creation of a GLX context at opengl32 startup.
The old code created a GLX context at startup, so that programs could call glGet* functions like glGetString before creating an OpenGL context. The OpenGL standards don't allow this and I verified this on winxp/win98 and as expected calling glGet* before creating a context returns NULL as documented everywhere.
The the code was originally added for a game called Homeworld which called wglGet* before creating a context. Atleast the first version of the game made this call but I haven't seen this behaviour in the source code of the game (which is public). Most likely it was a bug in the first version of the game.
Regards, Roderick Colenbrander
------------------------------------------------------------------------
--- dlls/opengl32/wgl.c 2006-11-03 22:35:06.000000000 +0100 +++ dlls/opengl32/wgl.c 2006-11-03 16:47:33.000000000 +0100 @@ -74,9 +74,6 @@ void (*wine_tsx11_lock_ptr)(void) = NULL; void (*wine_tsx11_unlock_ptr)(void) = NULL;
-static GLXContext default_cx = NULL; -static Display *default_display; /* display to use for default context */ - static HMODULE opengl32_handle;
static char internal_gl_disabled_extensions[512]; @@ -107,17 +104,6 @@ return; }
-/* retrieve the X display to use on a given DC */ -inline static Display *get_display( HDC hdc ) -{ - Display *display; - enum x11drv_escape_codes escape = X11DRV_GET_DISPLAY; - - if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape, - sizeof(display), (LPSTR)&display )) display = NULL; - return display; -} - /*********************************************************************** * wglCreateLayerContext (OPENGL32.@) */ @@ -635,19 +621,12 @@ creating a rendering context.... */ static BOOL process_attach(void) { - XWindowAttributes win_attr; - Visual *rootVisual; - int num; - XVisualInfo template; - HDC hdc; - XVisualInfo *vis = NULL; - Window root = (Window)GetPropA( GetDesktopWindow(), "__wine_x11_whole_window" ); HMODULE mod = GetModuleHandleA( "winex11.drv" ); HMODULE mod_gdi32 = GetModuleHandleA( "gdi32.dll" ); DWORD size = sizeof(internal_gl_disabled_extensions); HKEY hkey = 0;
- if (!root || !mod || !mod_gdi32) + if (!mod || !mod_gdi32) { ERR("X11DRV or GDI32 not loaded. Cannot create default context.\n"); return FALSE; @@ -661,40 +640,6 @@ /* Interal WGL function */ wine_wgl.p_wglGetIntegerv = (void *)wine_wgl.p_wglGetProcAddress("wglGetIntegerv");
- hdc = GetDC(0); - default_display = get_display( hdc ); - ReleaseDC( 0, hdc ); - if (!default_display) - { - ERR("X11DRV not loaded. Cannot get display for screen DC.\n"); - return FALSE; - } - - ENTER_GL(); - - /* Try to get the visual from the Root Window. We can't use the standard (presumably - double buffered) X11DRV visual with the Root Window, since we don't know if the Root - Window was created using the standard X11DRV visual, and glXMakeCurrent can't deal - with mismatched visuals. Note that the Root Window visual may not be double - buffered, so apps actually attempting to render this way may flicker */ - if (XGetWindowAttributes( default_display, root, &win_attr )) - { - rootVisual = win_attr.visual; - } - else - { - /* Get the default visual, since we can't seem to get the attributes from the - Root Window. Let's hope that the Root Window Visual matches the DefaultVisual */ - rootVisual = DefaultVisual( default_display, DefaultScreen(default_display) ); - } - - template.visualid = XVisualIDFromVisual(rootVisual); - vis = XGetVisualInfo(default_display, VisualIDMask, &template, &num); - if (vis != NULL) default_cx = glXCreateContext(default_display, vis, 0, GL_TRUE); - if (default_cx != NULL) glXMakeCurrent(default_display, root, default_cx); - XFree(vis); - LEAVE_GL(); - internal_gl_disabled_extensions[0] = 0; if (!RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Wine\\OpenGL", &hkey)) { if (!RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, (LPBYTE)internal_gl_disabled_extensions, &size)) { @@ -703,9 +648,6 @@ RegCloseKey(hkey); }
- if (default_cx == NULL) { - ERR("Could not create default context.\n"); - } return TRUE; }
@@ -714,8 +656,6 @@
static void process_detach(void) { - glXDestroyContext(default_display, default_cx); - HeapFree(GetProcessHeap(), 0, internal_gl_extensions); }
------------------------------------------------------------------------
On Wed, Nov 08, 2006 at 10:32:05PM +0100, Mirek wrote:
Here is some small report from terminal: cvswine glsl_bump_mapping.exe err:wgl:process_attach X11DRV or GDI32 not loaded. Cannot create default context. err:module:LdrInitializeThunk "opengl32.dll" failed to initialize, aborting err:module:LdrInitializeThunk Main exe initialization for L"G:\\usr\\games\\nvidiaSDK\\DEMOS\\OpenGL\\bin\\Release\\glsl_bump_mapping.exe" failed, status c0000142
i would like to second that. Undercover/Operation Hellfire also bails out with the ``err``. as the error message is not so helpful i splitted it into two and the missing dll here is the x11drv. before the change there was the creation of the root-window/desktop before the call and a grep for x11drv only revealed the the desktop creation is - at least the only place i could find - where it seemed like it would be loaded. i tried starting e.g. progman manually before the game to have desktop - but the error is the same. fyi i run all my apps with a fullscreen desktop-setting - and i have not yet tried without it. -- cu
Mirek wrote:
This patch broke nvidia SDK opengl demos, i cant run it with this patch.
Here is some small report from terminal: cvswine glsl_bump_mapping.exe err:wgl:process_attach X11DRV or GDI32 not loaded. Cannot create default context. err:module:LdrInitializeThunk "opengl32.dll" failed to initialize, aborting err:module:LdrInitializeThunk Main exe initialization for L"G:\\usr\\games\\nvidiaSDK\\DEMOS\\OpenGL\\bin\\Release\\glsl_bump_mapping.exe" failed, status c0000142
Perhaps the patch removed the last remaining user32 imports, causing user32 to no longer be loaded unless the app links to it? -- Rob Shearman
participants (3)
-
Christoph Frick -
Mirek -
Robert Shearman