Commit 7a031d9b authored by Alexandre Julliard's avatar Alexandre Julliard

opengl32: Add the concept of a WGL driver.

parent db25d402
...@@ -529,8 +529,6 @@ const struct gdi_dc_funcs dib_driver = ...@@ -529,8 +529,6 @@ const struct gdi_dc_funcs dib_driver =
NULL, /* pwglCreateContext */ NULL, /* pwglCreateContext */
NULL, /* pwglCreateContextAttribsARB */ NULL, /* pwglCreateContextAttribsARB */
NULL, /* pwglGetProcAddress */ NULL, /* pwglGetProcAddress */
NULL, /* pwglMakeContextCurrentARB */ NULL, /* wine_get_wgl_driver */
NULL, /* pwglMakeCurrent */
NULL, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_DIB_DRV /* priority */ GDI_PRIORITY_DIB_DRV /* priority */
}; };
...@@ -685,19 +685,9 @@ static PROC nulldrv_wglGetProcAddress( LPCSTR name ) ...@@ -685,19 +685,9 @@ static PROC nulldrv_wglGetProcAddress( LPCSTR name )
return NULL; return NULL;
} }
static BOOL nulldrv_wglMakeCurrent( PHYSDEV dev, HGLRC ctx ) static const struct wgl_funcs *nulldrv_wine_get_wgl_driver( PHYSDEV dev, UINT version )
{ {
return FALSE; return NULL;
}
static BOOL nulldrv_wglMakeContextCurrentARB( PHYSDEV dev_draw, PHYSDEV dev_read, HGLRC ctx )
{
return FALSE;
}
static BOOL nulldrv_wglSetPixelFormatWINE( PHYSDEV dev, INT format, const PIXELFORMATDESCRIPTOR *descr )
{
return FALSE;
} }
const struct gdi_dc_funcs null_driver = const struct gdi_dc_funcs null_driver =
...@@ -836,9 +826,7 @@ const struct gdi_dc_funcs null_driver = ...@@ -836,9 +826,7 @@ const struct gdi_dc_funcs null_driver =
nulldrv_wglCreateContext, /* pwglCreateContext */ nulldrv_wglCreateContext, /* pwglCreateContext */
nulldrv_wglCreateContextAttribsARB, /* pwglCreateContextAttribsARB */ nulldrv_wglCreateContextAttribsARB, /* pwglCreateContextAttribsARB */
nulldrv_wglGetProcAddress, /* pwglGetProcAddress */ nulldrv_wglGetProcAddress, /* pwglGetProcAddress */
nulldrv_wglMakeContextCurrentARB, /* pwglMakeContextCurrentARB */ nulldrv_wine_get_wgl_driver, /* wine_get_wgl_driver */
nulldrv_wglMakeCurrent, /* pwglMakeCurrent */
nulldrv_wglSetPixelFormatWINE, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_NULL_DRV /* priority */ GDI_PRIORITY_NULL_DRV /* priority */
}; };
......
...@@ -170,9 +170,7 @@ static const struct gdi_dc_funcs EMFDRV_Funcs = ...@@ -170,9 +170,7 @@ static const struct gdi_dc_funcs EMFDRV_Funcs =
NULL, /* pwglCreateContext */ NULL, /* pwglCreateContext */
NULL, /* pwglCreateContextAttribsARB */ NULL, /* pwglCreateContextAttribsARB */
NULL, /* pwglGetProcAddress */ NULL, /* pwglGetProcAddress */
NULL, /* pwglMakeContextCurrentARB */ NULL, /* wine_get_wgl_driver */
NULL, /* pwglMakeCurrent */
NULL, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_GRAPHICS_DRV /* priority */ GDI_PRIORITY_GRAPHICS_DRV /* priority */
}; };
......
...@@ -7874,9 +7874,7 @@ static const struct gdi_dc_funcs freetype_funcs = ...@@ -7874,9 +7874,7 @@ static const struct gdi_dc_funcs freetype_funcs =
NULL, /* pwglCreateContext */ NULL, /* pwglCreateContext */
NULL, /* pwglCreateContextAttribsARB */ NULL, /* pwglCreateContextAttribsARB */
NULL, /* pwglGetProcAddress */ NULL, /* pwglGetProcAddress */
NULL, /* pwglMakeContextCurrentARB */ NULL, /* wine_get_wgl_driver */
NULL, /* pwglMakeCurrent */
NULL, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_FONT_DRV /* priority */ GDI_PRIORITY_FONT_DRV /* priority */
}; };
......
...@@ -518,3 +518,6 @@ ...@@ -518,3 +518,6 @@
# GDI objects # GDI objects
@ cdecl __wine_make_gdi_object_system(long long) @ cdecl __wine_make_gdi_object_system(long long)
@ cdecl __wine_set_visible_region(long long ptr) @ cdecl __wine_set_visible_region(long long ptr)
# OpenGL
@ cdecl __wine_get_wgl_driver(long long)
...@@ -233,9 +233,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs = ...@@ -233,9 +233,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
NULL, /* pwglCreateContext */ NULL, /* pwglCreateContext */
NULL, /* pwglCreateContextAttribsARB */ NULL, /* pwglCreateContextAttribsARB */
NULL, /* pwglGetProcAddress */ NULL, /* pwglGetProcAddress */
NULL, /* pwglMakeContextCurrentARB */ NULL, /* wine_get_wgl_driver */
NULL, /* pwglMakeCurrent */
NULL, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_GRAPHICS_DRV /* priority */ GDI_PRIORITY_GRAPHICS_DRV /* priority */
}; };
......
...@@ -134,6 +134,23 @@ PROC WINAPI wglGetProcAddress(LPCSTR func) ...@@ -134,6 +134,23 @@ PROC WINAPI wglGetProcAddress(LPCSTR func)
return ret; return ret;
} }
/***********************************************************************
* __wine_get_wgl_driver (GDI32.@)
*/
const struct wgl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version )
{
const struct wgl_funcs *ret = NULL;
DC * dc = get_dc_ptr( hdc );
if (dc)
{
PHYSDEV physdev = GET_DC_PHYSDEV( dc, wine_get_wgl_driver );
ret = physdev->funcs->wine_get_wgl_driver( physdev, version );
release_dc_ptr( dc );
}
return ret;
}
/****************************************************************************** /******************************************************************************
* ChoosePixelFormat (GDI32.@) * ChoosePixelFormat (GDI32.@)
*/ */
......
...@@ -2367,8 +2367,6 @@ const struct gdi_dc_funcs path_driver = ...@@ -2367,8 +2367,6 @@ const struct gdi_dc_funcs path_driver =
NULL, /* pwglCreateContext */ NULL, /* pwglCreateContext */
NULL, /* pwglCreateContextAttribsARB */ NULL, /* pwglCreateContextAttribsARB */
NULL, /* pwglGetProcAddress */ NULL, /* pwglGetProcAddress */
NULL, /* pwglMakeContextCurrentARB */ NULL, /* wine_get_wgl_driver */
NULL, /* pwglMakeCurrent */
NULL, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_PATH_DRV /* priority */ GDI_PRIORITY_PATH_DRV /* priority */
}; };
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#undef near #undef near
#include <GL/glu.h> #include <GL/glu.h>
#endif #endif
#include "wine/gdi_driver.h"
#include "wine/library.h" #include "wine/library.h"
#include "wine/debug.h" #include "wine/debug.h"
...@@ -52,17 +53,14 @@ static struct ...@@ -52,17 +53,14 @@ static struct
INT (WINAPI *p_GetPixelFormat)(HDC hdc); INT (WINAPI *p_GetPixelFormat)(HDC hdc);
/* internal WGL functions */ /* internal WGL functions */
BOOL (WINAPI *p_wglCopyContext)(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask);
BOOL (WINAPI *p_wglDeleteContext)(HGLRC hglrc);
void (WINAPI *p_wglFinish)(void); void (WINAPI *p_wglFinish)(void);
void (WINAPI *p_wglFlush)(void); void (WINAPI *p_wglFlush)(void);
HGLRC (WINAPI *p_wglGetCurrentContext)(void); HGLRC (WINAPI *p_wglGetCurrentContext)(void);
HDC (WINAPI *p_wglGetCurrentDC)(void);
void (WINAPI *p_wglGetIntegerv)(GLenum pname, GLint* params); void (WINAPI *p_wglGetIntegerv)(GLenum pname, GLint* params);
BOOL (WINAPI *p_wglMakeCurrent)(HDC hdc, HGLRC hglrc);
BOOL (WINAPI *p_wglShareLists)(HGLRC hglrc1, HGLRC hglrc2);
} wine_wgl; } wine_wgl;
static const struct wgl_funcs *wgl_driver;
#ifdef SONAME_LIBGLU #ifdef SONAME_LIBGLU
#define MAKE_FUNCPTR(f) static typeof(f) * p##f; #define MAKE_FUNCPTR(f) static typeof(f) * p##f;
MAKE_FUNCPTR(gluNewTess) MAKE_FUNCPTR(gluNewTess)
...@@ -105,7 +103,7 @@ BOOL WINAPI wglCopyContext(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask) ...@@ -105,7 +103,7 @@ BOOL WINAPI wglCopyContext(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask)
SetLastError(ERROR_INVALID_HANDLE); SetLastError(ERROR_INVALID_HANDLE);
return FALSE; return FALSE;
} }
return wine_wgl.p_wglCopyContext(hglrcSrc, hglrcDst, mask); return wgl_driver->p_wglCopyContext(hglrcSrc, hglrcDst, mask);
} }
/*********************************************************************** /***********************************************************************
...@@ -118,7 +116,7 @@ BOOL WINAPI wglDeleteContext(HGLRC hglrc) ...@@ -118,7 +116,7 @@ BOOL WINAPI wglDeleteContext(HGLRC hglrc)
SetLastError(ERROR_INVALID_HANDLE); SetLastError(ERROR_INVALID_HANDLE);
return FALSE; return FALSE;
} }
return wine_wgl.p_wglDeleteContext(hglrc); return wgl_driver->p_wglDeleteContext(hglrc);
} }
/*********************************************************************** /***********************************************************************
...@@ -131,7 +129,7 @@ BOOL WINAPI wglMakeCurrent(HDC hdc, HGLRC hglrc) ...@@ -131,7 +129,7 @@ BOOL WINAPI wglMakeCurrent(HDC hdc, HGLRC hglrc)
SetLastError( ERROR_INVALID_HANDLE ); SetLastError( ERROR_INVALID_HANDLE );
return FALSE; return FALSE;
} }
return wine_wgl.p_wglMakeCurrent(hdc, hglrc); return wgl_driver->p_wglMakeCurrent(hdc, hglrc);
} }
/*********************************************************************** /***********************************************************************
...@@ -144,7 +142,7 @@ BOOL WINAPI wglShareLists(HGLRC hglrc1, HGLRC hglrc2) ...@@ -144,7 +142,7 @@ BOOL WINAPI wglShareLists(HGLRC hglrc1, HGLRC hglrc2)
SetLastError(ERROR_INVALID_HANDLE); SetLastError(ERROR_INVALID_HANDLE);
return FALSE; return FALSE;
} }
return wine_wgl.p_wglShareLists(hglrc1, hglrc2); return wgl_driver->p_wglShareLists(hglrc1, hglrc2);
} }
/*********************************************************************** /***********************************************************************
...@@ -152,7 +150,7 @@ BOOL WINAPI wglShareLists(HGLRC hglrc1, HGLRC hglrc2) ...@@ -152,7 +150,7 @@ BOOL WINAPI wglShareLists(HGLRC hglrc1, HGLRC hglrc2)
*/ */
HDC WINAPI wglGetCurrentDC(void) HDC WINAPI wglGetCurrentDC(void)
{ {
return wine_wgl.p_wglGetCurrentDC(); return wgl_driver->p_wglGetCurrentDC();
} }
/*********************************************************************** /***********************************************************************
...@@ -1084,8 +1082,11 @@ BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc ) ...@@ -1084,8 +1082,11 @@ BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc )
static BOOL process_attach(void) static BOOL process_attach(void)
{ {
HMODULE mod_gdi32; HMODULE mod_gdi32;
HDC hdc = GetDC( 0 );
wgl_driver = __wine_get_wgl_driver( hdc, WINE_GDI_DRIVER_VERSION );
ReleaseDC( 0, hdc );
GetDesktopWindow(); /* make sure winex11 is loaded (FIXME) */
mod_gdi32 = GetModuleHandleA( "gdi32.dll" ); mod_gdi32 = GetModuleHandleA( "gdi32.dll" );
if (!mod_gdi32) if (!mod_gdi32)
...@@ -1099,15 +1100,10 @@ static BOOL process_attach(void) ...@@ -1099,15 +1100,10 @@ static BOOL process_attach(void)
wine_wgl.p_GetPixelFormat = (void *)GetProcAddress(mod_gdi32, "GetPixelFormat"); wine_wgl.p_GetPixelFormat = (void *)GetProcAddress(mod_gdi32, "GetPixelFormat");
/* internal WGL functions */ /* internal WGL functions */
wine_wgl.p_wglCopyContext = (void *)wine_wgl.p_wglGetProcAddress("wglCopyContext");
wine_wgl.p_wglDeleteContext = (void *)wine_wgl.p_wglGetProcAddress("wglDeleteContext");
wine_wgl.p_wglFinish = (void *)wine_wgl.p_wglGetProcAddress("wglFinish"); wine_wgl.p_wglFinish = (void *)wine_wgl.p_wglGetProcAddress("wglFinish");
wine_wgl.p_wglFlush = (void *)wine_wgl.p_wglGetProcAddress("wglFlush"); wine_wgl.p_wglFlush = (void *)wine_wgl.p_wglGetProcAddress("wglFlush");
wine_wgl.p_wglGetCurrentContext = (void *)wine_wgl.p_wglGetProcAddress("wglGetCurrentContext"); wine_wgl.p_wglGetCurrentContext = (void *)wine_wgl.p_wglGetProcAddress("wglGetCurrentContext");
wine_wgl.p_wglGetCurrentDC = (void *)wine_wgl.p_wglGetProcAddress("wglGetCurrentDC");
wine_wgl.p_wglGetIntegerv = (void *)wine_wgl.p_wglGetProcAddress("wglGetIntegerv"); wine_wgl.p_wglGetIntegerv = (void *)wine_wgl.p_wglGetProcAddress("wglGetIntegerv");
wine_wgl.p_wglMakeCurrent = (void *)wine_wgl.p_wglGetProcAddress("wglMakeCurrent");
wine_wgl.p_wglShareLists = (void *)wine_wgl.p_wglGetProcAddress("wglShareLists");
return TRUE; return TRUE;
} }
......
...@@ -844,9 +844,7 @@ static const struct gdi_dc_funcs psdrv_funcs = ...@@ -844,9 +844,7 @@ static const struct gdi_dc_funcs psdrv_funcs =
NULL, /* pwglCreateContext */ NULL, /* pwglCreateContext */
NULL, /* pwglCreateContextAttribsARB */ NULL, /* pwglCreateContextAttribsARB */
NULL, /* pwglGetProcAddress */ NULL, /* pwglGetProcAddress */
NULL, /* pwglMakeContextCurrentARB */ NULL, /* wine_get_wgl_driver */
NULL, /* pwglMakeCurrent */
NULL, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_GRAPHICS_DRV /* priority */ GDI_PRIORITY_GRAPHICS_DRV /* priority */
}; };
......
...@@ -500,15 +500,6 @@ static PROC X11DRV_wglGetProcAddress( LPCSTR proc ) ...@@ -500,15 +500,6 @@ static PROC X11DRV_wglGetProcAddress( LPCSTR proc )
return NULL; return NULL;
} }
/***********************************************************************
* X11DRV_wglSetPixelFormatWINE
*/
static BOOL X11DRV_wglSetPixelFormatWINE( PHYSDEV dev, int fmt, const PIXELFORMATDESCRIPTOR *ppfd )
{
opengl_error();
return FALSE;
}
static const struct gdi_dc_funcs x11drv_funcs = static const struct gdi_dc_funcs x11drv_funcs =
{ {
...@@ -646,9 +637,7 @@ static const struct gdi_dc_funcs x11drv_funcs = ...@@ -646,9 +637,7 @@ static const struct gdi_dc_funcs x11drv_funcs =
X11DRV_wglCreateContext, /* pwglCreateContext */ X11DRV_wglCreateContext, /* pwglCreateContext */
X11DRV_wglCreateContextAttribsARB, /* pwglCreateContextAttribsARB */ X11DRV_wglCreateContextAttribsARB, /* pwglCreateContextAttribsARB */
X11DRV_wglGetProcAddress, /* pwglGetProcAddress */ X11DRV_wglGetProcAddress, /* pwglGetProcAddress */
NULL, /* pwglMakeContextCurrentARB */ NULL, /* wine_get_wgl_driver */
NULL, /* pwglMakeCurrent */
X11DRV_wglSetPixelFormatWINE, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_GRAPHICS_DRV /* priority */ GDI_PRIORITY_GRAPHICS_DRV /* priority */
}; };
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
* Copyright 2005 Raphael Junqueira * Copyright 2005 Raphael Junqueira
* Copyright 2006-2009 Roderick Colenbrander * Copyright 2006-2009 Roderick Colenbrander
* Copyright 2006 Tomas Carnecky * Copyright 2006 Tomas Carnecky
* Copyright 2012 Alexandre Julliard
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -158,6 +159,7 @@ struct glx_physdev ...@@ -158,6 +159,7 @@ struct glx_physdev
Pixmap pixmap; /* pixmap for a DL_GL_PIXMAP_WIN drawable */ Pixmap pixmap; /* pixmap for a DL_GL_PIXMAP_WIN drawable */
}; };
static const struct wgl_funcs glxdrv_wgl_funcs;
static const struct gdi_dc_funcs glxdrv_funcs; static const struct gdi_dc_funcs glxdrv_funcs;
static inline struct glx_physdev *get_glxdrv_dev( PHYSDEV dev ) static inline struct glx_physdev *get_glxdrv_dev( PHYSDEV dev )
...@@ -1393,12 +1395,10 @@ static BOOL glxdrv_SetPixelFormat(PHYSDEV dev, int iPixelFormat, const PIXELFORM ...@@ -1393,12 +1395,10 @@ static BOOL glxdrv_SetPixelFormat(PHYSDEV dev, int iPixelFormat, const PIXELFORM
return TRUE; return TRUE;
} }
/** /***********************************************************************
* X11DRV_wglCopyContext * glxdrv_wglCopyContext
*
* For OpenGL32 wglCopyContext.
*/ */
static BOOL WINAPI X11DRV_wglCopyContext(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask) static BOOL glxdrv_wglCopyContext(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask)
{ {
Wine_GLContext *src = (Wine_GLContext*)hglrcSrc; Wine_GLContext *src = (Wine_GLContext*)hglrcSrc;
Wine_GLContext *dst = (Wine_GLContext*)hglrcDst; Wine_GLContext *dst = (Wine_GLContext*)hglrcDst;
...@@ -1457,14 +1457,10 @@ static HGLRC glxdrv_wglCreateContext(PHYSDEV dev) ...@@ -1457,14 +1457,10 @@ static HGLRC glxdrv_wglCreateContext(PHYSDEV dev)
return (HGLRC) ret; return (HGLRC) ret;
} }
static BOOL WINAPI X11DRV_wglMakeCurrent(HDC hdc, HGLRC hglrc); /***********************************************************************
* glxdrv_wglDeleteContext
/**
* X11DRV_wglDeleteContext
*
* For OpenGL32 wglDeleteContext.
*/ */
static BOOL WINAPI X11DRV_wglDeleteContext(HGLRC hglrc) static BOOL glxdrv_wglDeleteContext(HGLRC hglrc)
{ {
Wine_GLContext *ctx = (Wine_GLContext *) hglrc; Wine_GLContext *ctx = (Wine_GLContext *) hglrc;
...@@ -1487,7 +1483,12 @@ static BOOL WINAPI X11DRV_wglDeleteContext(HGLRC hglrc) ...@@ -1487,7 +1483,12 @@ static BOOL WINAPI X11DRV_wglDeleteContext(HGLRC hglrc)
/* WGL makes a context not current if it is active before deletion. GLX waits until the context is not current. */ /* WGL makes a context not current if it is active before deletion. GLX waits until the context is not current. */
if (ctx == NtCurrentTeb()->glContext) if (ctx == NtCurrentTeb()->glContext)
X11DRV_wglMakeCurrent(ctx->hdc, NULL); {
wine_tsx11_lock();
pglXMakeCurrent(gdi_display, None, NULL);
wine_tsx11_unlock();
NtCurrentTeb()->glContext = NULL;
}
wine_tsx11_lock(); wine_tsx11_lock();
list_remove( &ctx->entry ); list_remove( &ctx->entry );
...@@ -1573,12 +1574,10 @@ static GLXPixmap get_context_pixmap( HDC hdc, struct wine_glcontext *ctx ) ...@@ -1573,12 +1574,10 @@ static GLXPixmap get_context_pixmap( HDC hdc, struct wine_glcontext *ctx )
return ctx->glxpixmap; return ctx->glxpixmap;
} }
/** /***********************************************************************
* X11DRV_wglMakeCurrent * glxdrv_wglMakeCurrent
*
* For OpenGL32 wglMakeCurrent.
*/ */
static BOOL WINAPI X11DRV_wglMakeCurrent(HDC hdc, HGLRC hglrc) static BOOL glxdrv_wglMakeCurrent(HDC hdc, HGLRC hglrc)
{ {
BOOL ret; BOOL ret;
Wine_GLContext *prev_ctx = NtCurrentTeb()->glContext; Wine_GLContext *prev_ctx = NtCurrentTeb()->glContext;
...@@ -1726,20 +1725,16 @@ static BOOL WINAPI X11DRV_wglMakeContextCurrentARB( HDC draw_hdc, HDC read_hdc, ...@@ -1726,20 +1725,16 @@ static BOOL WINAPI X11DRV_wglMakeContextCurrentARB( HDC draw_hdc, HDC read_hdc,
return ret; return ret;
} }
/** /***********************************************************************
* X11DRV_wglShareLists * glxdrv_wglShareLists
*
* For OpenGL32 wglShareLists.
*/ */
static BOOL WINAPI X11DRV_wglShareLists(HGLRC hglrc1, HGLRC hglrc2) static BOOL glxdrv_wglShareLists(HGLRC hglrc1, HGLRC hglrc2)
{ {
Wine_GLContext *org = (Wine_GLContext *) hglrc1; Wine_GLContext *org = (Wine_GLContext *) hglrc1;
Wine_GLContext *dest = (Wine_GLContext *) hglrc2; Wine_GLContext *dest = (Wine_GLContext *) hglrc2;
TRACE("(%p, %p)\n", org, dest); TRACE("(%p, %p)\n", org, dest);
if (!has_opengl()) return FALSE;
/* Sharing of display lists works differently in GLX and WGL. In case of GLX it is done /* Sharing of display lists works differently in GLX and WGL. In case of GLX it is done
* at context creation time but in case of WGL it is done using wglShareLists. * at context creation time but in case of WGL it is done using wglShareLists.
* In the past we tried to emulate wglShareLists by delaying GLX context creation until * In the past we tried to emulate wglShareLists by delaying GLX context creation until
...@@ -1795,9 +1790,9 @@ static HGLRC WINAPI X11DRV_wglGetCurrentContext(void) ...@@ -1795,9 +1790,9 @@ static HGLRC WINAPI X11DRV_wglGetCurrentContext(void)
} }
/*********************************************************************** /***********************************************************************
* X11DRV_wglGetCurrentDC * glxdrv_wglGetCurrentDC
*/ */
static HDC WINAPI X11DRV_wglGetCurrentDC(void) static HDC glxdrv_wglGetCurrentDC(void)
{ {
Wine_GLContext *ctx = NtCurrentTeb()->glContext; Wine_GLContext *ctx = NtCurrentTeb()->glContext;
...@@ -3071,15 +3066,10 @@ static const WineGLExtension WGL_internal_functions = ...@@ -3071,15 +3066,10 @@ static const WineGLExtension WGL_internal_functions =
{ {
"", "",
{ {
{ "wglCopyContext", X11DRV_wglCopyContext },
{ "wglDeleteContext", X11DRV_wglDeleteContext },
{ "wglFinish", X11DRV_wglFinish }, { "wglFinish", X11DRV_wglFinish },
{ "wglFlush", X11DRV_wglFlush }, { "wglFlush", X11DRV_wglFlush },
{ "wglGetCurrentContext", X11DRV_wglGetCurrentContext }, { "wglGetCurrentContext", X11DRV_wglGetCurrentContext },
{ "wglGetCurrentDC", X11DRV_wglGetCurrentDC },
{ "wglGetIntegerv", X11DRV_wglGetIntegerv }, { "wglGetIntegerv", X11DRV_wglGetIntegerv },
{ "wglMakeCurrent", X11DRV_wglMakeCurrent },
{ "wglShareLists", X11DRV_wglShareLists },
} }
}; };
...@@ -3285,8 +3275,6 @@ static BOOL glxdrv_SwapBuffers(PHYSDEV dev) ...@@ -3285,8 +3275,6 @@ static BOOL glxdrv_SwapBuffers(PHYSDEV dev)
struct glx_physdev *physdev = get_glxdrv_dev( dev ); struct glx_physdev *physdev = get_glxdrv_dev( dev );
Wine_GLContext *ctx = NtCurrentTeb()->glContext; Wine_GLContext *ctx = NtCurrentTeb()->glContext;
if (!has_opengl()) return FALSE;
TRACE("(%p)\n", dev->hdc); TRACE("(%p)\n", dev->hdc);
if (!ctx) if (!ctx)
...@@ -3457,6 +3445,20 @@ static INT glxdrv_ExtEscape( PHYSDEV dev, INT escape, INT in_count, LPCVOID in_d ...@@ -3457,6 +3445,20 @@ static INT glxdrv_ExtEscape( PHYSDEV dev, INT escape, INT in_count, LPCVOID in_d
return dev->funcs->pExtEscape( dev, escape, in_count, in_data, out_count, out_data ); return dev->funcs->pExtEscape( dev, escape, in_count, in_data, out_count, out_data );
} }
/**********************************************************************
* glxdrv_wine_get_wgl_driver
*/
static const struct wgl_funcs * glxdrv_wine_get_wgl_driver( PHYSDEV dev, UINT version )
{
if (version != WINE_GDI_DRIVER_VERSION)
{
ERR( "version mismatch, opengl32 wants %u but driver has %u\n", version, WINE_GDI_DRIVER_VERSION );
return NULL;
}
if (!has_opengl()) return NULL;
return &glxdrv_wgl_funcs;
}
static const struct gdi_dc_funcs glxdrv_funcs = static const struct gdi_dc_funcs glxdrv_funcs =
{ {
NULL, /* pAbortDoc */ NULL, /* pAbortDoc */
...@@ -3593,12 +3595,19 @@ static const struct gdi_dc_funcs glxdrv_funcs = ...@@ -3593,12 +3595,19 @@ static const struct gdi_dc_funcs glxdrv_funcs =
glxdrv_wglCreateContext, /* pwglCreateContext */ glxdrv_wglCreateContext, /* pwglCreateContext */
glxdrv_wglCreateContextAttribsARB, /* pwglCreateContextAttribsARB */ glxdrv_wglCreateContextAttribsARB, /* pwglCreateContextAttribsARB */
glxdrv_wglGetProcAddress, /* pwglGetProcAddress */ glxdrv_wglGetProcAddress, /* pwglGetProcAddress */
NULL, /* pwglMakeContextCurrentARB */ glxdrv_wine_get_wgl_driver, /* wine_get_wgl_driver */
NULL, /* pwglMakeCurrent */
NULL, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_GRAPHICS_DRV + 20 /* priority */ GDI_PRIORITY_GRAPHICS_DRV + 20 /* priority */
}; };
static const struct wgl_funcs glxdrv_wgl_funcs =
{
glxdrv_wglCopyContext, /* p_wglCopyContext */
glxdrv_wglDeleteContext, /* p_wglDeleteContext */
glxdrv_wglGetCurrentDC, /* p_wglGetCurrentDC */
glxdrv_wglMakeCurrent, /* p_wglMakeCurrent */
glxdrv_wglShareLists, /* p_wglShareLists */
};
const struct gdi_dc_funcs *get_glx_driver(void) const struct gdi_dc_funcs *get_glx_driver(void)
{ {
return &glxdrv_funcs; return &glxdrv_funcs;
......
...@@ -2600,9 +2600,7 @@ static const struct gdi_dc_funcs xrender_funcs = ...@@ -2600,9 +2600,7 @@ static const struct gdi_dc_funcs xrender_funcs =
NULL, /* pwglCreateContext */ NULL, /* pwglCreateContext */
NULL, /* pwglCreateContextAttribsARB */ NULL, /* pwglCreateContextAttribsARB */
NULL, /* pwglGetProcAddress */ NULL, /* pwglGetProcAddress */
NULL, /* pwglMakeContextCurrentARB */ NULL, /* wine_get_wgl_driver */
NULL, /* pwglMakeCurrent */
NULL, /* pwglSetPixelFormatWINE */
GDI_PRIORITY_GRAPHICS_DRV + 10 /* priority */ GDI_PRIORITY_GRAPHICS_DRV + 10 /* priority */
}; };
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#define __WINE_WINE_GDI_DRIVER_H #define __WINE_WINE_GDI_DRIVER_H
struct gdi_dc_funcs; struct gdi_dc_funcs;
struct wgl_funcs;
typedef struct gdi_physdev typedef struct gdi_physdev
{ {
...@@ -195,16 +196,14 @@ struct gdi_dc_funcs ...@@ -195,16 +196,14 @@ struct gdi_dc_funcs
HGLRC (*pwglCreateContext)(PHYSDEV); HGLRC (*pwglCreateContext)(PHYSDEV);
HGLRC (*pwglCreateContextAttribsARB)(PHYSDEV,HGLRC,const int*); HGLRC (*pwglCreateContextAttribsARB)(PHYSDEV,HGLRC,const int*);
PROC (*pwglGetProcAddress)(LPCSTR); PROC (*pwglGetProcAddress)(LPCSTR);
BOOL (*pwglMakeContextCurrentARB)(PHYSDEV,PHYSDEV,HGLRC); const struct wgl_funcs * (*wine_get_wgl_driver)(PHYSDEV,UINT);
BOOL (*pwglMakeCurrent)(PHYSDEV,HGLRC);
BOOL (*pwglSetPixelFormatWINE)(PHYSDEV,INT,const PIXELFORMATDESCRIPTOR*);
/* priority order for the driver on the stack */ /* priority order for the driver on the stack */
UINT priority; UINT priority;
}; };
/* increment this when you change the DC function table */ /* increment this when you change the DC function table */
#define WINE_GDI_DRIVER_VERSION 32 #define WINE_GDI_DRIVER_VERSION 33
#define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_NULL_DRV 0 /* null driver */
#define GDI_PRIORITY_FONT_DRV 100 /* any font driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */
...@@ -230,6 +229,17 @@ static inline void push_dc_driver( PHYSDEV *dev, PHYSDEV physdev, const struct g ...@@ -230,6 +229,17 @@ static inline void push_dc_driver( PHYSDEV *dev, PHYSDEV physdev, const struct g
*dev = physdev; *dev = physdev;
} }
/* OpenGL support */
struct wgl_funcs
{
BOOL (*p_wglCopyContext)(HGLRC,HGLRC,UINT);
BOOL (*p_wglDeleteContext)(HGLRC);
HDC (*p_wglGetCurrentDC)(void);
BOOL (*p_wglMakeCurrent)(HDC,HGLRC);
BOOL (*p_wglShareLists)(HGLRC,HGLRC);
};
/* the DC hook support is only exported on Win16, the 32-bit version is a Wine extension */ /* the DC hook support is only exported on Win16, the 32-bit version is a Wine extension */
#define DCHC_INVALIDVISRGN 0x0001 #define DCHC_INVALIDVISRGN 0x0001
...@@ -245,5 +255,6 @@ WINGDIAPI WORD WINAPI SetHookFlags(HDC,WORD); ...@@ -245,5 +255,6 @@ WINGDIAPI WORD WINAPI SetHookFlags(HDC,WORD);
extern void CDECL __wine_make_gdi_object_system( HGDIOBJ handle, BOOL set ); extern void CDECL __wine_make_gdi_object_system( HGDIOBJ handle, BOOL set );
extern void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect ); extern void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect );
extern const struct wgl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version );
#endif /* __WINE_WINE_GDI_DRIVER_H */ #endif /* __WINE_WINE_GDI_DRIVER_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment