Skip to content
Snippets Groups Projects
Commit bedf40b5 authored by Lionel Ulmer's avatar Lionel Ulmer Committed by Alexandre Julliard
Browse files

Added support for OpenGL.

parent 6f93bb4f
No related branches found
No related tags found
No related merge requests found
Showing
with 6889 additions and 349 deletions
......@@ -86,6 +86,7 @@ LINTS = $(C_SRCS:.c=.ln)
X_DLLS = \
ddraw \
opengl32 \
x11drv
DLLS = \
......
This diff is collapsed.
......@@ -126,6 +126,8 @@ AC_SUBST(X_DLLS)
X_DLLS=""
AC_SUBST(XFILES)
XFILES=""
AC_SUBST(OPENGLFILES)
OPENGLFILES=""
AC_SUBST(DGA_SRCS)
DGA_SRCS=""
AC_SUBST(DGA2_SRCS)
......@@ -195,64 +197,58 @@ then
AC_CHECK_LIB(Xxf86vm,XF86VidModeQueryExtension,AC_DEFINE(HAVE_LIBXXF86VM) X_PRE_LIBS="$X_PRE_LIBS -lXxf86vm",,$X_LIBS -lXext -lX11 $X_EXTRA_LIBS)
fi
dnl Check for the presence of Mesa
dnl Check for the presence of OpenGL
if test $OPENGL = "yes" -o $OPENGL = "normal"
then
AC_CHECK_HEADERS(GL/gl.h GL/glx.h)
if test "$ac_cv_header_GL_gl_h" = "yes" -a "$ac_cv_header_GL_glx_h" = "yes"
AC_CHECK_HEADERS(GL/gl.h GL/glx.h GL/glext.h)
if test "$ac_cv_header_GL_gl_h" = "yes" -a "$ac_cv_header_GL_glx_h" = "yes" -a "$ac_cv_header_GL_glext_h" = "yes"
then
dnl Check for some problems due to old Mesa versions
AC_CACHE_CHECK("for up-to-date OpenGL version", wine_cv_mesa_version_OK,
AC_CACHE_CHECK("for up-to-date OpenGL version", wine_cv_opengl_version_OK,
AC_TRY_COMPILE(
[#include <GL/gl.h>],
[GLenum test = GL_UNSIGNED_SHORT_5_6_5;],
[wine_cv_mesa_version_OK="yes"],
[wine_cv_mesa_version_OK="no"]
[wine_cv_opengl_version_OK="yes"],
[wine_cv_opengl_version_OK="no"]
)
)
dnl Check for the thread-safety of the OpenGL library
AC_CACHE_CHECK("for thread-safe OpenGL version",
wine_cv_mesa_version_threadsafe,
wine_cv_opengl_version_threadsafe,
[saved_libs=$LIBS
LIBS="$X_LIBS -lGL"
AC_TRY_LINK([],[pthread_getspecific();],
[wine_cv_mesa_version_threadsafe="yes"],
[wine_cv_mesa_version_threadsafe="no"])
[wine_cv_opengl_version_threadsafe="yes"],
[wine_cv_opengl_version_threadsafe="no"])
LIBS=$saved_libs]
)
if test "$wine_cv_mesa_version_OK" = "yes" -a \( "$wine_cv_mesa_version_threadsafe" = "no" -o $OPENGL = "yes" \)
if test "$wine_cv_opengl_version_OK" = "yes" -a \( "$wine_cv_opengl_version_threadsafe" = "no" -o $OPENGL = "yes" \)
then
dnl Check for the presense of the library
AC_CHECK_LIB(GL,glXCreateContext,
AC_DEFINE(HAVE_LIBMESAGL)
X_PRE_LIBS="$X_PRE_LIBS -lGL"
MESA_SRCS='$(MESA_SRCS)'
,,
$X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS)
if test "$ac_cv_lib_GL_glXCreateContext" = "no"
if test $ac_cv_lib_GL_glXCreateContext = "yes"
then
AC_CHECK_LIB(MesaGL,glXCreateContext,
AC_DEFINE(HAVE_LIBMESAGL)
X_PRE_LIBS="$X_PRE_LIBS -lMesaGL"
MESA_SRCS='$(MESA_SRCS)'
,,
$X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS)
fi
dnl Check for the Color Table and Paletted Texture extensions
AC_CACHE_CHECK("for the OpenGL Color Index extension",dummy,
AC_TRY_COMPILE([#include <GL/gl.h>],
[GLenum test = GL_COLOR_INDEX8_EXT;],
[AC_DEFINE(HAVE_GL_COLOR_TABLE)],))
if test "$ac_cv_lib_GL_glXCreateContext" = "no"
then
AC_CHECK_LIB(MesaGL,glColorTableEXT,AC_DEFINE(HAVE_GL_PALETTED_TEXTURE),,$X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS)
else
AC_CHECK_LIB(GL,glColorTableEXT,AC_DEFINE(HAVE_GL_PALETTED_TEXTURE),,$X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS)
dnl Check for the Color Table and Paletted Texture extensions
AC_CACHE_CHECK("for the OpenGL Color Index extension",dummy,
AC_TRY_COMPILE([#include <GL/gl.h>],
[GLenum test = GL_COLOR_INDEX8_EXT;],
[AC_DEFINE(HAVE_GL_COLOR_TABLE)],))
AC_CHECK_LIB(GL,glColorTableEXT,AC_DEFINE(HAVE_GL_PALETTED_TEXTURE),,$X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS)
AC_CHECK_LIB(GL,glXGetProcAddressARB,AC_DEFINE(HAVE_GLX_GETPROCADDRESS),,$X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS)
if test $ac_cv_lib_GL_glXGetProcAddressARB = "yes"
then
AC_DEFINE(HAVE_OPENGL)
OPENGLFILES='$(OPENGLFILES)'
fi
fi
fi
fi
......@@ -994,6 +990,7 @@ dlls/olecli/Makefile
dlls/oledlg/Makefile
dlls/olepro32/Makefile
dlls/olesvr/Makefile
dlls/opengl32/Makefile
dlls/psapi/Makefile
dlls/rasapi32/Makefile
dlls/richedit/Makefile
......@@ -1108,14 +1105,14 @@ then
echo "*** reentrant version of libc."
fi
if test "$wine_cv_mesa_version_OK" = "no"
if test "$wine_cv_opengl_version_OK" = "no"
then
echo
echo "*** Warning: old Mesa headers detected. Wine will be built without Direct3D"
echo "*** support. Consider upgrading your Mesa libraries (http://www.mesa3d.org/)."
fi
if test "$wine_cv_mesa_version_threadsafe" = "yes" -a $OPENGL = "normal"
if test "$wine_cv_opengl_version_threadsafe" = "yes" -a $OPENGL = "normal"
then
echo
echo "*** Warning: the OpenGL version you have installed relies on libpthread for"
......@@ -1124,7 +1121,7 @@ then
echo "*** start configure with '--enable-opengl' to force OpenGL support."
fi
if test "$wine_cv_mesa_version_threadsafe" = "yes" -a $OPENGL = "yes"
if test "$wine_cv_opengl_version_threadsafe" = "yes" -a $OPENGL = "yes"
then
echo
echo "*** Warning: you explicitely linked in a thread-safe OpenGL version. If you"
......
......@@ -3,8 +3,12 @@ TOPOBJDIR = ..
SRCDIR = @srcdir@
VPATH = @srcdir@
OPENGLFILES= \
opengl32/libopengl32.@LIBEXT@
XFILES = \
ddraw/libddraw.@LIBEXT@ \
@OPENGLFILES@ \
x11drv/libx11drv.@LIBEXT@
DLLFILES = \
......@@ -118,6 +122,7 @@ SUBDIRS = \
oledlg \
olepro32 \
olesvr \
opengl32 \
psapi \
rasapi32 \
richedit \
......@@ -246,6 +251,9 @@ libolepro32.@LIBEXT@: olepro32/libolepro32.@LIBEXT@
libolesvr32.@LIBEXT@ libolesvr.@LIBEXT@: olesvr/libolesvr32.@LIBEXT@
$(RM) $@ && $(LN_S) olesvr/libolesvr32.@LIBEXT@ $@
libopengl32.@LIBEXT@: opengl32/libopengl32.@LIBEXT@
$(RM) $@ && $(LN_S) opengl32/libopengl32.@LIBEXT@ $@
libpsapi.@LIBEXT@: psapi/libpsapi.@LIBEXT@
$(RM) $@ && $(LN_S) psapi/libpsapi.@LIBEXT@ $@
......@@ -325,6 +333,7 @@ msvideo/libmsvfw32.so: libwinmm.so
oleaut32/liboleaut32.so: libole32.so libcomctl32.so
olecli/libolecli32.so: libolesvr32.so libole32.so
olepro32/libolepro32.so: liboleaut32.so libole32.so
opengl32/libopengl32.so: libx11drv.so libgdi32.so
shell32/libshell32.so: libole32.so
urlmon/liburlmon.so: libole32.so
version/libversion.so: liblz32.so
......
......@@ -14,10 +14,14 @@
#include "x11drv.h"
#include "d3d_private.h"
#include "mesa_private.h"
DEFAULT_DEBUG_CHANNEL(ddraw)
#ifdef HAVE_MESAGL
#ifdef HAVE_OPENGL
#define D3DVPRIVATE(x) mesa_d3dv_private*dvpriv=((mesa_d3dv_private*)x->private)
#define D3DLPRIVATE(x) mesa_d3dl_private*dlpriv=((mesa_d3dl_private*)x->private)
static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable;
......@@ -44,6 +48,7 @@ LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2)
IDirect3DViewport2Impl* vp;
vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
vp->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dv_private));
vp->ref = 1;
ICOM_VTBL(vp) = &viewport2_vtable;
vp->d3d.d3d2 = d3d2;
......@@ -54,7 +59,7 @@ LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2)
vp->lights = NULL;
vp->nextlight = GL_LIGHT0;
((mesa_d3dv_private *) vp->private)->nextlight = GL_LIGHT0;
return (LPDIRECT3DVIEWPORT2)vp;
}
......@@ -64,6 +69,7 @@ LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1)
IDirect3DViewport2Impl* vp;
vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
vp->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dv_private));
vp->ref = 1;
ICOM_VTBL(vp) = &viewport2_vtable;
vp->d3d.d3d1 = d3d1;
......@@ -74,7 +80,7 @@ LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1)
vp->lights = NULL;
vp->nextlight = GL_LIGHT0;
((mesa_d3dv_private *) vp->private)->nextlight = GL_LIGHT0;
return (LPDIRECT3DVIEWPORT) vp;
}
......@@ -83,7 +89,7 @@ LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1)
* IDirect3DViewport2 methods
*/
static HRESULT WINAPI IDirect3DViewport2Impl_QueryInterface(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_QueryInterface(LPDIRECT3DVIEWPORT2 iface,
REFIID riid,
LPVOID* ppvObj)
{
......@@ -96,7 +102,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_QueryInterface(LPDIRECT3DVIEWPORT2
static ULONG WINAPI IDirect3DViewport2Impl_AddRef(LPDIRECT3DVIEWPORT2 iface)
ULONG WINAPI IDirect3DViewport2Impl_AddRef(LPDIRECT3DVIEWPORT2 iface)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
......@@ -106,7 +112,7 @@ static ULONG WINAPI IDirect3DViewport2Impl_AddRef(LPDIRECT3DVIEWPORT2 iface)
static ULONG WINAPI IDirect3DViewport2Impl_Release(LPDIRECT3DVIEWPORT2 iface)
ULONG WINAPI IDirect3DViewport2Impl_Release(LPDIRECT3DVIEWPORT2 iface)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
......@@ -120,7 +126,7 @@ static ULONG WINAPI IDirect3DViewport2Impl_Release(LPDIRECT3DVIEWPORT2 iface)
}
/*** IDirect3DViewport methods ***/
static HRESULT WINAPI IDirect3DViewport2Impl_Initialize(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_Initialize(LPDIRECT3DVIEWPORT2 iface,
LPDIRECT3D d3d)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
......@@ -129,7 +135,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_Initialize(LPDIRECT3DVIEWPORT2 ifac
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_GetViewport(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_GetViewport(LPDIRECT3DVIEWPORT2 iface,
LPD3DVIEWPORT lpvp)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
......@@ -143,7 +149,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_GetViewport(LPDIRECT3DVIEWPORT2 ifa
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_SetViewport(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_SetViewport(LPDIRECT3DVIEWPORT2 iface,
LPD3DVIEWPORT lpvp)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
......@@ -167,7 +173,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_SetViewport(LPDIRECT3DVIEWPORT2 ifa
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_TransformVertices(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_TransformVertices(LPDIRECT3DVIEWPORT2 iface,
DWORD dwVertexCount,
LPD3DTRANSFORMDATA lpData,
DWORD dwFlags,
......@@ -180,7 +186,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_TransformVertices(LPDIRECT3DVIEWPOR
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_LightElements(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_LightElements(LPDIRECT3DVIEWPORT2 iface,
DWORD dwElementCount,
LPD3DLIGHTDATA lpData)
{
......@@ -190,7 +196,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_LightElements(LPDIRECT3DVIEWPORT2 i
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_SetBackground(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_SetBackground(LPDIRECT3DVIEWPORT2 iface,
D3DMATERIALHANDLE hMat)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
......@@ -199,7 +205,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_SetBackground(LPDIRECT3DVIEWPORT2 i
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_GetBackground(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_GetBackground(LPDIRECT3DVIEWPORT2 iface,
LPD3DMATERIALHANDLE lphMat,
LPBOOL lpValid)
{
......@@ -209,7 +215,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_GetBackground(LPDIRECT3DVIEWPORT2 i
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
LPDIRECTDRAWSURFACE lpDDSurface)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
......@@ -218,7 +224,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_SetBackgroundDepth(LPDIRECT3DVIEWPO
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
LPDIRECTDRAWSURFACE* lplpDDSurface,
LPBOOL lpValid)
{
......@@ -228,7 +234,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_GetBackgroundDepth(LPDIRECT3DVIEWPO
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_Clear(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_Clear(LPDIRECT3DVIEWPORT2 iface,
DWORD dwCount,
LPD3DRECT lpRects,
DWORD dwFlags)
......@@ -257,7 +263,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_Clear(LPDIRECT3DVIEWPORT2 iface,
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_AddLight(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_AddLight(LPDIRECT3DVIEWPORT2 iface,
LPDIRECT3DLIGHT lpLight)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
......@@ -270,6 +276,9 @@ static HRESULT WINAPI IDirect3DViewport2Impl_AddLight(LPDIRECT3DVIEWPORT2 iface,
/* If active, activate the light */
if (This->device.active_device1 != NULL) {
D3DVPRIVATE(This);
D3DLPRIVATE(ilpLight);
/* Get the rendering context */
if (This->use_d3d2)
This->device.active_device2->set_context(This->device.active_device2);
......@@ -277,14 +286,14 @@ static HRESULT WINAPI IDirect3DViewport2Impl_AddLight(LPDIRECT3DVIEWPORT2 iface,
This->device.active_device1->set_context(This->device.active_device1);
/* Activate the light */
ilpLight->light_num = This->nextlight++;
dlpriv->light_num = dvpriv->nextlight++;
ilpLight->activate(ilpLight);
}
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_DeleteLight(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_DeleteLight(LPDIRECT3DVIEWPORT2 iface,
LPDIRECT3DLIGHT lpLight)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
......@@ -293,7 +302,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_DeleteLight(LPDIRECT3DVIEWPORT2 ifa
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_NextLight(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_NextLight(LPDIRECT3DVIEWPORT2 iface,
LPDIRECT3DLIGHT lpLight,
LPDIRECT3DLIGHT* lplpLight,
DWORD dwFlags)
......@@ -305,7 +314,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_NextLight(LPDIRECT3DVIEWPORT2 iface
}
/*** IDirect3DViewport2 methods ***/
static HRESULT WINAPI IDirect3DViewport2Impl_GetViewport2(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_GetViewport2(LPDIRECT3DVIEWPORT2 iface,
LPD3DVIEWPORT2 lpViewport2)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
......@@ -319,7 +328,7 @@ static HRESULT WINAPI IDirect3DViewport2Impl_GetViewport2(LPDIRECT3DVIEWPORT2 if
return DD_OK;
}
static HRESULT WINAPI IDirect3DViewport2Impl_SetViewport2(LPDIRECT3DVIEWPORT2 iface,
HRESULT WINAPI IDirect3DViewport2Impl_SetViewport2(LPDIRECT3DVIEWPORT2 iface,
LPD3DVIEWPORT2 lpViewport2)
{
ICOM_THIS(IDirect3DViewport2Impl,iface);
......@@ -372,7 +381,7 @@ static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable =
IDirect3DViewport2Impl_SetViewport2
};
#else /* HAVE_MESAGL */
#else /* HAVE_OPENGL */
LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1) {
ERR("Should not be called...\n");
......@@ -384,4 +393,4 @@ LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2) {
return NULL;
}
#endif /* HAVE_MESAGL */
#endif /* HAVE_OPENGL */
......@@ -345,7 +345,7 @@ static void fill_caps(LPDDCAPS caps) {
DDSCAPS_FRONTBUFFER | DDSCAPS_LOCALVIDMEM | DDSCAPS_NONLOCALVIDMEM | DDSCAPS_OFFSCREENPLAIN |
/*DDSCAPS_OVERLAY |*/ DDSCAPS_PALETTE | DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY |
DDSCAPS_VIDEOMEMORY | DDSCAPS_VISIBLE;
#ifdef HAVE_MESAGL
#ifdef HAVE_OPENGL
caps->dwCaps |= DDCAPS_3D | DDCAPS_ZBLTS;
caps->dwCaps2 |= DDCAPS2_NO2DDURING3DSCENE;
caps->ddsCaps.dwCaps |= DDSCAPS_3DDEVICE | DDSCAPS_MIPMAP | DDSCAPS_TEXTURE | DDSCAPS_ZBUFFER;
......
......@@ -553,7 +553,7 @@ static void fill_caps(LPDDCAPS caps) {
DDSCAPS_FRONTBUFFER | DDSCAPS_LOCALVIDMEM | DDSCAPS_NONLOCALVIDMEM | DDSCAPS_OFFSCREENPLAIN |
/*DDSCAPS_OVERLAY |*/ DDSCAPS_PALETTE | DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY |
DDSCAPS_VIDEOMEMORY | DDSCAPS_VISIBLE;
#ifdef HAVE_MESAGL
#ifdef HAVE_OPENGL
caps->dwCaps |= DDCAPS_3D | DDCAPS_ZBLTS;
caps->dwCaps2 |= DDCAPS2_NO2DDURING3DSCENE;
caps->ddsCaps.dwCaps |= DDSCAPS_3DDEVICE | DDSCAPS_MIPMAP | DDSCAPS_TEXTURE | DDSCAPS_ZBUFFER;
......@@ -650,7 +650,7 @@ static HRESULT WINAPI Xlib_IDirectDraw2Impl_QueryInterface(
return S_OK;
}
#ifdef HAVE_MESAGL
#ifdef HAVE_OPENGL
if ( IsEqualGUID( &IID_IDirect3D, refiid ) )
return create_direct3d(obj,This);
if ( IsEqualGUID( &IID_IDirect3D2, refiid ) )
......
......@@ -17,7 +17,7 @@
#include "debugtools.h"
#include "x11_private.h"
#ifdef HAVE_MESAGL
#ifdef HAVE_OPENGL
/* for d3d texture stuff */
# include "mesa_private.h"
#endif
......@@ -59,7 +59,7 @@ HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_QueryInterface(
TRACE(" Creating IDirectDrawSurface interface (%p)\n", *obj);
return S_OK;
}
#ifdef HAVE_MESAGL
#ifdef HAVE_OPENGL
if ( IsEqualGUID( &IID_IDirect3DTexture2, refiid ) ) {
/* Texture interface */
*obj = d3dtexture2_create(This);
......@@ -74,7 +74,7 @@ HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_QueryInterface(
TRACE(" Creating IDirect3DTexture interface (%p)\n", *obj);
return S_OK;
}
#endif /* HAVE_MESAGL */
#endif /* HAVE_OPENGL */
FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
return OLE_E_ENUM_NOMORE;
}
......
......@@ -40,14 +40,6 @@ typedef struct mesa_d3dv_private
GLenum nextlight;
} mesa_d3dv_private;
#ifdef USE_OSMESA
# define LEAVE_GL() ;
# define ENTER_GL() ;
#else
# define LEAVE_GL() LeaveCriticalSection( &X11DRV_CritSection )
# define ENTER_GL() EnterCriticalSection( &X11DRV_CritSection )
#endif
/* Matrix copy WITH transposition */
#define conv_mat2(mat,gl_mat) \
{ \
......
*.spec.c
Makefile
libopengl32.so.1.0
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = opengl32
SOVERSION = 1.0
IMPORTS = \
x11drv \
gdi32
SPEC_SRCS = opengl32.spec
C_SRCS = \
wgl.c \
opengl_norm.c \
opengl_ext.c
@MAKE_DLL_RULES@
### Dependencies:
#!/usr/bin/perl -w
print "
/* Auto-generated file... Do not edit ! */
#include \"config.h\"
#include \"wine_gl.h\"
#include \"opengl_ext.h\"
";
#
# First, create a hash-table with all function defined in opengl32.spec
#
%opengl_std = ();
open(SPEC, "dlls/opengl32/opengl32.spec") || die "Could not open spec file";
foreach (<SPEC>) {
if (($_ =~ /@/) && ($_ !~ /wgl/)) {
($name) = ($_ =~ /stdcall (\w*)\(/);
$opengl_std{$name} = 1;
}
}
close(SPEC);
#
# Now, the functions from the include file
#
%opengl_ext = ();
open(INC, "/home/ulmer/OpenGL/glext_proto.h") || die "Could not open GL/glext.h";
while ($line = <INC>) {
if ($line =~ /extern.*APIENTRY/) {
# Start of a function declaration
($ret, $name, $args) = ($line =~ /extern (\w*) APIENTRY *(\w*) *\((.*)\)/);
# Now, remove all function already defined in opengl32.spec
if ($opengl_std{$name}) {
# Do nothing as we already have these functions
} else {
# Now, get the typedef name (the line after)
($typedef_name) = (<INC> =~ /\(APIENTRY *\* *(\w*) *\)/);
# After that, parse the arguments
@args = split /,/, $args;
$args_ref = [];
foreach (@args) {
push @$args_ref, $_;
}
$opengl_ext{$name} = [ $ret, $typedef_name, $args_ref ];
}
}
}
close(INC);
#
# After that, generate the file itself....
#
print "/* These will be filled during a wglGetProcAddress call */\n";
$num = 0;
foreach $name (sort keys(%opengl_ext)) {
$ref = $opengl_ext{$name};
$arg_ref = $$ref[2];
@larg = @$arg_ref;
print "$$ref[0] (*func_$name)(";
$farg = shift @larg;
print "$farg";
foreach (@larg) {
print ", $_";
}
print ") = (void *) 0xdeadbeef;\n";
$num++;
}
print "\n";
print "/* The function prototypes */\n";
foreach $name (sort keys(%opengl_ext)) {
$ref = $opengl_ext{$name};
$arg_ref = $$ref[2];
@larg = @$arg_ref;
print "$$ref[0] WINAPI wine_$name(";
$farg = shift @larg;
print "$farg";
foreach (@larg) {
print ", $_";
}
print ") ;\n";
}
print "\n";
print "/* The table giving the correspondance between names and functions */\n";
print "int extension_registry_size = $num;\n";
print "OpenGL_extension extension_registry[] = {\n";
foreach $name (sort keys(%opengl_ext)) {
$num--;
print " { \"$name\", (void *) wine_$name, (void **) (&func_$name) }";
if ($num) {
print ",";
}
print "\n";
}
print "};\n";
print "\n";
print "/* Now, the function declarations */\n";
foreach $name (sort keys(%opengl_ext)) {
$ref = $opengl_ext{$name};
$arg_ref = $$ref[2];
print "$$ref[0] WINAPI wine_$name(";
$farg = shift @$arg_ref;
$num = 0;
if ($farg !~ /void/) {
print "$farg arg_0";
$num++;
foreach (@$arg_ref) {
print ", $_ arg_$num";
$num++;
}
}
print ") {\n";
if ($$ref[0] !~ /void/) {
print " $$ref[0] ret;\n"
}
print " ENTER_GL();\n";
print " ";
if ($$ref[0] !~ /void/) {
print " ret = ";
}
print "func_$name(";
if ($num > 0) {
print "arg_0";
for ($i = 1; $i < $num; $i++) {
print ", arg_$i";
}
}
print ");\n";
print " LEAVE_GL();\n";
if ($$ref[0] !~ /void/) {
print " return ret;\n"
}
print "}\n\n";
}
#!/usr/bin/perl -w
print "
/* Auto-generated file... Do not edit ! */
#include \"config.h\"
#include \"wine_gl.h\"
";
#
# Now, the functions from the include file
#
open(INC, "/usr/X11R6/include/GL/gl.h") || die "Could not open GL/gl.h";
while ($line = <INC>) {
if ($line =~ /GLAPI.*GLAPIENTRY/) {
# Start of a function declaration
($ret, $name, $args) = ($line =~ /GLAPI (.*) GLAPIENTRY *(.*)\((.*)/);
# Remove all extensions except the multitexture one (see OpenGL ABI)
if (($name !~ /(MESA|PGI|ARB|EXT)/) ||
($name =~ /MultiTexCoord/) ||
($name =~ /ActiveTextureARB/)) {
print "$ret WINAPI wine_$name(";
@rargs = ();
@names = ();
# Now, get the parameters
while (1) {
@args = split /,|\)/, $args;
foreach (@args) {
if ($_ =~ /[a-z,A-Z]/) {
($a) = ($_ =~ /^\s*(.*)\s*$/);
if ($a =~ /\*\*/) {
($var) = ($a =~ /\*\*(\w*)/);
} elsif ($a =~ /\*/) {
($var) = ($a =~ /\*(\w*)/);
} else {
($var) = ($a =~ /\s(\w*)/);
}
@rargs = (@rargs, $a);
if ($var !~ /void/) {
@names = (@names, $var);
}
}
}
if ($args !~ /\)/) {
$args = <INC>;
} else {
last;
}
}
print shift @rargs;
foreach (@rargs) {
print ", $_";
}
print ") {\n";
if ($ret !~ /void/) {
print " $ret ret;\n";
}
print " ENTER_GL();\n";
if ($ret !~ /void/) {
print " ret = ";
} else {
print " ";
}
print "$name(";
$farg = shift @names;
if ($farg) {
print "$farg";
foreach (@names) {
print ", $_";
}
}
print ");\n";
print " LEAVE_GL();\n";
if ($ret !~ /void/) {
print " return ret;\n";
}
print "}\n\n";
}
}
}
close(INC);
#!/usr/bin/perl -w
#
# First, the basics and the wgl functions
#
print "
name opengl32
type win32
@ stdcall wglCreateContext(long) wglCreateContext
@ stdcall wglCreateLayerContext(long long) wglCreateLayerContext
@ stdcall wglCopyContext(long long long) wglCopyContext
@ stdcall wglDeleteContext(long) wglDeleteContext
@ stdcall wglDescribeLayerPlane(long long long long ptr) wglDescribeLayerPlane
@ stdcall wglGetCurrentContext() wglGetCurrentContext
@ stdcall wglGetCurrentDC() wglGetCurrentDC
@ stdcall wglGetLayerPaletteEntries(long long long long ptr) wglGetLayerPaletteEntries
@ stdcall wglGetProcAddress(str) wglGetProcAddress
@ stdcall wglMakeCurrent(long long) wglMakeCurrent
@ stdcall wglRealizeLayerPalette(long long long) wglRealizeLayerPalette
@ stdcall wglSetLayerPaletteEntries(long long long long ptr) wglSetLayerPaletteEntries
@ stdcall wglShareLists(long long) wglShareLists
@ stdcall wglSwapLayerBuffers(long long) wglSwapLayerBuffers
@ stdcall wglUseFontBitmaps(long long long long) wglUseFontBitmaps
@ stdcall wglUseFontOutlines(long long long long long long long) wglUseFontOutlines
@ stub glGetLevelParameterfv
@ stub glGetLevelParameteriv
@ stub wglUseFontBitmapsA
@ stub wglUseFontOutlinesA
@ forward wglChoosePixelFormat GDI32.ChoosePixelFormat
@ forward wglDescribePixelFormat GDI32.DescribePixelFormat
@ forward wglGetPixelFormat GDI32.GetPixelFormat
@ forward wglSetPixelFormat GDI32.SetPixelFormat
@ forward wglSwapBuffers GDI32.SwapBuffers
";
#
# Now, the functions from the include file
#
open(INC, "/usr/X11R6/include/GL/gl.h") || die "Could not open GL/gl.h";
while ($line = <INC>) {
if ($line =~ /GLAPI.*GLAPIENTRY/) {
# Start of a function declaration
($name, $args) = ($line =~ /GLAPIENTRY *(.*)\((.*)/);
# Remove all extensions except the multitexture one (see OpenGL ABI)
if (($name !~ /(MESA|PGI|ARB|EXT)/) ||
($name =~ /MultiTexCoord/) ||
($name =~ /ActiveTextureARB/)) {
print "@ stdcall $name(";
# Now, get the parameters
while (1) {
@args = split /,/, $args;
foreach (@args) {
if ($_ =~ /\)/) {
($_) = ($_ =~ /(.*)\)/);
}
if ($_ =~ /\*/) {
print "ptr ";
} elsif ($_ =~ /[a-zA-Z]/) {
($type) = ($_ =~ /^ *(.*) +.*/);
if ($type =~ /double/) {
print "double ";
} elsif ($type !~ /void/) {
print "long ";
}
}
}
if ($args !~ /\)/) {
$args = <INC>;
} else {
last;
}
}
print ") wine_$name\n";
}
}
}
close(INC);
This diff is collapsed.
This diff is collapsed.
/* Typedefs for extensions loading
Copyright (c) 2000 Lionel Ulmer
*/
#ifndef __DLLS_OPENGL32_OPENGL_EXT_H
#define __DLLS_OPENGL32_OPENGL_EXT_H
typedef struct {
char *name; /* name of the extension */
void *func; /* pointer to the Wine function for this extension */
void **func_ptr; /* where to store the value of glXGetProcAddressARB */
} OpenGL_extension;
extern OpenGL_extension extension_registry[];
extern int extension_registry_size;
#endif /* __DLLS_OPENGL32_OPENGL_EXT_H */
This diff is collapsed.
/* Window-specific OpenGL functions implementation.
Copyright (c) 1999 Lionel Ulmer
*/
#include <stdlib.h>
#include "config.h"
#include "debugtools.h"
#include "gdi.h"
#include "dc.h"
#include "windef.h"
#include "wine_gl.h"
#include "x11drv.h"
#include "wgl.h"
#include "opengl_ext.h"
DEFAULT_DEBUG_CHANNEL(opengl)
HGLRC WINAPI wglCreateContext(HDC hdc) {
DC * dc = DC_GetDCPtr( hdc );
X11DRV_PDEVICE *physDev;
XVisualInfo *vis;
GLXContext ret;
TRACE("(%08x)\n", hdc);
if (dc == NULL) {
ERR("Null DC !!!\n");
return NULL;
}
physDev = (X11DRV_PDEVICE *)dc->physDev;
/* First, get the visual for the choosen pixel format */
vis = physDev->visuals[physDev->current_pf - 1];
if (vis == NULL) {
ERR("NULL visual !!!\n");
/* Need to set errors here */
return NULL;
}
ENTER_GL();
ret = glXCreateContext(display, vis, NULL, True);
LEAVE_GL();
return (HGLRC) ret;
}
HGLRC WINAPI wglCreateLayerContext(HDC hdc,
int iLayerPlane) {
FIXME("(%08x,%d): stub !\n", hdc, iLayerPlane);
return NULL;
}
BOOL WINAPI wglCopyContext(HGLRC hglrcSrc,
HGLRC hglrcDst,
UINT mask) {
FIXME("(%p,%p,%d)\n", hglrcSrc, hglrcDst, mask);
return FALSE;
}
BOOL WINAPI wglDeleteContext(HGLRC hglrc) {
FIXME("(%p): stub !\n", hglrc);
return FALSE;
}
BOOL WINAPI wglDescribeLayerPlane(HDC hdc,
int iPixelFormat,
int iLayerPlane,
UINT nBytes,
LPLAYERPLANEDESCRIPTOR plpd) {
FIXME("(%08x,%d,%d,%d,%p)\n", hdc, iPixelFormat, iLayerPlane, nBytes, plpd);
return FALSE;
}
HGLRC WINAPI wglGetCurrentContext(void) {
GLXContext ret;
TRACE("()\n");
ENTER_GL();
ret = glXGetCurrentContext();
LEAVE_GL();
TRACE(" returning %p\n", ret);
return ret;
}
HDC WINAPI wglGetCurrentDC(void) {
GLXContext ret;
ENTER_GL();
ret = glXGetCurrentContext();
LEAVE_GL();
if (ret == NULL) {
TRACE("() no current context -> returning NULL\n");
return 0;
} else {
FIXME("()\n");
return 0;
}
}
int WINAPI wglGetLayerPaletteEntries(HDC hdc,
int iLayerPlane,
int iStart,
int cEntries,
const COLORREF *pcr) {
FIXME("(): stub !\n");
return 0;
}
static int compar(const void *elt_a, const void *elt_b) {
return strcmp(((OpenGL_extension *) elt_a)->name,
((OpenGL_extension *) elt_b)->name);
}
void* WINAPI wglGetProcAddress(LPCSTR lpszProc) {
void *local_func;
static HMODULE hm = 0;
TRACE("(%s)\n", lpszProc);
if (hm == 0)
hm = GetModuleHandleA("opengl32");
/* First, look if it's not already defined in the 'standard' OpenGL functions */
if ((local_func = GetProcAddress(hm, lpszProc)) != NULL) {
TRACE("Found function in 'standard' OpenGL functions (%p)\n", local_func);
return local_func;
}
/* After that, look at the extensions defined in the Linux OpenGL library */
if ((local_func = glXGetProcAddressARB(lpszProc)) == NULL) {
char buf[256];
void *ret = NULL;
/* Remove the 3 last letters (EXT, ARB, ...).
I know that some extensions have more than 3 letters (MESA, NV,
INTEL, ...), but this is only a stop-gap measure to fix buggy
OpenGL drivers (moreover, it is only useful for old 1.0 apps
that query the glBindTextureEXT extension).
*/
strncpy(buf, lpszProc, strlen(lpszProc) - 3);
buf[strlen(lpszProc) - 3] = '\0';
TRACE("Extension not found in the Linux OpenGL library, checking against libGL bug with %s..\n", buf);
ret = GetProcAddress(hm, buf);
if (ret != NULL) {
TRACE("Found function in main OpenGL library (%p) !\n", ret);
}
return ret;
} else {
OpenGL_extension ext;
OpenGL_extension *ret;
ext.name = (char *) lpszProc;
ret = (OpenGL_extension *) bsearch(&ext, extension_registry,
extension_registry_size, sizeof(OpenGL_extension), compar);
if (ret != NULL) {
TRACE("Returning function (%p)\n", ret->func);
*(ret->func_ptr) = local_func;
return ret->func;
} else {
ERR("Extension defined in the OpenGL library but NOT in opengl_ext.c... Please report (lionel.ulmer@free.fr) !\n");
return NULL;
}
}
}
BOOL WINAPI wglMakeCurrent(HDC hdc,
HGLRC hglrc) {
DC * dc = DC_GetDCPtr( hdc );
X11DRV_PDEVICE *physDev;
BOOL ret;
TRACE("(%08x,%p)\n", hdc, hglrc);
if (dc == NULL) {
ERR("Null DC !!!\n");
return FALSE;
}
physDev =(X11DRV_PDEVICE *)dc->physDev;
ENTER_GL();
ret = glXMakeCurrent(display, physDev->drawable, (GLXContext) hglrc);
LEAVE_GL();
return ret;
}
BOOL WINAPI wglRealizeLayerPalette(HDC hdc,
int iLayerPlane,
BOOL bRealize) {
FIXME("()\n");
return FALSE;
}
int WINAPI wglSetLayerPaletteEntries(HDC hdc,
int iLayerPlane,
int iStart,
int cEntries,
const COLORREF *pcr) {
FIXME("(): stub !\n");
return 0;
}
BOOL WINAPI wglShareLists(HGLRC hglrc1,
HGLRC hglrc2) {
FIXME("(): stub !\n");
return FALSE;
}
BOOL WINAPI wglSwapLayerBuffers(HDC hdc,
UINT fuPlanes) {
FIXME("(): stub !\n");
return FALSE;
}
BOOL WINAPI wglUseFontBitmaps(HDC hdc,
DWORD first,
DWORD count,
DWORD listBase) {
FIXME("(): stub !\n");
return FALSE;
}
BOOL WINAPI wglUseFontOutlines(HDC hdc,
DWORD first,
DWORD count,
DWORD listBase,
FLOAT deviation,
FLOAT extrusion,
int format,
LPGLYPHMETRICSFLOAT lpgmf) {
FIXME("(): stub !\n");
return FALSE;
}
/* This is for brain-dead applications that use OpenGL functions before even
creating a rendering context.... */
DECL_GLOBAL_CONSTRUCTOR(OpenGL_create_default_context) {
int num;
XVisualInfo template;
XVisualInfo *vis;
GLXContext cx;
ENTER_GL();
template.visualid = XVisualIDFromVisual(visual);
vis = XGetVisualInfo(display, VisualIDMask, &template, &num);
cx=glXCreateContext(display, vis, 0, GL_TRUE);
glXMakeCurrent(display, X11DRV_GetXRootWindow(), cx);
LEAVE_GL();
}
/* Window-specific OpenGL functions implementation.
Copyright (c) 2000 Lionel Ulmer
*/
#ifndef __DLLS_OPENGL32_WGL_H
#define __DLLS_OPENGL32_WGL_H
#include "gdi.h"
typedef void *HGLRC;
typedef struct {
WORD nSize;
WORD nVersion;
DWORD dwFlags;
BYTE iPixelType;
BYTE cColorBits;
BYTE cRedBits;
BYTE cRedShift;
BYTE cGreenBits;
BYTE cGreenShift;
BYTE cBlueBits;
BYTE cBlueShift;
BYTE cAlphaBits;
BYTE cAlphaShift;
BYTE cAccumBits;
BYTE cAccumRedBits;
BYTE cAccumGreenBits;
BYTE cAccumBlueBits;
BYTE cAccumAlphaBits;
BYTE cDepthBits;
BYTE cStencilBits;
BYTE cAuxBuffers;
BYTE iLayerPlane;
BYTE bReserved;
COLORREF crTransparent;
} LAYERPLANEDESCRIPTOR;
typedef LAYERPLANEDESCRIPTOR* LPLAYERPLANEDESCRIPTOR;
typedef struct {
FLOAT x;
FLOAT y;
} POINTFLOAT;
typedef struct {
FLOAT gmfBlackBoxX;
FLOAT gmfBlackBoxY;
POINTFLOAT gmfptGlyphOrigin;
FLOAT gmfCellIncX;
FLOAT gmfCellIncY;
} GLYPHMETRICSFLOAT;
typedef GLYPHMETRICSFLOAT *LPGLYPHMETRICSFLOAT;
HGLRC WINAPI wglCreateContext(HDC hdc) ;
HGLRC WINAPI wglCreateLayerContext(HDC hdc,
int iLayerPlane) ;
BOOL WINAPI wglCopyContext(HGLRC hglrcSrc,
HGLRC hglrcDst,
UINT mask) ;
BOOL WINAPI wglDeleteContext(HGLRC hglrc) ;
BOOL WINAPI wglDescribeLayerPlane(HDC hdc,
int iPixelFormat,
int iLayerPlane,
UINT nBytes,
LPLAYERPLANEDESCRIPTOR plpd) ;
HGLRC WINAPI wglGetCurrentContext(void) ;
HDC WINAPI wglGetCurrentDC(void) ;
int WINAPI wglGetLayerPaletteEntries(HDC hdc,
int iLayerPlane,
int iStart,
int cEntries,
const COLORREF *pcr) ;
void * WINAPI wglGetProcAddress(LPCSTR lpszProc) ;
BOOL WINAPI wglMakeCurrent(HDC hdc,
HGLRC hglrc) ;
BOOL WINAPI wglRealizeLayerPalette(HDC hdc,
int iLayerPlane,
BOOL bRealize) ;
int WINAPI wglSetLayerPaletteEntries(HDC hdc,
int iLayerPlane,
int iStart,
int cEntries,
const COLORREF *pcr) ;
BOOL WINAPI wglShareLists(HGLRC hglrc1,
HGLRC hglrc2) ;
BOOL WINAPI wglSwapLayerBuffers(HDC hdc,
UINT fuPlanes);
BOOL WINAPI wglUseFontBitmaps(HDC hdc,
DWORD first,
DWORD count,
DWORD listBase) ;
BOOL WINAPI wglUseFontOutlines(HDC hdc,
DWORD first,
DWORD count,
DWORD listBase,
FLOAT deviation,
FLOAT extrusion,
int format,
LPGLYPHMETRICSFLOAT lpgmf) ;
#endif /* __DLLS_OPENGL32_WGL_H */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment