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
