From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/unix_wgl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 4771205a47e..75f879de93f 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -140,6 +140,8 @@ static HGLRC wrap_wglCreateContext( HDC hdc ) return ret; }
+static BOOL wrap_wglMakeCurrent( HDC hdc, HGLRC hglrc ); + static BOOL wrap_wglDeleteContext( HGLRC hglrc ) { struct wgl_handle *ptr = get_handle_ptr( hglrc, HANDLE_CONTEXT ); @@ -152,7 +154,7 @@ static BOOL wrap_wglDeleteContext( HGLRC hglrc ) release_handle_ptr( ptr ); return FALSE; } - if (hglrc == NtCurrentTeb()->glCurrentRC) wglMakeCurrent( 0, 0 ); + if (hglrc == NtCurrentTeb()->glCurrentRC) wrap_wglMakeCurrent( 0, 0 ); ptr->funcs->wgl.p_wglDeleteContext( ptr->u.context->drv_ctx ); HeapFree( GetProcessHeap(), 0, ptr->u.context->disabled_exts ); HeapFree( GetProcessHeap(), 0, ptr->u.context->extensions );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/make_opengl | 10 ++-- dlls/opengl32/private.h | 41 ++++++++++++++ dlls/opengl32/thunks.c | 5 +- .../opengl32/{opengl_ext.h => unix_private.h} | 53 ++++++++----------- dlls/opengl32/unix_thunks.c | 3 +- dlls/opengl32/unix_wgl.c | 3 +- dlls/opengl32/wgl.c | 12 ++--- 7 files changed, 78 insertions(+), 49 deletions(-) create mode 100644 dlls/opengl32/private.h rename dlls/opengl32/{opengl_ext.h => unix_private.h} (60%)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 78368ec6c2f..79b10955f95 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -871,8 +871,8 @@ print OUT "#include "windef.h"\n"; print OUT "#include "winbase.h"\n"; print OUT "#include "wingdi.h"\n\n";
-print OUT "#include "unixlib.h"\n\n"; -print OUT "#include "opengl_ext.h"\n\n"; +print OUT "#include "unixlib.h"\n"; +print OUT "#include "private.h"\n\n"; print OUT "#include "wine/debug.h"\n\n"; print OUT "WINE_DEFAULT_DEBUG_CHANNEL(opengl);\n";
@@ -907,7 +907,7 @@ foreach (sort keys %ext_functions) # Then the table giving the string <-> function correspondence */ my $count = keys %ext_functions; print OUT "\nconst int extension_registry_size = $count;\n"; -print OUT "const OpenGL_extension extension_registry[$count] =\n"; +print OUT "const struct opengl_extension_desc extension_registry[$count] =\n"; print OUT "{\n"; foreach (sort keys %ext_functions) { @@ -933,8 +933,8 @@ print OUT "#include "windef.h"\n"; print OUT "#include "winbase.h"\n"; print OUT "#include "wingdi.h"\n\n";
-print OUT "#include "unixlib.h"\n\n"; -print OUT "#include "opengl_ext.h"\n\n"; +print OUT "#include "unixlib.h"\n"; +print OUT "#include "unix_private.h"\n\n";
foreach (sort keys %wgl_functions) { diff --git a/dlls/opengl32/private.h b/dlls/opengl32/private.h new file mode 100644 index 00000000000..e8cf32231f9 --- /dev/null +++ b/dlls/opengl32/private.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2000 Lionel Ulmer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ +#ifndef __WINE_OPENGL32_PRIVATE_H +#define __WINE_OPENGL32_PRIVATE_H + +#include <stdarg.h> +#include <stddef.h> + +#include "ntstatus.h" +#define WIN32_NO_STATUS +#include "windef.h" +#include "winbase.h" + +struct opengl_extension_desc +{ + const char *name; /* name of the extension */ + const char *extension; /* name of the GL/WGL extension */ + void *func; /* pointer to the Wine function for this extension */ +}; + +extern const struct opengl_extension_desc extension_registry[] DECLSPEC_HIDDEN; +extern const int extension_registry_size DECLSPEC_HIDDEN; + +extern int WINAPI wglDescribePixelFormat( HDC hdc, int ipfd, UINT cjpfd, PIXELFORMATDESCRIPTOR *ppfd ); + +#endif /* __WINE_OPENGL32_PRIVATE_H */ diff --git a/dlls/opengl32/thunks.c b/dlls/opengl32/thunks.c index a2a78bff97d..955168e2004 100644 --- a/dlls/opengl32/thunks.c +++ b/dlls/opengl32/thunks.c @@ -10,8 +10,7 @@ #include "wingdi.h"
#include "unixlib.h" - -#include "opengl_ext.h" +#include "private.h"
#include "wine/debug.h"
@@ -24466,7 +24465,7 @@ extern const GLubyte * WINAPI glGetStringi( GLenum name, GLuint index ) DECLSPEC extern HDC WINAPI wglGetCurrentReadDCARB(void) DECLSPEC_HIDDEN;
const int extension_registry_size = 2694; -const OpenGL_extension extension_registry[2694] = +const struct opengl_extension_desc extension_registry[2694] = { { "glAccumxOES", "GL_OES_fixed_point", glAccumxOES }, { "glAcquireKeyedMutexWin32EXT", "GL_EXT_win32_keyed_mutex", glAcquireKeyedMutexWin32EXT }, diff --git a/dlls/opengl32/opengl_ext.h b/dlls/opengl32/unix_private.h similarity index 60% rename from dlls/opengl32/opengl_ext.h rename to dlls/opengl32/unix_private.h index 2a579e142b6..0b365697b2b 100644 --- a/dlls/opengl32/opengl_ext.h +++ b/dlls/opengl32/unix_private.h @@ -1,27 +1,28 @@ -/* Typedefs for extensions loading - - Copyright (c) 2000 Lionel Ulmer -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; either -* version 2.1 of the License, or (at your option) any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA -*/ -#ifndef __DLLS_OPENGL32_OPENGL_EXT_H -#define __DLLS_OPENGL32_OPENGL_EXT_H +/* + * Copyright (c) 2000 Lionel Ulmer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ +#ifndef __WINE_OPENGL32_UNIX_PRIVATE_H +#define __WINE_OPENGL32_UNIX_PRIVATE_H
#include <stdarg.h> #include <stddef.h>
+#include "ntstatus.h" +#define WIN32_NO_STATUS #include "windef.h" #include "winbase.h" #include "winternl.h" @@ -30,14 +31,6 @@ #include "wine/wgl.h" #include "wine/wgl_driver.h"
-typedef struct { - const char *name; /* name of the extension */ - const char *extension; /* name of the GL/WGL extension */ - void *func; /* pointer to the Wine function for this extension */ -} OpenGL_extension; - -extern const OpenGL_extension extension_registry[] DECLSPEC_HIDDEN; -extern const int extension_registry_size DECLSPEC_HIDDEN; extern struct opengl_funcs null_opengl_funcs DECLSPEC_HIDDEN;
static inline struct opengl_funcs *get_dc_funcs( HDC hdc ) @@ -99,6 +92,4 @@ static inline enum wgl_handle_type get_current_context_type(void) return LOWORD(NtCurrentTeb()->glCurrentRC) & HANDLE_TYPE_MASK; }
-extern int WINAPI wglDescribePixelFormat( HDC hdc, int ipfd, UINT cjpfd, PIXELFORMATDESCRIPTOR *ppfd ); - -#endif /* __DLLS_OPENGL32_OPENGL_EXT_H */ +#endif /* __WINE_OPENGL32_UNIX_PRIVATE_H */ diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 86af754b278..84fe350ded8 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -10,8 +10,7 @@ #include "wingdi.h"
#include "unixlib.h" - -#include "opengl_ext.h" +#include "unix_private.h"
extern NTSTATUS wgl_wglCopyContext( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS wgl_wglCreateContext( void *args ) DECLSPEC_HIDDEN; diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 75f879de93f..8aa07ac1da6 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -29,9 +29,8 @@ #include "winbase.h" #include "ntuser.h"
-#include "opengl_ext.h" - #include "unixlib.h" +#include "unix_private.h"
#include "wine/debug.h"
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index d5b0a78b916..f4ab29e0356 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -31,9 +31,9 @@ #include "winreg.h" #include "ntuser.h"
-#include "opengl_ext.h" - #include "unixlib.h" +#include "unix_private.h" +#include "private.h"
#include "wine/glu.h" #include "wine/debug.h" @@ -516,8 +516,8 @@ const GLubyte * WINAPI glGetStringi(GLenum name, GLuint index) }
static int compar(const void *elt_a, const void *elt_b) { - return strcmp(((const OpenGL_extension *) elt_a)->name, - ((const OpenGL_extension *) elt_b)->name); + return strcmp( ((const struct opengl_extension_desc *)elt_a)->name, + ((const struct opengl_extension_desc *)elt_b)->name ); }
/* Check if a GL extension is supported */ @@ -623,8 +623,8 @@ PROC WINAPI wglGetProcAddress( LPCSTR name ) { struct opengl_funcs *funcs = NtCurrentTeb()->glTable; void **func_ptr; - OpenGL_extension ext; - const OpenGL_extension *ext_ret; + struct opengl_extension_desc ext; + const struct opengl_extension_desc *ext_ret;
if (!name) return NULL;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/private.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/opengl32/private.h b/dlls/opengl32/private.h index e8cf32231f9..3939ad8ff53 100644 --- a/dlls/opengl32/private.h +++ b/dlls/opengl32/private.h @@ -25,6 +25,7 @@ #define WIN32_NO_STATUS #include "windef.h" #include "winbase.h" +#include "wingdi.h"
struct opengl_extension_desc {
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/unix_wgl.c | 10 ++++++++ dlls/opengl32/wgl.c | 50 ++++++++++++++++++---------------------- 2 files changed, 32 insertions(+), 28 deletions(-)
diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 8aa07ac1da6..9f1cb88df75 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -478,6 +478,16 @@ NTSTATUS wgl_wglDeleteContext( void *args ) return STATUS_SUCCESS; }
+NTSTATUS wgl_wglGetProcAddress( void *args ) +{ + struct wglGetProcAddress_params *params = args; + const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; + /* index where to keep the pointer is in the otherwise unused ret argument */ + void **func_ptr = (void **)&funcs->ext + (UINT_PTR)params->ret; + *func_ptr = funcs->wgl.p_wglGetProcAddress( params->lpszProc ); + return *func_ptr ? STATUS_SUCCESS : STATUS_NOT_FOUND; +} + NTSTATUS wgl_wglMakeCurrent( void *args ) { struct wglMakeCurrent_params *params = args; diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index f4ab29e0356..2e85e639f51 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -621,10 +621,13 @@ static BOOL is_extension_supported( const char *extension ) */ PROC WINAPI wglGetProcAddress( LPCSTR name ) { - struct opengl_funcs *funcs = NtCurrentTeb()->glTable; - void **func_ptr; + struct wglGetProcAddress_params args = + { + .lpszProc = name, + }; struct opengl_extension_desc ext; const struct opengl_extension_desc *ext_ret; + NTSTATUS status;
if (!name) return NULL;
@@ -645,37 +648,28 @@ PROC WINAPI wglGetProcAddress( LPCSTR name ) return NULL; }
- func_ptr = (void **)&funcs->ext + (ext_ret - extension_registry); - if (!*func_ptr) + /* provide the index where to keep the pointer in the otherwise unused ret argument */ + args.ret = (void *)(UINT_PTR)(ext_ret - extension_registry); + if ((status = UNIX_CALL( wglGetProcAddress, &args ))) WARN( "wglGetProcAddres %s returned %#x\n", debugstr_a(name), status ); + else if (!is_extension_supported( ext_ret->extension )) { - void *driver_func = funcs->wgl.p_wglGetProcAddress( name ); - - if (!is_extension_supported(ext_ret->extension)) + unsigned int i; + static const struct { const char *name, *alt; } alternatives[] = { - unsigned int i; - static const struct { const char *name, *alt; } alternatives[] = - { - { "glCopyTexSubImage3DEXT", "glCopyTexSubImage3D" }, /* needed by RuneScape */ - { "glVertexAttribDivisor", "glVertexAttribDivisorARB"}, /* needed by Caffeine */ - }; - - for (i = 0; i < ARRAY_SIZE(alternatives); i++) - { - if (strcmp( name, alternatives[i].name )) continue; - WARN("Extension %s required for %s not supported, trying %s\n", - ext_ret->extension, name, alternatives[i].alt ); - return wglGetProcAddress( alternatives[i].alt ); - } - WARN("Extension %s required for %s not supported\n", ext_ret->extension, name); - return NULL; - } + { "glCopyTexSubImage3DEXT", "glCopyTexSubImage3D" }, /* needed by RuneScape */ + { "glVertexAttribDivisor", "glVertexAttribDivisorARB"}, /* needed by Caffeine */ + };
- if (driver_func == NULL) + for (i = 0; i < ARRAY_SIZE(alternatives); i++) { - WARN("Function %s not supported by driver\n", name); - return NULL; + if (strcmp( name, alternatives[i].name )) continue; + WARN( "Extension %s required for %s not supported, trying %s\n", ext_ret->extension, + name, alternatives[i].alt ); + return wglGetProcAddress( alternatives[i].alt ); } - *func_ptr = driver_func; + + WARN( "Extension %s required for %s not supported\n", ext_ret->extension, name ); + return NULL; }
TRACE("returning %s -> %p\n", name, ext_ret->func);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/wgl.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 2e85e639f51..3b3eed46faf 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -487,15 +487,17 @@ void WINAPI glGetIntegerv(GLenum pname, GLint *data)
const GLubyte * WINAPI glGetStringi(GLenum name, GLuint index) { - const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; + struct glGetStringi_params args = + { + .name = name, + .index = index, + }; + NTSTATUS status;
TRACE("(%d, %d)\n", name, index); - if (!funcs->ext.p_glGetStringi) - { - void **func_ptr = (void **)&funcs->ext.p_glGetStringi;
- *func_ptr = funcs->wgl.p_wglGetProcAddress("glGetStringi"); - } + /* make sure unix pointer is loaded */ + if (!wglGetProcAddress( "glGetStringi" )) return NULL;
if (name == GL_EXTENSIONS) { @@ -509,10 +511,13 @@ const GLubyte * WINAPI glGetStringi(GLenum name, GLuint index)
while (index + disabled_count >= *disabled_exts++) disabled_count++; - return funcs->ext.p_glGetStringi(name, index + disabled_count); + + args.index = index + disabled_count; } } - return funcs->ext.p_glGetStringi(name, index); + + if ((status = UNIX_CALL( glGetStringi, &args ))) WARN( "glGetStringi returned %#x\n", status ); + return args.ret; }
static int compar(const void *elt_a, const void *elt_b) {
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/wgl.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 3b3eed46faf..4cde6b9e072 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -383,20 +383,21 @@ static GLubyte *filter_extensions_list( const char *extensions, const char *disa
static GLuint *filter_extensions_index( const char *disabled ) { - const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; GLuint *disabled_index; GLint extensions_count; unsigned int i = 0, j; const char *ext; + NTSTATUS status;
- if (!funcs->ext.p_glGetStringi) + struct glGetIntegerv_params glGetIntegerv_params = { - void **func_ptr = (void **)&funcs->ext.p_glGetStringi; - *func_ptr = funcs->wgl.p_wglGetProcAddress( "glGetStringi" ); - if (!funcs->ext.p_glGetStringi) return NULL; - } + .pname = GL_NUM_EXTENSIONS, + .data = &extensions_count, + }; + + if (!wglGetProcAddress( "glGetStringi" )) return NULL; + if ((status = UNIX_CALL( glGetIntegerv, &glGetIntegerv_params ))) WARN( "glGetIntegerv returned %#x\n", status );
- funcs->gl.p_glGetIntegerv( GL_NUM_EXTENSIONS, &extensions_count ); disabled_index = HeapAlloc( GetProcessHeap(), 0, extensions_count * sizeof(*disabled_index) ); if (!disabled_index) return NULL;
@@ -404,7 +405,14 @@ static GLuint *filter_extensions_index( const char *disabled )
for (j = 0; j < extensions_count; ++j) { - ext = (const char *)funcs->ext.p_glGetStringi( GL_EXTENSIONS, j ); + struct glGetStringi_params glGetStringi_params = + { + .name = GL_EXTENSIONS, + .index = j, + }; + if ((status = UNIX_CALL( glGetStringi, &glGetStringi_params ))) WARN( "glGetStringi returned %#x\n", status ); + ext = (const char *)glGetStringi_params.ret; + if (!has_extension( disabled, ext, strlen( ext ) )) { TRACE( "++ %s\n", ext ); @@ -528,7 +536,6 @@ static int compar(const void *elt_a, const void *elt_b) { /* Check if a GL extension is supported */ static BOOL check_extension_support( const char *extension, const char *available_extensions ) { - const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; size_t len;
TRACE("Checking for extension '%s'\n", extension); @@ -550,7 +557,7 @@ static BOOL check_extension_support( const char *extension, const char *availabl * Check if we are searching for a core GL function */ if (!strncmp( extension, "GL_VERSION_", 11 )) { - const GLubyte *gl_version = funcs->gl.p_glGetString(GL_VERSION); + const GLubyte *gl_version = glGetString( GL_VERSION ); const char *version = extension + 11; /* Move past 'GL_VERSION_' */
if (!gl_version)
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=125840
Your paranoid android.
=== debian11 (32 bit report) ===
amstream: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d2d1: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3d10core: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3d10_1: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3d10: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3d11: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3d12: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3d8: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3d9: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dcompiler_43: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dcompiler_46: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dcompiler_47: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3drm: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_34: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_35: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_36: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_37: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_38: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_39: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_40: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_41: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_42: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx10_43: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
d3dx9_36: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
ddrawex: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
ddraw: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
dxdiagn: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
dxgi: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
dxva2: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
evr: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
mfmediaengine: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
mfplat: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
mfreadwrite: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
mf: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
opengl32: opengl.c:1982: Test failed: wglGetExtensionsStringARB is not available
quartz: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000). Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
wbemprox: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
winmm: Unhandled exception: page fault on execute access to 0x00000000 in 32-bit code (0x00000000).
=== debian11 (32 bit zh:CN report) ===
opengl32: opengl.c:1982: Test failed: wglGetExtensionsStringARB is not available
=== debian11b (64 bit WoW report) ===
opengl32: opengl.c:1982: Test failed: wglGetExtensionsStringARB is not available
I think I borked it with some last minute changes. I'll make another version.