Sweden-Number/documentation/opengl

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