[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