271 lines
9.6 KiB
Plaintext
271 lines
9.6 KiB
Plaintext
I What is needed to have OpenGL support in Wine
|
|
===============================================
|
|
|
|
Basically, if you have a Linux OpenGL ABI compliant libGL
|
|
(http://oss.sgi.com/projects/ogl-sample/ABI/) installed on your
|
|
computer, you should everything that is needed.
|
|
|
|
To be more clear, I will detail one step after another what the
|
|
configure script checks.
|
|
|
|
If, after Wine compiles, OpenGL support is not compiled in, you can
|
|
always check 'config.log' to see which of the following points failed.
|
|
|
|
I.1 Header files
|
|
----------------
|
|
|
|
The needed header files to build OpenGL support in Wine are :
|
|
|
|
- gl.h : the definition of all OpenGL core functions, types and
|
|
enumerants
|
|
|
|
- glx.h : how OpenGL integrates in the X Window environment
|
|
|
|
- glext.h : the list of all registered OpenGL extensions
|
|
|
|
The latter file (glext.h) is, as of now, not necessary to build
|
|
Wine. But as this file can be easily obtained from SGI
|
|
(http://oss.sgi.com/projects/ogl-sample/ABI/glext.h), and that all
|
|
OpenGL should provide one, I decided to keep it here.
|
|
|
|
|
|
I.2 OpenGL library thread-safety
|
|
--------------------------------
|
|
|
|
After that, the script checks if the OpenGL library relies or not on
|
|
the pthread library to provide thread safety (most 'modern' OpenGL
|
|
libraries do).
|
|
|
|
If the OpenGL library explicitely links in libpthread (you can check
|
|
it with a 'ldd libGL.so'), you need to force OpenGL support by
|
|
starting configure with the '--enable-opengl' flag.
|
|
|
|
The reason to this is that Wine contains some hacks done by Ove to
|
|
cohabit with pthread that are known to work well in most of the cases
|
|
(glibc 2.1.x). On the other hand, we never got Wine to work with glibc
|
|
2.0.6. Thus, I deemed preferable to play it safe : by default, I
|
|
suppose that the hack won't work and that it's the user's
|
|
responsability to enable it.
|
|
|
|
Anyway, it should be pretty safe to build with '--enable-opengl'.
|
|
|
|
|
|
I.3 OpenGL library itself
|
|
-------------------------
|
|
|
|
To check for the presence of 'libGL' on the system, the script checks
|
|
if it defines the 'glXCreateContext' function. There should be no
|
|
problem here.
|
|
|
|
|
|
I.4 glXGetProcAddressARB function
|
|
---------------------------------
|
|
|
|
The core of Wine's OpenGL implementation (at least for all extensions)
|
|
is the glXGetProcAddressARB function. Your OpenGL library needs to
|
|
have this function defined for Wine to be able to support OpenGL.
|
|
|
|
If your library does not provide it, you are out of luck.
|
|
|
|
(Note: this is not completely true as one could rewrite a
|
|
glXGetProcAddressARB replacement using 'dlopen' and friends,
|
|
but well, telling people to upgrade is easier :-) ).
|
|
|
|
|
|
|
|
II How to configure
|
|
===================
|
|
|
|
Configuration is quite easy : once OpenGL support has been built in
|
|
Wine, this internal OpenGL driver will be used each time an
|
|
application tries to load 'opengl32.dll'.
|
|
|
|
Due to restrictions (that do not exist in Windows) on OpenGL contexts,
|
|
if you want to prevent the screen to flicker when using OpenGL
|
|
applications (all games are using double-buffered contexts), you need
|
|
to set the following option in your .winerc / wine.ini in the [x11drv]
|
|
section :
|
|
|
|
DesktopDoubleBuffered = Y
|
|
|
|
and to run Wine with the '--desktop' option.
|
|
|
|
|
|
|
|
III How it all works
|
|
====================
|
|
|
|
The core OpenGL function calls are the same between Windows and
|
|
Linux. So what is the difficulty to support it in Wine ? Well, there
|
|
is two different problems :
|
|
|
|
- the interface to the windowing system is different for each
|
|
OS. It's called 'GLX' for Linux (well, for X Window) and 'wgl' for
|
|
Windows. Thus, one need first to emulate one (wgl) with the other
|
|
(GLX).
|
|
|
|
- the calling convention between Windows (the 'Pascal' convention or
|
|
'stdcall') is different from the one used on Linux (the 'C'
|
|
convention or 'cdecl'). This means that each call to an OpenGL
|
|
function must be 'translated' and cannot be used directly by the
|
|
Windows program.
|
|
|
|
Add to this some braindead programs (using GL calls without setting-up
|
|
a context or deleting three time the same context) and you have still
|
|
some work to do :-)
|
|
|
|
|
|
III.1 The Windowing system integration
|
|
--------------------------------------
|
|
|
|
This integration is done at two levels :
|
|
|
|
- at GDI level for all pixel format selection routines (ie choosing
|
|
if one wants a depth / alpha buffer, the size of these buffers,
|
|
...) and to do the 'page flipping' in double buffer mode. This is
|
|
implemented in 'graphics/x11drv/opengl.c' (all these functions are
|
|
part of Wine's graphic driver function pointer table and thus could
|
|
be reimplented if ever Wine works on another Windowing system than
|
|
X).
|
|
|
|
- in the OpenGL32.DLL itself for all other functionalities (context
|
|
creation / deletion, querying of extension functions, ...). This is
|
|
done in 'dlls/opengl32/wgl.c'.
|
|
|
|
|
|
III.2 The thunks
|
|
----------------
|
|
|
|
The thunks are the Wine code that does the calling convention
|
|
translation and they are auto-generated by a Perl script. In Wine's
|
|
CVS tree, these thunks are already generated for you. Now, if you want
|
|
to do it yourself, there is how it all works....
|
|
|
|
The script is located in dlls/opengl32 and is called 'make_opengl'. It
|
|
requires Perl5 to work and takes two arguments :
|
|
|
|
- the first is the path to the OpenGL registry. Now, you will all ask
|
|
'but what is the OpenGL registry ?' :-) Well, it's part of the
|
|
OpenGL sample implementation source tree from SGI (more
|
|
informations at this URL : http://oss.sgi.com/projects/ogl-sample/).
|
|
|
|
To summarize, these files contains human-readable but easily parsed
|
|
informations on ALL OpenGL core functions and ALL registered
|
|
extensions (for example the prototype, the OpenGL version, ...).
|
|
|
|
- the second is the OpenGL version to 'simulate'. This fixes the list
|
|
of functions that the Windows application can link directly to
|
|
without having to query them from the OpenGL driver. Windows is
|
|
based, for now, on OpenGL 1.1, but the thunks that are in the CVS
|
|
tree are generated for OpenGL 1.2.
|
|
|
|
This option can have three values '1.0', '1.1' and '1.2'.
|
|
|
|
This script generates three files :
|
|
|
|
- opengl32.spec gives Wine's linker the signature of all function in
|
|
the OpenGL32.DLL library so that the application can link
|
|
them. Only 'core' functions are listed here.
|
|
|
|
- opengl_norm.c contains all the thunks for the 'core'
|
|
functions. Your OpenGL library must provide ALL the function used
|
|
in this file as these are not queried at run time.
|
|
|
|
- opengl_ext.c contains all the functions that are not part of the
|
|
'core' functions. Contrary to the thunks in opengl_norm.c, these
|
|
functions do not depend at all on what your libGL provides.
|
|
|
|
In fact, before using one of these thunks, the Windows program
|
|
first needs to 'query' the function pointer. At this point, the
|
|
corresponding thunk is useless. But as we first query the same
|
|
function in libGL and store the returned function pointer in the
|
|
thunk, the latter becomes functional.
|
|
|
|
|
|
|
|
IV Known problems - shortcomings
|
|
=================================
|
|
|
|
IV.1 Missing GLU32.DLL
|
|
----------------------
|
|
|
|
GLU is a library that is layered upon OpenGL. There is a 100 %
|
|
corespondance between the libGLU.so that is used on Linux and
|
|
GLU32.DLL.
|
|
|
|
As for the moment, I did not create a set of thunks to support this
|
|
library natively in Wine (it would easy to do, but I am waiting for a
|
|
better solution than adding another autogenerated thunk file), you can
|
|
always download anywhere on the net (it's free) a GLU32.DLL file (by
|
|
browsing, for example, http://ftpsearch.lycos.com/).
|
|
|
|
|
|
IV.2 OpenGL not detected at configure time
|
|
------------------------------------------
|
|
|
|
See section (I) for a detailed explanation of the configure
|
|
requirements.
|
|
|
|
|
|
IV.3 When running an OpenGL application, the screen flickers
|
|
------------------------------------------------------------
|
|
|
|
See section (II) for how to create the context double-buffered and
|
|
thus preventing this flicker effect.
|
|
|
|
|
|
IV.4 Wine gives me the following error message :
|
|
------------------------------------------------
|
|
Extension defined in the OpenGL library but NOT in opengl_ext.c... Please report
|
|
(lionel.ulmer@free.fr) !
|
|
|
|
This means that the extension requested by the application is found in
|
|
the libGL used by Linux (ie the call to glXGetProcAddressARB returns a
|
|
non NULL pointer) but that this string was NOT found in Wine's
|
|
extension registry.
|
|
|
|
This can come from two causes :
|
|
|
|
- the opengl_ext.c file is too old and need to be generated again.
|
|
|
|
- use of obsolete extensions that are not supported anymore by SGI or
|
|
of 'private' extensions that are not registered. An example of the
|
|
former are 'glMTexCoord2fSGIS' and 'glSelectTextureSGIS' as used by
|
|
Quake 2 (and apparently also by old versions of Half Life). If
|
|
documentation can be found on these functions, they can be added to
|
|
Wine's extension set.
|
|
|
|
If you have this, run with --debugmsg +opengl and send me
|
|
(lionel.ulmer@free.fr) the TRACE.
|
|
|
|
|
|
IV.5 libopengl32.so is built but it is still not working
|
|
--------------------------------------------------------
|
|
|
|
This may be caused by some missing functions required by opengl_norm.c
|
|
but that your Linux OpenGL library does not provide.
|
|
|
|
To check for this, do the following steps :
|
|
|
|
- create a dummy .c file :
|
|
|
|
int main(void) {
|
|
return 0;
|
|
}
|
|
|
|
- try to compile it by linking both libwine and libopengl32 (this
|
|
command line supposes that you installed the Wine libraries in
|
|
/usr/local/lib, YMMV) :
|
|
|
|
gcc dummy.c -L/usr/local/lib -lwine -lopengl32
|
|
|
|
- if it works, the problem is somewhere else (and you can send me an
|
|
email). If not, you could re-generate the thunk files for OpenGL
|
|
1.1 for example (and send me your OpenGL version so that this
|
|
problem can be detected at configure time).
|
|
|
|
|
|
|
|
Lionel Ulmer (lionel.ulmer@free.fr)
|
|
last modification : 2000/06/13
|