[D3D] Beginning of better caps support.

Lionel Ulmer lionel.ulmer at free.fr
Sat Jul 26 16:34:46 CDT 2003


This is the beginning of the work needed to get some extensions working
properly in the D3D1-7 code. For the moment, just some basic stuff.

          Lionel

Changelog:
 - better caps support (ie more in line with what GL reports)

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/d3ddevice/mesa.c	Fri Jul 25 22:39:53 2003
+++ dlls/ddraw/d3ddevice/mesa.c	Sat Jul 26 23:31:33 2003
@@ -64,6 +64,9 @@
     0.0, 0.0, 0.0, 1.0
 };
 
+/* This is filled at DLL loading time */
+static D3DDEVICEDESC7 opengl_device_caps;
+
 static void draw_primitive_strided(IDirect3DDeviceImpl *This,
 				   D3DPRIMITIVETYPE d3dptPrimitiveType,
 				   DWORD d3dvtVertexType,
@@ -307,127 +310,53 @@
     LEAVE_GL();
 }
 
-static void fill_opengl_primcaps(D3DPRIMCAPS *pc)
-{
-    pc->dwSize = sizeof(*pc);
-    pc->dwMiscCaps = D3DPMISCCAPS_CONFORMANT | D3DPMISCCAPS_CULLCCW | D3DPMISCCAPS_CULLCW |
-      D3DPMISCCAPS_LINEPATTERNREP | D3DPMISCCAPS_MASKZ;
-    pc->dwRasterCaps = D3DPRASTERCAPS_DITHER | D3DPRASTERCAPS_FOGRANGE | D3DPRASTERCAPS_FOGTABLE |
-      D3DPRASTERCAPS_FOGVERTEX | D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ZBIAS | D3DPRASTERCAPS_ZTEST | D3DPRASTERCAPS_SUBPIXEL;
-    pc->dwZCmpCaps = D3DPCMPCAPS_ALWAYS | D3DPCMPCAPS_EQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_GREATEREQUAL |
-      D3DPCMPCAPS_LESS | D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_NEVER | D3DPCMPCAPS_NOTEQUAL;
-    pc->dwSrcBlendCaps  = D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_DESTCOLOR | D3DPBLENDCAPS_INVDESTCOLOR |
-      D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_SRCALPHASAT |
-	D3DPBLENDCAPS_BOTHSRCALPHA | D3DPBLENDCAPS_BOTHINVSRCALPHA;
-    pc->dwDestBlendCaps = D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | D3DPBLENDCAPS_INVSRCCOLOR |
-      D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_SRCALPHASAT |
-	D3DPBLENDCAPS_BOTHSRCALPHA | D3DPBLENDCAPS_BOTHINVSRCALPHA;
-    pc->dwAlphaCmpCaps  = D3DPCMPCAPS_ALWAYS | D3DPCMPCAPS_EQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_GREATEREQUAL |
-      D3DPCMPCAPS_LESS | D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_NEVER | D3DPCMPCAPS_NOTEQUAL;
-    pc->dwShadeCaps = D3DPSHADECAPS_ALPHAFLATBLEND | D3DPSHADECAPS_ALPHAGOURAUDBLEND | D3DPSHADECAPS_COLORFLATRGB | D3DPSHADECAPS_COLORGOURAUDRGB |
-      D3DPSHADECAPS_FOGFLAT | D3DPSHADECAPS_FOGGOURAUD | D3DPSHADECAPS_SPECULARFLATRGB | D3DPSHADECAPS_SPECULARGOURAUDRGB;
-    pc->dwTextureCaps = D3DPTEXTURECAPS_ALPHA | D3DPTEXTURECAPS_ALPHAPALETTE | D3DPTEXTURECAPS_BORDER | D3DPTEXTURECAPS_PERSPECTIVE |
-      D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_TRANSPARENCY;
-    pc->dwTextureFilterCaps = D3DPTFILTERCAPS_LINEAR | D3DPTFILTERCAPS_LINEARMIPLINEAR | D3DPTFILTERCAPS_LINEARMIPNEAREST |
-      D3DPTFILTERCAPS_MIPLINEAR | D3DPTFILTERCAPS_MIPNEAREST | D3DPTFILTERCAPS_NEAREST;
-    pc->dwTextureBlendCaps = D3DPTBLENDCAPS_ADD | D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_DECAL | D3DPTBLENDCAPS_DECALALPHA | D3DPTBLENDCAPS_DECALMASK |
-      D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_MODULATEALPHA | D3DPTBLENDCAPS_MODULATEMASK;
-    pc->dwTextureAddressCaps = D3DPTADDRESSCAPS_BORDER | D3DPTADDRESSCAPS_CLAMP | D3DPTADDRESSCAPS_WRAP | D3DPTADDRESSCAPS_INDEPENDENTUV;
-    pc->dwStippleWidth = 32;
-    pc->dwStippleHeight = 32;
-}
-
 static void fill_opengl_caps(D3DDEVICEDESC *d1)
 {
-    /* GLint maxlight; */
-
     d1->dwSize  = sizeof(*d1);
-    d1->dwFlags = D3DDD_DEVCAPS | D3DDD_BCLIPPING | D3DDD_COLORMODEL | D3DDD_DEVICERENDERBITDEPTH | D3DDD_DEVICEZBUFFERBITDEPTH
-      | D3DDD_LIGHTINGCAPS | D3DDD_LINECAPS | D3DDD_MAXBUFFERSIZE | D3DDD_MAXVERTEXCOUNT | D3DDD_TRANSFORMCAPS | D3DDD_TRICAPS;
+    d1->dwFlags = D3DDD_COLORMODEL | D3DDD_DEVCAPS | D3DDD_TRANSFORMCAPS | D3DDD_BCLIPPING | D3DDD_LIGHTINGCAPS |
+	D3DDD_LINECAPS | D3DDD_TRICAPS | D3DDD_DEVICERENDERBITDEPTH | D3DDD_DEVICEZBUFFERBITDEPTH |
+	D3DDD_MAXBUFFERSIZE | D3DDD_MAXVERTEXCOUNT;
     d1->dcmColorModel = D3DCOLOR_RGB;
-    d1->dwDevCaps = D3DDEVCAPS_CANRENDERAFTERFLIP | D3DDEVCAPS_DRAWPRIMTLVERTEX | D3DDEVCAPS_EXECUTESYSTEMMEMORY |
-      D3DDEVCAPS_EXECUTEVIDEOMEMORY | D3DDEVCAPS_FLOATTLVERTEX | D3DDEVCAPS_TEXTURENONLOCALVIDMEM | D3DDEVCAPS_TEXTURESYSTEMMEMORY |
-      D3DDEVCAPS_TEXTUREVIDEOMEMORY | D3DDEVCAPS_TLVERTEXSYSTEMMEMORY | D3DDEVCAPS_TLVERTEXVIDEOMEMORY |
-      /* D3D 7 capabilities */
-      D3DDEVCAPS_DRAWPRIMITIVES2 | D3DDEVCAPS_HWTRANSFORMANDLIGHT | D3DDEVCAPS_HWRASTERIZATION;
+    d1->dwDevCaps = opengl_device_caps.dwDevCaps;
     d1->dtcTransformCaps.dwSize = sizeof(D3DTRANSFORMCAPS);
     d1->dtcTransformCaps.dwCaps = D3DTRANSFORMCAPS_CLIP;
     d1->bClipping = TRUE;
     d1->dlcLightingCaps.dwSize = sizeof(D3DLIGHTINGCAPS);
     d1->dlcLightingCaps.dwCaps = D3DLIGHTCAPS_DIRECTIONAL | D3DLIGHTCAPS_PARALLELPOINT | D3DLIGHTCAPS_POINT | D3DLIGHTCAPS_SPOT;
     d1->dlcLightingCaps.dwLightingModel = D3DLIGHTINGMODEL_RGB;
-    d1->dlcLightingCaps.dwNumLights = 16; /* glGetIntegerv(GL_MAX_LIGHTS, &maxlight); d1->dlcLightingCaps.dwNumLights = maxlight; */
-    fill_opengl_primcaps(&(d1->dpcLineCaps));
-    fill_opengl_primcaps(&(d1->dpcTriCaps));
-    d1->dwDeviceRenderBitDepth  = DDBD_16|DDBD_24|DDBD_32;
-    d1->dwDeviceZBufferBitDepth = DDBD_16|DDBD_24|DDBD_32;
+    d1->dlcLightingCaps.dwNumLights = opengl_device_caps.dwMaxActiveLights;
+    d1->dpcLineCaps = opengl_device_caps.dpcLineCaps;
+    d1->dpcTriCaps = opengl_device_caps.dpcTriCaps;
+    d1->dwDeviceRenderBitDepth  = opengl_device_caps.dwDeviceRenderBitDepth;
+    d1->dwDeviceZBufferBitDepth = opengl_device_caps.dwDeviceZBufferBitDepth;
     d1->dwMaxBufferSize = 0;
     d1->dwMaxVertexCount = 65536;
-    d1->dwMinTextureWidth  = 1;
-    d1->dwMinTextureHeight = 1;
-    d1->dwMaxTextureWidth  = 1024;
-    d1->dwMaxTextureHeight = 1024;
+    d1->dwMinTextureWidth  = opengl_device_caps.dwMinTextureWidth;
+    d1->dwMinTextureHeight = opengl_device_caps.dwMinTextureHeight;
+    d1->dwMaxTextureWidth  = opengl_device_caps.dwMaxTextureWidth;
+    d1->dwMaxTextureHeight = opengl_device_caps.dwMaxTextureHeight;
     d1->dwMinStippleWidth  = 1;
     d1->dwMinStippleHeight = 1;
     d1->dwMaxStippleWidth  = 32;
     d1->dwMaxStippleHeight = 32;
-    d1->dwMaxTextureRepeat = 16;
-    d1->dwMaxTextureAspectRatio = 1024;
-    d1->dwMaxAnisotropy = 0;
-    d1->dvGuardBandLeft = 0.0;
-    d1->dvGuardBandRight = 0.0;
-    d1->dvGuardBandTop = 0.0;
-    d1->dvGuardBandBottom = 0.0;
-    d1->dvExtentsAdjust = 0.0;
-    d1->dwStencilCaps = D3DSTENCILCAPS_DECRSAT | D3DSTENCILCAPS_INCRSAT | D3DSTENCILCAPS_INVERT | D3DSTENCILCAPS_KEEP |
-      D3DSTENCILCAPS_REPLACE | D3DSTENCILCAPS_ZERO;
-    d1->dwFVFCaps = D3DFVFCAPS_DONOTSTRIPELEMENTS | 1;
-    d1->dwTextureOpCaps = 0; /* TODO add proper caps according to OpenGL multi-texture stuff */
-    d1->wMaxTextureBlendStages = 1;  /* TODO add proper caps according to OpenGL multi-texture stuff */
-    d1->wMaxSimultaneousTextures = 1;  /* TODO add proper caps according to OpenGL multi-texture stuff */
+    d1->dwMaxTextureRepeat = opengl_device_caps.dwMaxTextureRepeat;
+    d1->dwMaxTextureAspectRatio = opengl_device_caps.dwMaxTextureAspectRatio;
+    d1->dwMaxAnisotropy = opengl_device_caps.dwMaxAnisotropy;
+    d1->dvGuardBandLeft = opengl_device_caps.dvGuardBandLeft;
+    d1->dvGuardBandRight = opengl_device_caps.dvGuardBandRight;
+    d1->dvGuardBandTop = opengl_device_caps.dvGuardBandTop;
+    d1->dvGuardBandBottom = opengl_device_caps.dvGuardBandBottom;
+    d1->dvExtentsAdjust = opengl_device_caps.dvExtentsAdjust;
+    d1->dwStencilCaps = opengl_device_caps.dwStencilCaps;
+    d1->dwFVFCaps = opengl_device_caps.dwFVFCaps;
+    d1->dwTextureOpCaps = opengl_device_caps.dwTextureOpCaps;
+    d1->wMaxTextureBlendStages = opengl_device_caps.wMaxTextureBlendStages;
+    d1->wMaxSimultaneousTextures = opengl_device_caps.wMaxSimultaneousTextures;
 }
 
 static void fill_opengl_caps_7(D3DDEVICEDESC7 *d)
 {
-    D3DDEVICEDESC d1;
-
-    /* Copy first D3D1/2/3 capabilities */
-    fill_opengl_caps(&d1);
-
-    /* And fill the D3D7 one with it */
-    d->dwDevCaps = d1.dwDevCaps;
-    d->dpcLineCaps = d1.dpcLineCaps;
-    d->dpcTriCaps = d1.dpcTriCaps;
-    d->dwDeviceRenderBitDepth = d1.dwDeviceRenderBitDepth;
-    d->dwDeviceZBufferBitDepth = d1.dwDeviceZBufferBitDepth;
-    d->dwMinTextureWidth = d1.dwMinTextureWidth;
-    d->dwMinTextureHeight = d1.dwMinTextureHeight;
-    d->dwMaxTextureWidth = d1.dwMaxTextureWidth;
-    d->dwMaxTextureHeight = d1.dwMaxTextureHeight;
-    d->dwMaxTextureRepeat = d1.dwMaxTextureRepeat;
-    d->dwMaxTextureAspectRatio = d1.dwMaxTextureAspectRatio;
-    d->dwMaxAnisotropy = d1.dwMaxAnisotropy;
-    d->dvGuardBandLeft = d1.dvGuardBandLeft;
-    d->dvGuardBandTop = d1.dvGuardBandTop;
-    d->dvGuardBandRight = d1.dvGuardBandRight;
-    d->dvGuardBandBottom = d1.dvGuardBandBottom;
-    d->dvExtentsAdjust = d1.dvExtentsAdjust;
-    d->dwStencilCaps = d1.dwStencilCaps;
-    d->dwFVFCaps = d1.dwFVFCaps;
-    d->dwTextureOpCaps = d1.dwTextureOpCaps;
-    d->wMaxTextureBlendStages = d1.wMaxTextureBlendStages;
-    d->wMaxSimultaneousTextures = d1.wMaxSimultaneousTextures;
-    d->dwMaxActiveLights = d1.dlcLightingCaps.dwNumLights;
-    d->dvMaxVertexW = 100000000.0; /* No idea exactly what to put here... */
-    d->deviceGUID = IID_IDirect3DTnLHalDevice;
-    d->wMaxUserClipPlanes = 1;
-    d->wMaxVertexBlendMatrices = 0;
-    d->dwVertexProcessingCaps = D3DVTXPCAPS_TEXGEN | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_VERTEXFOG | D3DVTXPCAPS_DIRECTIONALLIGHTS |
-      D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_LOCALVIEWER;
-    d->dwReserved1 = 0;
-    d->dwReserved2 = 0;
-    d->dwReserved3 = 0;
-    d->dwReserved4 = 0;
+    *d = opengl_device_caps;
 }
 
 HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD version)
@@ -3654,7 +3583,6 @@
     XVisualInfo template;
     GLenum buffer = GL_FRONT;
     int light;
-    GLint max_clipping_planes = 0;
     
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DDeviceGLImpl));
     if (object == NULL) return DDERR_OUTOFMEMORY;
@@ -3774,13 +3702,7 @@
     TRACE(" current context set\n");
 
     /* allocate the clipping planes */
-    glGetIntegerv(GL_MAX_CLIP_PLANES,&max_clipping_planes);
-    if (max_clipping_planes>32) {
-	object->max_clipping_planes=32;
-    } else {
-	object->max_clipping_planes = max_clipping_planes;
-    }
-    TRACE(" capable of %d clipping planes\n", (int)object->max_clipping_planes );
+    object->max_clipping_planes = opengl_device_caps.wMaxUserClipPlanes;
     object->clipping_planes = (d3d7clippingplane*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->max_clipping_planes * sizeof(d3d7clippingplane));
 
     glHint(GL_FOG_HINT,GL_NICEST);
@@ -3835,4 +3757,154 @@
     build_fog_table(gl_object->fog_table, object->state_block.render_state[D3DRENDERSTATE_FOGCOLOR - 1]);
     
     return DD_OK;
+}
+
+static void fill_opengl_primcaps(D3DPRIMCAPS *pc)
+{
+    pc->dwSize = sizeof(*pc);
+    pc->dwMiscCaps = D3DPMISCCAPS_CONFORMANT | D3DPMISCCAPS_CULLCCW | D3DPMISCCAPS_CULLCW |
+      D3DPMISCCAPS_LINEPATTERNREP | D3DPMISCCAPS_MASKZ;
+    pc->dwRasterCaps = D3DPRASTERCAPS_DITHER | D3DPRASTERCAPS_FOGRANGE | D3DPRASTERCAPS_FOGTABLE |
+      D3DPRASTERCAPS_FOGVERTEX | D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ZBIAS | D3DPRASTERCAPS_ZTEST | D3DPRASTERCAPS_SUBPIXEL;
+    pc->dwZCmpCaps = D3DPCMPCAPS_ALWAYS | D3DPCMPCAPS_EQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_GREATEREQUAL |
+      D3DPCMPCAPS_LESS | D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_NEVER | D3DPCMPCAPS_NOTEQUAL;
+    pc->dwSrcBlendCaps  = D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_DESTCOLOR | D3DPBLENDCAPS_INVDESTCOLOR |
+      D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_SRCALPHASAT |
+	D3DPBLENDCAPS_BOTHSRCALPHA | D3DPBLENDCAPS_BOTHINVSRCALPHA;
+    pc->dwDestBlendCaps = D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | D3DPBLENDCAPS_INVSRCCOLOR |
+      D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_SRCALPHASAT |
+	D3DPBLENDCAPS_BOTHSRCALPHA | D3DPBLENDCAPS_BOTHINVSRCALPHA;
+    pc->dwAlphaCmpCaps  = D3DPCMPCAPS_ALWAYS | D3DPCMPCAPS_EQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_GREATEREQUAL |
+      D3DPCMPCAPS_LESS | D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_NEVER | D3DPCMPCAPS_NOTEQUAL;
+    pc->dwShadeCaps = D3DPSHADECAPS_ALPHAFLATBLEND | D3DPSHADECAPS_ALPHAGOURAUDBLEND | D3DPSHADECAPS_COLORFLATRGB | D3DPSHADECAPS_COLORGOURAUDRGB |
+      D3DPSHADECAPS_FOGFLAT | D3DPSHADECAPS_FOGGOURAUD | D3DPSHADECAPS_SPECULARFLATRGB | D3DPSHADECAPS_SPECULARGOURAUDRGB;
+    pc->dwTextureCaps = D3DPTEXTURECAPS_ALPHA | D3DPTEXTURECAPS_ALPHAPALETTE | D3DPTEXTURECAPS_BORDER | D3DPTEXTURECAPS_PERSPECTIVE |
+      D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_TRANSPARENCY;
+    pc->dwTextureFilterCaps = D3DPTFILTERCAPS_LINEAR | D3DPTFILTERCAPS_LINEARMIPLINEAR | D3DPTFILTERCAPS_LINEARMIPNEAREST |
+      D3DPTFILTERCAPS_MIPLINEAR | D3DPTFILTERCAPS_MIPNEAREST | D3DPTFILTERCAPS_NEAREST;
+    pc->dwTextureBlendCaps = D3DPTBLENDCAPS_ADD | D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_DECAL | D3DPTBLENDCAPS_DECALALPHA | D3DPTBLENDCAPS_DECALMASK |
+      D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_MODULATEALPHA | D3DPTBLENDCAPS_MODULATEMASK;
+    pc->dwTextureAddressCaps = D3DPTADDRESSCAPS_BORDER | D3DPTADDRESSCAPS_CLAMP | D3DPTADDRESSCAPS_WRAP | D3DPTADDRESSCAPS_INDEPENDENTUV;
+    pc->dwStippleWidth = 32;
+    pc->dwStippleHeight = 32;
+}
+
+static void fill_caps(void)
+{
+    GLint max_clip_planes;
+    
+    /* Fill first all the fields with default values which will be overriden later on with
+       corrent one from the GL code
+    */
+    opengl_device_caps.dwDevCaps = D3DDEVCAPS_CANRENDERAFTERFLIP | D3DDEVCAPS_DRAWPRIMTLVERTEX | D3DDEVCAPS_EXECUTESYSTEMMEMORY |
+      D3DDEVCAPS_EXECUTEVIDEOMEMORY | D3DDEVCAPS_FLOATTLVERTEX | D3DDEVCAPS_TEXTURENONLOCALVIDMEM | D3DDEVCAPS_TEXTURESYSTEMMEMORY |
+      D3DDEVCAPS_TEXTUREVIDEOMEMORY | D3DDEVCAPS_TLVERTEXSYSTEMMEMORY | D3DDEVCAPS_TLVERTEXVIDEOMEMORY |
+      /* D3D 7 capabilities */
+      D3DDEVCAPS_DRAWPRIMITIVES2 | D3DDEVCAPS_HWTRANSFORMANDLIGHT | D3DDEVCAPS_HWRASTERIZATION;
+    fill_opengl_primcaps(&(opengl_device_caps.dpcLineCaps));
+    fill_opengl_primcaps(&(opengl_device_caps.dpcTriCaps));
+    opengl_device_caps.dwDeviceRenderBitDepth  = DDBD_16|DDBD_24|DDBD_32;
+    opengl_device_caps.dwDeviceZBufferBitDepth = DDBD_16|DDBD_24|DDBD_32;
+    opengl_device_caps.dwMinTextureWidth  = 1;
+    opengl_device_caps.dwMinTextureHeight = 1;
+    opengl_device_caps.dwMaxTextureWidth  = 1024;
+    opengl_device_caps.dwMaxTextureHeight = 1024;
+    opengl_device_caps.dwMaxTextureRepeat = 16;
+    opengl_device_caps.dwMaxTextureAspectRatio = 1024;
+    opengl_device_caps.dwMaxAnisotropy = 0;
+    opengl_device_caps.dvGuardBandLeft = 0.0;
+    opengl_device_caps.dvGuardBandRight = 0.0;
+    opengl_device_caps.dvGuardBandTop = 0.0;
+    opengl_device_caps.dvGuardBandBottom = 0.0;
+    opengl_device_caps.dvExtentsAdjust = 0.0;
+    opengl_device_caps.dwStencilCaps = D3DSTENCILCAPS_DECRSAT | D3DSTENCILCAPS_INCRSAT | D3DSTENCILCAPS_INVERT | D3DSTENCILCAPS_KEEP |
+      D3DSTENCILCAPS_REPLACE | D3DSTENCILCAPS_ZERO;
+    opengl_device_caps.dwFVFCaps = D3DFVFCAPS_DONOTSTRIPELEMENTS | 1;
+    opengl_device_caps.dwTextureOpCaps = 0;
+    opengl_device_caps.wMaxTextureBlendStages = 1;
+    opengl_device_caps.wMaxSimultaneousTextures = 1;
+    opengl_device_caps.dwMaxActiveLights = 16;
+    opengl_device_caps.dvMaxVertexW = 100000000.0; /* No idea exactly what to put here... */
+    opengl_device_caps.deviceGUID = IID_IDirect3DTnLHalDevice;
+    opengl_device_caps.wMaxUserClipPlanes = 1;
+    opengl_device_caps.wMaxVertexBlendMatrices = 0;
+    opengl_device_caps.dwVertexProcessingCaps = D3DVTXPCAPS_TEXGEN | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_VERTEXFOG |
+	D3DVTXPCAPS_DIRECTIONALLIGHTS | D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_LOCALVIEWER;
+    opengl_device_caps.dwReserved1 = 0;
+    opengl_device_caps.dwReserved2 = 0;
+    opengl_device_caps.dwReserved3 = 0;
+    opengl_device_caps.dwReserved4 = 0;
+
+    /* And now some GL overides :-) */
+    glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint *) &opengl_device_caps.dwMaxTextureWidth);
+    opengl_device_caps.dwMaxTextureHeight = opengl_device_caps.dwMaxTextureWidth;
+    opengl_device_caps.dwMaxTextureAspectRatio = opengl_device_caps.dwMaxTextureWidth;
+    TRACE(": max texture size = %ld\n", opengl_device_caps.dwMaxTextureWidth);
+    
+    glGetIntegerv(GL_MAX_LIGHTS, (GLint *) &opengl_device_caps.dwMaxActiveLights);
+    TRACE(": max active lights = %ld\n", opengl_device_caps.dwMaxActiveLights);
+
+    glGetIntegerv(GL_MAX_CLIP_PLANES, &max_clip_planes);
+    opengl_device_caps.wMaxUserClipPlanes = max_clip_planes;
+    TRACE(": max clipping planes = %d\n", opengl_device_caps.wMaxUserClipPlanes);
+}
+
+BOOL
+d3ddevice_init_at_startup(void *gl_handle)
+{
+    XVisualInfo template;
+    XVisualInfo *vis;
+    HDC device_context;
+    Display *display;
+    Visual *visual;
+    Drawable drawable = (Drawable) GetPropA(GetDesktopWindow(), "__wine_x11_whole_window");
+    XWindowAttributes win_attr;
+    GLXContext gl_context;
+    int num;
+
+    TRACE("Initializing GL...\n");
+    
+    /* Get a default rendering context to have the 'caps' function query some info from GL */    
+    device_context = GetDC(0);
+    display = get_display(device_context);
+    ReleaseDC(0, device_context);
+
+    ENTER_GL();
+    if (XGetWindowAttributes(display, drawable, &win_attr)) {
+	visual = win_attr.visual;
+    } else {
+	visual = DefaultVisual(display, DefaultScreen(display));
+    }
+    template.visualid = XVisualIDFromVisual(visual);
+    vis = XGetVisualInfo(display, VisualIDMask, &template, &num);
+    if (vis == NULL) {
+	LEAVE_GL();
+	WARN("Error creating visual info for capabilities initialization - D3D support disabled !\n");
+	return FALSE;
+    }
+    gl_context = glXCreateContext(display, vis, NULL, GL_TRUE);
+
+    if (gl_context == NULL) {
+	LEAVE_GL();
+	WARN("Error creating default context for capabilities initialization - D3D support disabled !\n");
+	return FALSE;
+    }
+    if (glXMakeCurrent(display, drawable, gl_context) == False) {
+	glXDestroyContext(display, gl_context);
+	LEAVE_GL();
+	WARN("Error setting default context as current for capabilities initialization - D3D support disabled !\n");
+	return FALSE;	
+    }
+    
+    /* Then, query all extensions and fill our extension context. TODO :-) */
+    
+    /* Fill the D3D capabilities according to what GL tells us... */
+    fill_caps();
+
+    /* And frees this now-useless context */
+    glXMakeCurrent(display, None, NULL);
+    glXDestroyContext(display, gl_context);
+    LEAVE_GL();
+    
+    return TRUE;
 }
--- dlls/ddraw_CVS/main.c	Wed Jul  2 22:31:10 2003
+++ dlls/ddraw/main.c	Sat Jul 26 22:20:26 2003
@@ -67,6 +67,8 @@
 
 #ifdef HAVE_OPENGL
 
+#include "mesa_private.h"
+
 static void *gl_handle = NULL;
 
 #define GL_API_FUNCTION(f) typeof(f) * p##f;
@@ -80,7 +82,8 @@
 static BOOL DDRAW_bind_to_opengl( void )
 {
     char *glname = SONAME_LIBGL;
-
+    BOOL ret_value;
+    
     gl_handle = wine_dlopen(glname, RTLD_NOW, NULL, 0);
     if (!gl_handle) {
         WARN("Wine cannot find the OpenGL graphics library (%s).\n",glname);
@@ -96,8 +99,13 @@
 #include "gl_api.h"
 #undef GL_API_FUNCTION
 
-    return TRUE;
+    /* And now calls the function to initialize the various fields for the rendering devices */
+    ret_value = d3ddevice_init_at_startup(gl_handle);
 
+    wine_dlclose(gl_handle, NULL, 0);
+    gl_handle = NULL;
+    return ret_value;
+    
 sym_not_found:
     WARN("Wine cannot find certain functions that it needs inside the OpenGL\n"
 	 "graphics library.  To enable Wine to use OpenGL please upgrade\n"
--- dlls/ddraw_CVS/mesa_private.h	Wed Jun 18 23:14:02 2003
+++ dlls/ddraw/mesa_private.h	Sat Jul 26 22:20:40 2003
@@ -169,6 +169,9 @@
 extern HRESULT d3ddevice_enumerate7(LPD3DENUMDEVICESCALLBACK7 cb, LPVOID context) ;
 extern HRESULT d3ddevice_find(IDirectDrawImpl *d3d, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lplpD3DDevice);
 
+/* Used by the DLL init routine to set-up the GL context and stuff properly */
+extern BOOL d3ddevice_init_at_startup(void *gl_handle);
+
 /* Used to upload the texture */
 extern HRESULT gltex_upload_texture(IDirectDrawSurfaceImpl *This, IDirect3DDeviceImpl *d3ddev, DWORD stage) ;
 


More information about the wine-patches mailing list