Hi Alex, can you try this patch ?
Regards, Raphael > On Sun, Feb 20, 2005 at 01:43:44PM +0100, Lionel Ulmer wrote: > > Well, if you want just to test if the application works better, just add > > (stubbed) support for the following extensions: > > > > http://oss.sgi.com/projects/ogl-sample/registry/ARB/wgl_pixel_format.txt > > http://oss.sgi.com/projects/ogl-sample/registry/ARB/wgl_pbuffer.txt > > http://oss.sgi.com/projects/ogl-sample/registry/ARB/wgl_render_texture.tx > >t > > > > This entails: > > > > = adding the string for the extension in the WGL extension string (no > > idea if it needs to be duplicated also in the 'standard' extension > > string). = adding all functions that are described in the three preceding > > extensions (having them returning correct values) and printing debug > > output = run the game again and see if it actually uses now these > > functions and if it works better (ie better in 'not crashing', not better > > as in 'working' > > > > :-) ). > > Well, I've given it a try, but they're either not getting called, or I > haven't implemented them correctly (first time hacking wine). I've > included a patch below showing what I've done. A few of them don't > return nice values, but I figured it should get to the traces if they > are getting called. > > > > I guess it's not just a case of passing through like the bulk of the > > > opengl functions or they'd be done already. > > > > For PBuffers, the WGL and SGIX interface is a bit different so an > > adaptation is required. For 'render to texture', one needs to use > > 'GL_EXT_framebuffer_object' (or PBuffers) to emulate the extension. > > > > So this is not the 'simple' thunking that most of the rest of the OpenGL > > implementation is... > > Well, if I can confirm that some of the functions are getting called, I > may as well have a go at it ;) > > Thanks for your help. > > Index: opengl32.spec > =================================================================== > RCS file: /home/wine/wine/dlls/opengl32/opengl32.spec,v > retrieving revision 1.23 > diff -u -r1.23 opengl32.spec > --- opengl32.spec 7 Feb 2004 01:29:33 -0000 1.23 > +++ opengl32.spec 20 Feb 2005 16:09:21 -0000 > @@ -24,6 +24,17 @@ > @ stdcall wglGetPixelFormat(long) gdi32.GetPixelFormat > @ stdcall wglSetPixelFormat(long long ptr) gdi32.SetPixelFormat > @ stdcall wglSwapBuffers(long) gdi32.SwapBuffers > +@ stdcall wglGetPixelFormatAttribivARB(ptr long long long ptr ptr) > +@ stdcall wglGetPixelFormatAttribfvARB(ptr long long long ptr ptr) > +@ stdcall wglChoosePixelFormatARB(ptr ptr ptr long ptr ptr) > +@ stdcall wglCreatePbufferARB(ptr long long long ptr) > +@ stdcall wglGetPbufferDCARB(ptr) > +@ stdcall wglReleasePbufferDCARB(ptr ptr) > +@ stdcall wglDestroyPbufferARB(ptr) > +@ stdcall wglQueryPbufferARB(ptr long long) > +@ stdcall wglBindTexImageARB(ptr long) > +@ stdcall wglReleaseTexImageARB(ptr long) > +@ stdcall wglSetPbufferAttribARB(ptr ptr) > @ stdcall glAccum( long long ) wine_glAccum > @ stdcall glAlphaFunc( long long ) wine_glAlphaFunc > @ stdcall glAreTexturesResident( long ptr ptr ) > wine_glAreTexturesResident Index: wgl_ext.c > =================================================================== > RCS file: /home/wine/wine/dlls/opengl32/wgl_ext.c,v > retrieving revision 1.2 > diff -u -r1.2 wgl_ext.c > --- wgl_ext.c 31 Jan 2005 11:32:13 -0000 1.2 > +++ wgl_ext.c 20 Feb 2005 16:09:43 -0000 > @@ -39,7 +39,7 @@ > > /* Some WGL extensions... */ > static const char *WGL_extensions_base = "WGL_ARB_extensions_string > WGL_EXT_extensions_string"; -static char *WGL_extensions = NULL; > +static char *WGL_extensions = "WGL_ARB_pixel_format WGL_ARB_pbuffer > WGL_ARB_render_texture"; > > /* Extensions-query functions */ > BOOL query_function_pbuffers(const char *gl_version, const char > *gl_extensions, const char *glx_extensions, @@ -143,11 +143,89 @@ > } > } > > +GLboolean WINAPI wglGetPixelFormatAttribivARB(HDC hdc, int iPixelFormat, > int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues) > +{ > + TRACE("(%p, %d, %d, %d, %p, %p)\n", hdc, iPixelFormat, iLayerPlane, > nAttributes, piAttributes, piValues); + return GL_TRUE; > +} > + > +GLboolean WINAPI wglGetPixelFormatAttribfvARB(HDC hdc, int iPixelFormat, > int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT > *pfValues) +{ > + TRACE("(%p, %d, %d, %d, %p, %p)\n", hdc, iPixelFormat, iLayerPlane, > nAttributes, piAttributes, pfValues); + return GL_TRUE; > +} > + > +GLboolean WINAPI wglChoosePixelFormatARB(HDC hdc, const int > *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int > *piFormats, UINT *nNumFormats) +{ > + TRACE("(%p, %p, %p, %d, %p, %p)\n", hdc, piAttribIList, pfAttribFList, > nMaxFormats, piFormats, nNumFormats); + return GL_TRUE; > +} > + > +#define HPBUFFERARB void * > +HPBUFFERARB WINAPI wglCreatePbufferARB(HDC hdc, int iPixelFormat, int > iWidth, int iHeight, const int *piAttribList) +{ > + TRACE("(%p, %d, %d, %d, %p)\n", hdc, iPixelFormat, iWidth, iHeight, > piAttribList); + return 0; > +} > + > +HDC WINAPI wglGetPbufferDCARB(HPBUFFERARB hPbuffer) > +{ > + TRACE("(%p)\n", hPbuffer); > + return 0; > +} > + > +int WINAPI wglReleasePbufferDCARB(HPBUFFERARB hPbuffer, HDC hdc) > +{ > + TRACE("(%p, %p)\n", hPbuffer, hdc); > + return 0; > +} > + > +GLboolean WINAPI wglDestroyPbufferARB(HPBUFFERARB hPbuffer) > +{ > + TRACE("(%p)\n", hPbuffer); > + return GL_TRUE; > +} > + > +GLboolean WINAPI wglQueryPbufferARB(HPBUFFERARB hPbuffer, int iAttribute, > int *piValue) +{ > + TRACE("(%p, %d, %p)\n", hPbuffer, iAttribute, piValue); > + return GL_TRUE; > +} > + > +GLboolean WINAPI wglBindTexImageARB(HPBUFFERARB hPbuffer, int iBuffer) > +{ > + TRACE("(%p, %d)\n", hPbuffer, iBuffer); > + return GL_TRUE; > +} > + > +GLboolean WINAPI wglReleaseTexImageARB(HPBUFFERARB hPbuffer, int iBuffer) > +{ > + TRACE("(%p, %d)\n", hPbuffer, iBuffer); > + return GL_TRUE; > +} > + > +GLboolean WINAPI wglSetPbufferAttribARB(HPBUFFERARB hPbuffer, const int > *piAttribList) +{ > + TRACE("(%p, %p)\n", hPbuffer, piAttribList); > + return GL_TRUE; > +} > + > /* Putting this at the end to prevent having to write the prototypes :-) > */ WGL_extension wgl_extension_registry[] = { > { "wglGetExtensionsStringARB", (void *) wglGetExtensionsStringARB, > NULL, NULL}, { "wglGetExtensionsStringEXT", (void *) > wglGetExtensionsStringEXT, NULL, NULL}, { "wglGetSwapIntervalEXT", (void *) > wglSwapIntervalEXT, NULL, NULL}, - { "wglSwapIntervalEXT", (void *) > wglSwapIntervalEXT, NULL, NULL} + { "wglSwapIntervalEXT", (void *) > wglSwapIntervalEXT, NULL, NULL}, + { "wglGetPixelFormatAttribivARB", > (void *) wglGetPixelFormatAttribivARB, NULL, NULL}, + { > "wglGetPixelFormatAttribfvARB", (void *) wglGetPixelFormatAttribfvARB, > NULL, NULL}, + { "wglChoosePixelFormatARB", (void *) > wglChoosePixelFormatARB, NULL, NULL}, + { "wglCreatePbufferARB", (void > *) wglCreatePbufferARB, NULL, NULL}, + { "wglGetPbufferDCARB", (void *) > wglGetPbufferDCARB, NULL, NULL}, + { "wglReleasePbufferDCARB", (void *) > wglReleasePbufferDCARB, NULL, NULL}, + { "wglDestroyPbufferARB", (void > *) wglDestroyPbufferARB, NULL, NULL}, + { "wglQueryPbufferARB", (void *) > wglQueryPbufferARB, NULL, NULL}, + { "wglBindTexImageARB", (void *) > wglBindTexImageARB, NULL, NULL}, + { "wglReleaseTexImageARB", (void *) > wglReleaseTexImageARB, NULL, NULL}, + { "wglSetPbufferAttribARB", (void > *) wglSetPbufferAttribARB, NULL, NULL} }; > int wgl_extension_registry_size = sizeof(wgl_extension_registry) / > sizeof(wgl_extension_registry[0]);
Index: wgl_ext.c
===================================================================
RCS file: /home/wine/wine/dlls/opengl32/wgl_ext.c,v
retrieving revision 1.2
diff -u -r1.2 wgl_ext.c
--- wgl_ext.c 31 Jan 2005 11:32:13 -0000 1.2
+++ wgl_ext.c 21 Feb 2005 08:32:21 -0000
@@ -42,8 +42,26 @@
static char *WGL_extensions = NULL;
/* Extensions-query functions */
-BOOL query_function_pbuffers(const char *gl_version, const char *gl_extensions, const char *glx_extensions,
- const char *server_glx_extensions, const char *client_glx_extensions)
+BOOL query_function_multisample(const char *gl_version, const char *gl_extensions, const char *glx_extensions,
+ const char *server_glx_extensions, const char *client_glx_extensions)
+{
+ return NULL != strstr("GLX_ARB_multisample", glx_extensions);
+}
+
+BOOL query_function_pbuffer(const char *gl_version, const char *gl_extensions, const char *glx_extensions,
+ const char *server_glx_extensions, const char *client_glx_extensions)
+{
+ return 0 <= strcmp("1.3", gl_version) || NULL != strstr("GLX_SGIX_pbuffer", glx_extensions);
+}
+
+BOOL query_function_pixel_format(const char *gl_version, const char *gl_extensions, const char *glx_extensions,
+ const char *server_glx_extensions, const char *client_glx_extensions)
+{
+ return FALSE;
+}
+
+BOOL query_function_render_texture(const char *gl_version, const char *gl_extensions, const char *glx_extensions,
+ const char *server_glx_extensions, const char *client_glx_extensions)
{
return FALSE;
}
@@ -86,12 +104,90 @@
return swap_interval;
}
+typedef struct wine_glpbuffer {
+ Drawable drawable;
+ int pixelFormat;
+ int width;
+ int height;
+ int* attribList;
+} Wine_GLPBuffer;
+
+GLboolean WINAPI wglGetPixelFormatAttribivARB(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues)
+{
+ TRACE("(%p, %d, %d, %d, %p, %p)\n", hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues);
+ return GL_TRUE;
+}
+
+GLboolean WINAPI wglGetPixelFormatAttribfvARB(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues)
+{
+ TRACE("(%p, %d, %d, %d, %p, %p)\n", hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues);
+ return GL_TRUE;
+}
+
+GLboolean WINAPI wglChoosePixelFormatARB(HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats)
+{
+ TRACE("(%p, %p, %p, %d, %p, %p)\n", hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats);
+ return GL_TRUE;
+}
+
+#define HPBUFFERARB void *
+HPBUFFERARB WINAPI wglCreatePbufferARB(HDC hdc, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList)
+{
+ TRACE("(%p, %d, %d, %d, %p)\n", hdc, iPixelFormat, iWidth, iHeight, piAttribList);
+ return 0;
+}
+
+HDC WINAPI wglGetPbufferDCARB(HPBUFFERARB hPbuffer)
+{
+ TRACE("(%p)\n", hPbuffer);
+ return 0;
+}
+
+int WINAPI wglReleasePbufferDCARB(HPBUFFERARB hPbuffer, HDC hdc)
+{
+ TRACE("(%p, %p)\n", hPbuffer, hdc);
+ return 0;
+}
+
+GLboolean WINAPI wglDestroyPbufferARB(HPBUFFERARB hPbuffer)
+{
+ TRACE("(%p)\n", hPbuffer);
+ return GL_TRUE;
+}
+
+GLboolean WINAPI wglQueryPbufferARB(HPBUFFERARB hPbuffer, int iAttribute, int *piValue)
+{
+ TRACE("(%p, %d, %p)\n", hPbuffer, iAttribute, piValue);
+ return GL_TRUE;
+}
+
+GLboolean WINAPI wglBindTexImageARB(HPBUFFERARB hPbuffer, int iBuffer)
+{
+ TRACE("(%p, %d)\n", hPbuffer, iBuffer);
+ return GL_TRUE;
+}
+
+GLboolean WINAPI wglReleaseTexImageARB(HPBUFFERARB hPbuffer, int iBuffer)
+{
+ TRACE("(%p, %d)\n", hPbuffer, iBuffer);
+ return GL_TRUE;
+}
+
+GLboolean WINAPI wglSetPbufferAttribARB(HPBUFFERARB hPbuffer, const int *piAttribList)
+{
+ TRACE("(%p, %p)\n", hPbuffer, piAttribList);
+ return GL_TRUE;
+}
+
static const struct {
const char *name;
BOOL (*query_function)(const char *gl_version, const char *gl_extensions, const char *glx_extensions,
const char *server_glx_extensions, const char *client_glx_extensions);
} extension_list[] = {
- { "WGL_ARB_pbuffer", query_function_pbuffers }
+ { "WGL_ARB_multisample", query_function_multisample },
+ { "WGL_ARB_pbuffer", query_function_pbuffer },
+ { "WGL_ARB_pixel_format" , query_function_pixel_format },
+ { "WGL_ARB_render_texture", query_function_render_texture }
};
/* Used to initialize the WGL extension string at DLL loading */
@@ -148,6 +244,17 @@
{ "wglGetExtensionsStringARB", (void *) wglGetExtensionsStringARB, NULL, NULL},
{ "wglGetExtensionsStringEXT", (void *) wglGetExtensionsStringEXT, NULL, NULL},
{ "wglGetSwapIntervalEXT", (void *) wglSwapIntervalEXT, NULL, NULL},
- { "wglSwapIntervalEXT", (void *) wglSwapIntervalEXT, NULL, NULL}
+ { "wglSwapIntervalEXT", (void *) wglSwapIntervalEXT, NULL, NULL},
+ { "wglGetPixelFormatAttribivARB", (void *) wglGetPixelFormatAttribivARB, NULL, NULL},
+ { "wglGetPixelFormatAttribfvARB", (void *) wglGetPixelFormatAttribfvARB, NULL, NULL},
+ { "wglChoosePixelFormatARB", (void *) wglChoosePixelFormatARB, NULL, NULL},
+ { "wglCreatePbufferARB", (void *) wglCreatePbufferARB, NULL, NULL},
+ { "wglGetPbufferDCARB", (void *) wglGetPbufferDCARB, NULL, NULL},
+ { "wglReleasePbufferDCARB", (void *) wglReleasePbufferDCARB, NULL, NULL},
+ { "wglDestroyPbufferARB", (void *) wglDestroyPbufferARB, NULL, NULL},
+ { "wglQueryPbufferARB", (void *) wglQueryPbufferARB, NULL, NULL},
+ { "wglBindTexImageARB", (void *) wglBindTexImageARB, NULL, NULL},
+ { "wglReleaseTexImageARB", (void *) wglReleaseTexImageARB, NULL, NULL},
+ { "wglSetPbufferAttribARB", (void *) wglSetPbufferAttribARB, NULL, NULL}
};
int wgl_extension_registry_size = sizeof(wgl_extension_registry) / sizeof(wgl_extension_registry[0]);
pgpsyDIQE8F5Y.pgp
Description: PGP signature
