Stefan Dösinger : d3d9: Some caps fixes.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Aug 21 07:21:01 CDT 2007


Module: wine
Branch: master
Commit: 01c6c982bb8f2f8c8d5ab786272419d9f6a04684
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=01c6c982bb8f2f8c8d5ab786272419d9f6a04684

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue Aug 21 12:13:42 2007 +0200

d3d9: Some caps fixes.

---

 dlls/d3d9/d3d9_private.h |    2 +
 dlls/d3d9/device.c       |    7 +++++
 dlls/d3d9/directx.c      |   61 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/wined3d/directx.c   |    8 ++++-
 include/d3d9caps.h       |    2 +
 5 files changed, 78 insertions(+), 2 deletions(-)

diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h
index 9049777..160cb67 100644
--- a/dlls/d3d9/d3d9_private.h
+++ b/dlls/d3d9/d3d9_private.h
@@ -155,6 +155,8 @@ typedef struct IDirect3D9Impl
 
 } IDirect3D9Impl;
 
+void filter_caps(D3DCAPS9* pCaps);
+
 /* ---------------- */
 /* IDirect3DDevice9 */
 /* ---------------- */
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index baa11c3..aa65c7e 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -155,11 +155,18 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_GetDeviceCaps(LPDIRECT3DDEVICE9 ifa
         return D3DERR_INVALIDCALL; /* well this is what MSDN says to return */
     }
 
+    memset(pCaps, 0, sizeof(*pCaps));
     D3D9CAPSTOWINECAPS(pCaps, pWineCaps)
     EnterCriticalSection(&d3d9_cs);
     hrc = IWineD3DDevice_GetDeviceCaps(This->WineD3DDevice, pWineCaps);
     LeaveCriticalSection(&d3d9_cs);
     HeapFree(GetProcessHeap(), 0, pWineCaps);
+
+    /* Some functionality is implemented in d3d9.dll, not wined3d.dll. Add the needed caps */
+    pCaps->DevCaps2 |= D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES;
+
+    filter_caps(pCaps);
+
     TRACE("Returning %p %p\n", This, pCaps);
     return hrc;
 }
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index acc95ce..28268f8 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -219,6 +219,63 @@ static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormatConversion(LPDIRECT3D9 ifa
     return hr;
 }
 
+void filter_caps(D3DCAPS9* pCaps)
+{
+
+    DWORD textureFilterCaps =
+        D3DPTFILTERCAPS_MINFPOINT      | D3DPTFILTERCAPS_MINFLINEAR    | D3DPTFILTERCAPS_MINFANISOTROPIC |
+        D3DPTFILTERCAPS_MINFPYRAMIDALQUAD                              | D3DPTFILTERCAPS_MINFGAUSSIANQUAD|
+        D3DPTFILTERCAPS_MIPFPOINT      | D3DPTFILTERCAPS_MIPFLINEAR    | D3DPTFILTERCAPS_MAGFPOINT       |
+        D3DPTFILTERCAPS_MAGFLINEAR     |D3DPTFILTERCAPS_MAGFANISOTROPIC|D3DPTFILTERCAPS_MAGFPYRAMIDALQUAD|
+        D3DPTFILTERCAPS_MAGFGAUSSIANQUAD;
+    pCaps->TextureFilterCaps &= textureFilterCaps;
+    pCaps->CubeTextureFilterCaps &= textureFilterCaps;
+    pCaps->VolumeTextureFilterCaps &= textureFilterCaps;
+
+    pCaps->DevCaps &=
+        D3DDEVCAPS_EXECUTESYSTEMMEMORY | D3DDEVCAPS_EXECUTEVIDEOMEMORY | D3DDEVCAPS_TLVERTEXSYSTEMMEMORY |
+        D3DDEVCAPS_TLVERTEXVIDEOMEMORY | D3DDEVCAPS_TEXTURESYSTEMMEMORY| D3DDEVCAPS_TEXTUREVIDEOMEMORY   |
+        D3DDEVCAPS_DRAWPRIMTLVERTEX    | D3DDEVCAPS_CANRENDERAFTERFLIP | D3DDEVCAPS_TEXTURENONLOCALVIDMEM|
+        D3DDEVCAPS_DRAWPRIMITIVES2     | D3DDEVCAPS_SEPARATETEXTUREMEMORIES                              |
+        D3DDEVCAPS_DRAWPRIMITIVES2EX   | D3DDEVCAPS_HWTRANSFORMANDLIGHT| D3DDEVCAPS_CANBLTSYSTONONLOCAL  |
+        D3DDEVCAPS_HWRASTERIZATION     | D3DDEVCAPS_PUREDEVICE         | D3DDEVCAPS_QUINTICRTPATCHES     |
+        D3DDEVCAPS_RTPATCHES           | D3DDEVCAPS_RTPATCHHANDLEZERO  | D3DDEVCAPS_NPATCHES;
+
+    pCaps->ShadeCaps &=
+        D3DPSHADECAPS_COLORGOURAUDRGB  | D3DPSHADECAPS_SPECULARGOURAUDRGB |
+        D3DPSHADECAPS_ALPHAGOURAUDBLEND | D3DPSHADECAPS_FOGGOURAUD;
+
+    pCaps->RasterCaps &=
+        D3DPRASTERCAPS_DITHER          | D3DPRASTERCAPS_ZTEST          | D3DPRASTERCAPS_FOGVERTEX        |
+        D3DPRASTERCAPS_FOGTABLE        | D3DPRASTERCAPS_MIPMAPLODBIAS  | D3DPRASTERCAPS_ZBUFFERLESSHSR   |
+        D3DPRASTERCAPS_FOGRANGE        | D3DPRASTERCAPS_ANISOTROPY     | D3DPRASTERCAPS_WBUFFER          |
+        D3DPRASTERCAPS_WFOG            | D3DPRASTERCAPS_ZFOG           | D3DPRASTERCAPS_COLORPERSPECTIVE |
+        D3DPRASTERCAPS_SCISSORTEST     | D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS                              |
+        D3DPRASTERCAPS_DEPTHBIAS       | D3DPRASTERCAPS_MULTISAMPLE_TOGGLE;
+
+    pCaps->DevCaps2 &=
+        D3DDEVCAPS2_STREAMOFFSET       | D3DDEVCAPS2_DMAPNPATCH        | D3DDEVCAPS2_ADAPTIVETESSRTPATCH |
+        D3DDEVCAPS2_ADAPTIVETESSNPATCH | D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES                       |
+        D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH| D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET;
+
+    pCaps->Caps2 &=
+        D3DCAPS2_FULLSCREENGAMMA       | D3DCAPS2_CANCALIBRATEGAMMA    | D3DCAPS2_RESERVED               |
+        D3DCAPS2_CANMANAGERESOURCE     | D3DCAPS2_DYNAMICTEXTURES      | D3DCAPS2_CANAUTOGENMIPMAP;
+
+    pCaps->VertexProcessingCaps &=
+        D3DVTXPCAPS_TEXGEN             | D3DVTXPCAPS_MATERIALSOURCE7   | D3DVTXPCAPS_DIRECTIONALLIGHTS   |
+        D3DVTXPCAPS_POSITIONALLIGHTS   | D3DVTXPCAPS_LOCALVIEWER       | D3DVTXPCAPS_TWEENING            |
+        D3DVTXPCAPS_TEXGEN_SPHEREMAP   | D3DVTXPCAPS_NO_TEXGEN_NONLOCALVIEWER;
+
+    pCaps->TextureCaps &=
+        D3DPTEXTURECAPS_PERSPECTIVE    | D3DPTEXTURECAPS_POW2          | D3DPTEXTURECAPS_ALPHA           |
+        D3DPTEXTURECAPS_SQUAREONLY     | D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE                        |
+        D3DPTEXTURECAPS_ALPHAPALETTE   | D3DPTEXTURECAPS_NONPOW2CONDITIONAL                              |
+        D3DPTEXTURECAPS_PROJECTED      | D3DPTEXTURECAPS_CUBEMAP       | D3DPTEXTURECAPS_VOLUMEMAP       |
+        D3DPTEXTURECAPS_MIPMAP         | D3DPTEXTURECAPS_MIPVOLUMEMAP  | D3DPTEXTURECAPS_MIPCUBEMAP      |
+        D3DPTEXTURECAPS_CUBEMAP_POW2   | D3DPTEXTURECAPS_VOLUMEMAP_POW2| D3DPTEXTURECAPS_NOPROJECTEDBUMPENV;
+}
+
 static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) {
     IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
     HRESULT hrc = D3D_OK;
@@ -233,6 +290,7 @@ static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9 iface, UINT Adapt
     if(pWineCaps == NULL){
         return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/
     }
+    memset(pCaps, 0, sizeof(*pCaps));
     D3D9CAPSTOWINECAPS(pCaps, pWineCaps)
     EnterCriticalSection(&d3d9_cs);
     hrc = IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, pWineCaps);
@@ -241,6 +299,9 @@ static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9 iface, UINT Adapt
 
     /* Some functionality is implemented in d3d9.dll, not wined3d.dll. Add the needed caps */
     pCaps->DevCaps2 |= D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES;
+
+    filter_caps(pCaps);
+
     TRACE("(%p) returning %p\n", This, pCaps);
     return hrc;
 }
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 43888bf..0522114 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1974,8 +1974,12 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
                            WINED3DPTEXTURECAPS_BORDER             |
                            WINED3DPTEXTURECAPS_MIPMAP             |
                            WINED3DPTEXTURECAPS_PROJECTED          |
-                           WINED3DPTEXTURECAPS_PERSPECTIVE        |
-                           WINED3DPTEXTURECAPS_NONPOW2CONDITIONAL;
+                           WINED3DPTEXTURECAPS_PERSPECTIVE;
+
+    if( !GL_SUPPORT(ARB_TEXTURE_NON_POWER_OF_TWO)) {
+        *pCaps->TextureCaps |= WINED3DPTEXTURECAPS_POW2 |
+                                WINED3DPTEXTURECAPS_NONPOW2CONDITIONAL;
+    }
 
     if( GL_SUPPORT(EXT_TEXTURE3D)) {
         *pCaps->TextureCaps |=  WINED3DPTEXTURECAPS_VOLUMEMAP      |
diff --git a/include/d3d9caps.h b/include/d3d9caps.h
index 573d459..c66d291 100644
--- a/include/d3d9caps.h
+++ b/include/d3d9caps.h
@@ -171,6 +171,8 @@
 #define D3DPTFILTERCAPS_MINFPOINT                0x00000100
 #define D3DPTFILTERCAPS_MINFLINEAR               0x00000200
 #define D3DPTFILTERCAPS_MINFANISOTROPIC          0x00000400
+#define D3DPTFILTERCAPS_MINFPYRAMIDALQUAD        0x00000800
+#define D3DPTFILTERCAPS_MINFGAUSSIANQUAD         0x00001000
 #define D3DPTFILTERCAPS_MIPFPOINT                0x00010000
 #define D3DPTFILTERCAPS_MIPFLINEAR               0x00020000
 #define D3DPTFILTERCAPS_MAGFPOINT                0x01000000




More information about the wine-cvs mailing list