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.
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?