[PATCH 2/6] wined3d: Use struct opengl_funcs for storing GL extension pointers.

Henri Verbeet hverbeet at codeweavers.com
Tue Jul 24 04:32:23 CDT 2012


---
 dlls/wined3d/directx.c         |   91 ++++++++++++++++++++-------------------
 dlls/wined3d/gl_compat.c       |   40 +++++++++---------
 dlls/wined3d/wined3d_gl.h      |    6 ---
 dlls/wined3d/wined3d_private.h |   16 ++++---
 4 files changed, 76 insertions(+), 77 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 14de65c..f1c0978 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2317,7 +2317,7 @@ static void parse_extension_string(struct wined3d_gl_info *gl_info, const char *
 
 static void load_gl_funcs(struct wined3d_gl_info *gl_info, DWORD gl_version)
 {
-#define USE_GL_FUNC(type, pfn, ext, replace) gl_info->pfn = (type)pwglGetProcAddress(#pfn);
+#define USE_GL_FUNC(type, pfn, ext_id, replace) gl_info->gl_ops.ext.p_##pfn = (void *)pwglGetProcAddress(#pfn);
     GL_EXT_FUNCS_GEN;
     WGL_EXT_FUNCS_GEN;
 #undef USE_GL_FUNC
@@ -2604,7 +2604,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
     hdc = pwglGetCurrentDC();
     /* Not all GL drivers might offer WGL extensions e.g. VirtualBox. */
     if (GL_EXTCALL(wglGetExtensionsStringARB))
-        WGL_Extensions = GL_EXTCALL(wglGetExtensionsStringARB(hdc));
+        WGL_Extensions = (const char *)GL_EXTCALL(wglGetExtensionsStringARB(hdc));
     if (!WGL_Extensions)
         WARN("WGL extensions not supported.\n");
     else
@@ -2614,16 +2614,16 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
     if (!gl_info->supported[EXT_TEXTURE3D] && gl_version >= MAKEDWORD_VERSION(1, 2))
     {
         TRACE("GL CORE: GL_EXT_texture3D support.\n");
-        gl_info->glTexImage3DEXT = (void *)pwglGetProcAddress("glTexImage3D");
-        gl_info->glTexSubImage3DEXT = (void *)pwglGetProcAddress("glTexSubImage3D");
+        gl_info->gl_ops.ext.p_glTexImage3DEXT = (void *)pwglGetProcAddress("glTexImage3D");
+        gl_info->gl_ops.ext.p_glTexSubImage3DEXT = (void *)pwglGetProcAddress("glTexSubImage3D");
         gl_info->supported[EXT_TEXTURE3D] = TRUE;
     }
 
     if (!gl_info->supported[NV_POINT_SPRITE] && gl_version >= MAKEDWORD_VERSION(1, 4))
     {
         TRACE("GL CORE: GL_NV_point_sprite support.\n");
-        gl_info->glPointParameterivNV = (void *)pwglGetProcAddress("glPointParameteriv");
-        gl_info->glPointParameteriNV = (void *)pwglGetProcAddress("glPointParameteri");
+        gl_info->gl_ops.ext.p_glPointParameterivNV = (void *)pwglGetProcAddress("glPointParameteriv");
+        gl_info->gl_ops.ext.p_glPointParameteriNV = (void *)pwglGetProcAddress("glPointParameteri");
         gl_info->supported[NV_POINT_SPRITE] = TRUE;
     }
 
@@ -2759,47 +2759,49 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
 
     if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT])
     {
-        gl_info->fbo_ops.glIsRenderbuffer = gl_info->glIsRenderbuffer;
-        gl_info->fbo_ops.glBindRenderbuffer = gl_info->glBindRenderbuffer;
-        gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->glDeleteRenderbuffers;
-        gl_info->fbo_ops.glGenRenderbuffers = gl_info->glGenRenderbuffers;
-        gl_info->fbo_ops.glRenderbufferStorage = gl_info->glRenderbufferStorage;
-        gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->glRenderbufferStorageMultisample;
-        gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->glGetRenderbufferParameteriv;
-        gl_info->fbo_ops.glIsFramebuffer = gl_info->glIsFramebuffer;
-        gl_info->fbo_ops.glBindFramebuffer = gl_info->glBindFramebuffer;
-        gl_info->fbo_ops.glDeleteFramebuffers = gl_info->glDeleteFramebuffers;
-        gl_info->fbo_ops.glGenFramebuffers = gl_info->glGenFramebuffers;
-        gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->glCheckFramebufferStatus;
-        gl_info->fbo_ops.glFramebufferTexture1D = gl_info->glFramebufferTexture1D;
-        gl_info->fbo_ops.glFramebufferTexture2D = gl_info->glFramebufferTexture2D;
-        gl_info->fbo_ops.glFramebufferTexture3D = gl_info->glFramebufferTexture3D;
-        gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->glFramebufferRenderbuffer;
-        gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv = gl_info->glGetFramebufferAttachmentParameteriv;
-        gl_info->fbo_ops.glBlitFramebuffer = gl_info->glBlitFramebuffer;
-        gl_info->fbo_ops.glGenerateMipmap = gl_info->glGenerateMipmap;
+        gl_info->fbo_ops.glIsRenderbuffer = gl_info->gl_ops.ext.p_glIsRenderbuffer;
+        gl_info->fbo_ops.glBindRenderbuffer = gl_info->gl_ops.ext.p_glBindRenderbuffer;
+        gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->gl_ops.ext.p_glDeleteRenderbuffers;
+        gl_info->fbo_ops.glGenRenderbuffers = gl_info->gl_ops.ext.p_glGenRenderbuffers;
+        gl_info->fbo_ops.glRenderbufferStorage = gl_info->gl_ops.ext.p_glRenderbufferStorage;
+        gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->gl_ops.ext.p_glRenderbufferStorageMultisample;
+        gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->gl_ops.ext.p_glGetRenderbufferParameteriv;
+        gl_info->fbo_ops.glIsFramebuffer = gl_info->gl_ops.ext.p_glIsFramebuffer;
+        gl_info->fbo_ops.glBindFramebuffer = gl_info->gl_ops.ext.p_glBindFramebuffer;
+        gl_info->fbo_ops.glDeleteFramebuffers = gl_info->gl_ops.ext.p_glDeleteFramebuffers;
+        gl_info->fbo_ops.glGenFramebuffers = gl_info->gl_ops.ext.p_glGenFramebuffers;
+        gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->gl_ops.ext.p_glCheckFramebufferStatus;
+        gl_info->fbo_ops.glFramebufferTexture1D = gl_info->gl_ops.ext.p_glFramebufferTexture1D;
+        gl_info->fbo_ops.glFramebufferTexture2D = gl_info->gl_ops.ext.p_glFramebufferTexture2D;
+        gl_info->fbo_ops.glFramebufferTexture3D = gl_info->gl_ops.ext.p_glFramebufferTexture3D;
+        gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->gl_ops.ext.p_glFramebufferRenderbuffer;
+        gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv
+                = gl_info->gl_ops.ext.p_glGetFramebufferAttachmentParameteriv;
+        gl_info->fbo_ops.glBlitFramebuffer = gl_info->gl_ops.ext.p_glBlitFramebuffer;
+        gl_info->fbo_ops.glGenerateMipmap = gl_info->gl_ops.ext.p_glGenerateMipmap;
     }
     else
     {
         if (gl_info->supported[EXT_FRAMEBUFFER_OBJECT])
         {
-            gl_info->fbo_ops.glIsRenderbuffer = gl_info->glIsRenderbufferEXT;
-            gl_info->fbo_ops.glBindRenderbuffer = gl_info->glBindRenderbufferEXT;
-            gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->glDeleteRenderbuffersEXT;
-            gl_info->fbo_ops.glGenRenderbuffers = gl_info->glGenRenderbuffersEXT;
-            gl_info->fbo_ops.glRenderbufferStorage = gl_info->glRenderbufferStorageEXT;
-            gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->glGetRenderbufferParameterivEXT;
-            gl_info->fbo_ops.glIsFramebuffer = gl_info->glIsFramebufferEXT;
-            gl_info->fbo_ops.glBindFramebuffer = gl_info->glBindFramebufferEXT;
-            gl_info->fbo_ops.glDeleteFramebuffers = gl_info->glDeleteFramebuffersEXT;
-            gl_info->fbo_ops.glGenFramebuffers = gl_info->glGenFramebuffersEXT;
-            gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->glCheckFramebufferStatusEXT;
-            gl_info->fbo_ops.glFramebufferTexture1D = gl_info->glFramebufferTexture1DEXT;
-            gl_info->fbo_ops.glFramebufferTexture2D = gl_info->glFramebufferTexture2DEXT;
-            gl_info->fbo_ops.glFramebufferTexture3D = gl_info->glFramebufferTexture3DEXT;
-            gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->glFramebufferRenderbufferEXT;
-            gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv = gl_info->glGetFramebufferAttachmentParameterivEXT;
-            gl_info->fbo_ops.glGenerateMipmap = gl_info->glGenerateMipmapEXT;
+            gl_info->fbo_ops.glIsRenderbuffer = gl_info->gl_ops.ext.p_glIsRenderbufferEXT;
+            gl_info->fbo_ops.glBindRenderbuffer = gl_info->gl_ops.ext.p_glBindRenderbufferEXT;
+            gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->gl_ops.ext.p_glDeleteRenderbuffersEXT;
+            gl_info->fbo_ops.glGenRenderbuffers = gl_info->gl_ops.ext.p_glGenRenderbuffersEXT;
+            gl_info->fbo_ops.glRenderbufferStorage = gl_info->gl_ops.ext.p_glRenderbufferStorageEXT;
+            gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->gl_ops.ext.p_glGetRenderbufferParameterivEXT;
+            gl_info->fbo_ops.glIsFramebuffer = gl_info->gl_ops.ext.p_glIsFramebufferEXT;
+            gl_info->fbo_ops.glBindFramebuffer = gl_info->gl_ops.ext.p_glBindFramebufferEXT;
+            gl_info->fbo_ops.glDeleteFramebuffers = gl_info->gl_ops.ext.p_glDeleteFramebuffersEXT;
+            gl_info->fbo_ops.glGenFramebuffers = gl_info->gl_ops.ext.p_glGenFramebuffersEXT;
+            gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->gl_ops.ext.p_glCheckFramebufferStatusEXT;
+            gl_info->fbo_ops.glFramebufferTexture1D = gl_info->gl_ops.ext.p_glFramebufferTexture1DEXT;
+            gl_info->fbo_ops.glFramebufferTexture2D = gl_info->gl_ops.ext.p_glFramebufferTexture2DEXT;
+            gl_info->fbo_ops.glFramebufferTexture3D = gl_info->gl_ops.ext.p_glFramebufferTexture3DEXT;
+            gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->gl_ops.ext.p_glFramebufferRenderbufferEXT;
+            gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv
+                    = gl_info->gl_ops.ext.p_glGetFramebufferAttachmentParameterivEXT;
+            gl_info->fbo_ops.glGenerateMipmap = gl_info->gl_ops.ext.p_glGenerateMipmapEXT;
         }
         else if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
         {
@@ -2808,11 +2810,12 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
         }
         if (gl_info->supported[EXT_FRAMEBUFFER_BLIT])
         {
-            gl_info->fbo_ops.glBlitFramebuffer = gl_info->glBlitFramebufferEXT;
+            gl_info->fbo_ops.glBlitFramebuffer = gl_info->gl_ops.ext.p_glBlitFramebufferEXT;
         }
         if (gl_info->supported[EXT_FRAMEBUFFER_MULTISAMPLE])
         {
-            gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->glRenderbufferStorageMultisampleEXT;
+            gl_info->fbo_ops.glRenderbufferStorageMultisample
+                    = gl_info->gl_ops.ext.p_glRenderbufferStorageMultisampleEXT;
         }
     }
 
diff --git a/dlls/wined3d/gl_compat.c b/dlls/wined3d/gl_compat.c
index 5a1a15a..00948e2 100644
--- a/dlls/wined3d/gl_compat.c
+++ b/dlls/wined3d/gl_compat.c
@@ -350,18 +350,18 @@ void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info)
     if (!gl_info->supported[ARB_MULTITEXTURE])
     {
         TRACE("Applying GL_ARB_multitexture emulation hooks\n");
-        gl_info->glActiveTextureARB         = wine_glActiveTextureARB;
-        gl_info->glClientActiveTextureARB   = wine_glClientActiveTextureARB;
-        gl_info->glMultiTexCoord1fARB       = wine_glMultiTexCoord1fARB;
-        gl_info->glMultiTexCoord1fvARB      = wine_glMultiTexCoord1fvARB;
-        gl_info->glMultiTexCoord2fARB       = wine_glMultiTexCoord2fARB;
-        gl_info->glMultiTexCoord2fvARB      = wine_glMultiTexCoord2fvARB;
-        gl_info->glMultiTexCoord3fARB       = wine_glMultiTexCoord3fARB;
-        gl_info->glMultiTexCoord3fvARB      = wine_glMultiTexCoord3fvARB;
-        gl_info->glMultiTexCoord4fARB       = wine_glMultiTexCoord4fARB;
-        gl_info->glMultiTexCoord4fvARB      = wine_glMultiTexCoord4fvARB;
-        gl_info->glMultiTexCoord2svARB      = wine_glMultiTexCoord2svARB;
-        gl_info->glMultiTexCoord4svARB      = wine_glMultiTexCoord4svARB;
+        gl_info->gl_ops.ext.p_glActiveTextureARB        = wine_glActiveTextureARB;
+        gl_info->gl_ops.ext.p_glClientActiveTextureARB  = wine_glClientActiveTextureARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord1fARB      = wine_glMultiTexCoord1fARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord1fvARB     = wine_glMultiTexCoord1fvARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord2fARB      = wine_glMultiTexCoord2fARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord2fvARB     = wine_glMultiTexCoord2fvARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord3fARB      = wine_glMultiTexCoord3fARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord3fvARB     = wine_glMultiTexCoord3fvARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord4fARB      = wine_glMultiTexCoord4fARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord4fvARB     = wine_glMultiTexCoord4fvARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord2svARB     = wine_glMultiTexCoord2svARB;
+        gl_info->gl_ops.ext.p_glMultiTexCoord4svARB     = wine_glMultiTexCoord4svARB;
         if(old_multitex_glGetIntegerv) {
             FIXME("GL_ARB_multitexture glGetIntegerv hook already applied\n");
         } else {
@@ -516,26 +516,26 @@ void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info)
         if(old_fogcoord_glFogCoordfEXT) {
             FIXME("GL_EXT_fogcoord glFogCoordfEXT hook already applied\n");
         } else {
-            old_fogcoord_glFogCoordfEXT = gl_info->glFogCoordfEXT;
-            gl_info->glFogCoordfEXT = wine_glFogCoordfEXT;
+            old_fogcoord_glFogCoordfEXT = gl_info->gl_ops.ext.p_glFogCoordfEXT;
+            gl_info->gl_ops.ext.p_glFogCoordfEXT = wine_glFogCoordfEXT;
         }
         if(old_fogcoord_glFogCoordfvEXT) {
             FIXME("GL_EXT_fogcoord glFogCoordfvEXT hook already applied\n");
         } else {
-            old_fogcoord_glFogCoordfvEXT = gl_info->glFogCoordfvEXT;
-            gl_info->glFogCoordfvEXT = wine_glFogCoordfvEXT;
+            old_fogcoord_glFogCoordfvEXT = gl_info->gl_ops.ext.p_glFogCoordfvEXT;
+            gl_info->gl_ops.ext.p_glFogCoordfvEXT = wine_glFogCoordfvEXT;
         }
         if(old_fogcoord_glFogCoorddEXT) {
             FIXME("GL_EXT_fogcoord glFogCoorddEXT hook already applied\n");
         } else {
-            old_fogcoord_glFogCoorddEXT = gl_info->glFogCoorddEXT;
-            gl_info->glFogCoorddEXT = wine_glFogCoorddEXT;
+            old_fogcoord_glFogCoorddEXT = gl_info->gl_ops.ext.p_glFogCoorddEXT;
+            gl_info->gl_ops.ext.p_glFogCoorddEXT = wine_glFogCoorddEXT;
         }
         if(old_fogcoord_glFogCoorddvEXT) {
             FIXME("GL_EXT_fogcoord glFogCoorddvEXT hook already applied\n");
         } else {
-            old_fogcoord_glFogCoorddvEXT = gl_info->glFogCoorddvEXT;
-            gl_info->glFogCoorddvEXT = wine_glFogCoorddvEXT;
+            old_fogcoord_glFogCoorddvEXT = gl_info->gl_ops.ext.p_glFogCoorddvEXT;
+            gl_info->gl_ops.ext.p_glFogCoorddvEXT = wine_glFogCoorddvEXT;
         }
         gl_info->supported[EXT_FOG_COORD] = TRUE;
     }
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
index 2a67dff..761629a 100644
--- a/dlls/wined3d/wined3d_gl.h
+++ b/dlls/wined3d/wined3d_gl.h
@@ -46,12 +46,6 @@
 #ifndef __WINE_WINED3D_GL_H
 #define __WINE_WINED3D_GL_H
 
-#ifdef USE_WIN32_OPENGL
-#define WINE_GLAPI __stdcall
-#else
-#define WINE_GLAPI
-#endif
-
 /****************************************************
  * OpenGL 1.0/1.1/1.2/1.3
  *     types, #defines and function pointers
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 38f4147..5c31ff3 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -24,6 +24,12 @@
 #ifndef __WINE_WINED3D_PRIVATE_H
 #define __WINE_WINED3D_PRIVATE_H
 
+#ifdef USE_WIN32_OPENGL
+#define WINE_GLAPI __stdcall
+#else
+#define WINE_GLAPI
+#endif
+
 #include <stdarg.h>
 #include <math.h>
 #include <limits.h>
@@ -43,6 +49,7 @@
 #include "wined3d_gl.h"
 #include "wine/list.h"
 #include "wine/rbtree.h"
+#include "wine/wgl_driver.h"
 
 /* Driver quirks */
 #define WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT       0x00000001
@@ -799,7 +806,7 @@ extern int num_lock DECLSPEC_HIDDEN;
 
 /* GL related defines */
 /* ------------------ */
-#define GL_EXTCALL(f) (gl_info->f)
+#define GL_EXTCALL(f) (gl_info->gl_ops.ext.p_##f)
 
 #define D3DCOLOR_B_R(dw) (((dw) >> 16) & 0xff)
 #define D3DCOLOR_B_G(dw) (((dw) >>  8) & 0xff)
@@ -1503,13 +1510,8 @@ struct wined3d_gl_info
     BOOL supported[WINED3D_GL_EXT_COUNT];
     GLint wrap_lookup[WINED3D_TADDRESS_MIRROR_ONCE - WINED3D_TADDRESS_WRAP + 1];
 
+    struct opengl_funcs gl_ops;
     struct wined3d_fbo_ops fbo_ops;
-#define USE_GL_FUNC(type, pfn, ext, replace) type pfn;
-    /* GL function pointers */
-    GL_EXT_FUNCS_GEN
-    /* WGL function pointers */
-    WGL_EXT_FUNCS_GEN
-#undef USE_GL_FUNC
 
     struct wined3d_format *formats;
 };
-- 
1.7.8.6




More information about the wine-patches mailing list