Regression in patch: OpenGL32: remove glx context

Mirek thunder.m at czela.net
Wed Nov 8 15:32:05 CST 2006


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);
>  }
>  
> 
> 
> ------------------------------------------------------------------------
> 
> 



More information about the wine-patches mailing list