diff -urN wine.20050419/configure wine.20050419.dx9/configure --- wine.20050419/configure 2005-04-19 06:54:44.000000000 -0600 +++ wine.20050419.dx9/configure 2005-04-20 03:02:02.000000000 -0600 @@ -20054,7 +20054,7 @@ MAKE_PROG_RULES=programs/Makeprog.rules - ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/advpack/Makefile dlls/advpack/tests/Makefile dlls/amstream/Makefile dlls/atl/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/capi2032/Makefile dlls/cards/Makefile dlls/cfgmgr32/Makefile dlls/comcat/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/cryptdll/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3drm/Makefile dlls/d3dx8/Makefile dlls/d3dxof/Makefile dlls/dbghelp/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnet/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/dswave/Makefile dlls/dxdiagn/Makefile dlls/dxerr8/Makefile dlls/dxerr9/Makefile dlls/dxguid/Makefile dlls/gdi/Makefile dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/glut32/Makefile dlls/hhctrl.ocx/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile dlls/ifsmgr.vxd/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/itss/Makefile dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile dlls/lzexpand/tests/Makefile dlls/mapi32/Makefile dlls/mapi32/tests/Makefile dlls/mlang/Makefile dlls/mlang/tests/Makefile dlls/mmdevldr.vxd/Makefile dlls/monodebg.vxd/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile dlls/msacm/tests/Makefile dlls/mscms/Makefile dlls/mscms/tests/Makefile dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/msi/Makefile dlls/msi/tests/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvcrtd/tests/Makefile dlls/msvidc32/Makefile dlls/msvideo/Makefile dlls/mswsock/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/ole32/tests/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/psapi/tests/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/quartz/tests/Makefile dlls/rasapi32/Makefile dlls/riched20/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/rsabase/tests/Makefile dlls/rsaenh/Makefile dlls/rsaenh/tests/Makefile dlls/secur32/Makefile dlls/sensapi/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/stdole32.tlb/Makefile dlls/sti/Makefile dlls/strmiids/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/unicows/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user/Makefile dlls/user/tests/Makefile dlls/uuid/Makefile dlls/uxtheme/Makefile dlls/vdhcp.vxd/Makefile dlls/vdmdbg/Makefile dlls/version/Makefile dlls/version/tests/Makefile dlls/vmm.vxd/Makefile dlls/vnbt.vxd/Makefile dlls/vnetbios.vxd/Makefile dlls/vtdapi.vxd/Makefile dlls/vwin32.vxd/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/tests/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winealsa/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineaudioio/Makefile dlls/winmm/winejack/Makefile dlls/winmm/winenas/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winsock/tests/Makefile dlls/winspool/Makefile dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/wtsapi32/Makefile dlls/x11drv/Makefile documentation/Makefile fonts/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/unicode/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile programs/msiexec/Makefile programs/notepad/Makefile programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/taskmgr/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineboot/Makefile programs/winebrowser/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/winegcc/Makefile tools/wmc/Makefile tools/wrc/Makefile" + ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/advpack/Makefile dlls/advpack/tests/Makefile dlls/amstream/Makefile dlls/atl/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/capi2032/Makefile dlls/cards/Makefile dlls/cfgmgr32/Makefile dlls/comcat/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/cryptdll/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3drm/Makefile dlls/d3dx8/Makefile dlls/d3dx9/Makefile dlls/d3dxof/Makefile dlls/dbghelp/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnet/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/dswave/Makefile dlls/dxdiagn/Makefile dlls/dxerr8/Makefile dlls/dxerr9/Makefile dlls/dxguid/Makefile dlls/gdi/Makefile dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/glut32/Makefile dlls/hhctrl.ocx/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile dlls/ifsmgr.vxd/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/itss/Makefile dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile dlls/lzexpand/tests/Makefile dlls/mapi32/Makefile dlls/mapi32/tests/Makefile dlls/mlang/Makefile dlls/mlang/tests/Makefile dlls/mmdevldr.vxd/Makefile dlls/monodebg.vxd/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile dlls/msacm/tests/Makefile dlls/mscms/Makefile dlls/mscms/tests/Makefile dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/msi/Makefile dlls/msi/tests/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvcrtd/tests/Makefile dlls/msvidc32/Makefile dlls/msvideo/Makefile dlls/mswsock/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/ole32/tests/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/psapi/tests/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/quartz/tests/Makefile dlls/rasapi32/Makefile dlls/riched20/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/rsabase/tests/Makefile dlls/rsaenh/Makefile dlls/rsaenh/tests/Makefile dlls/secur32/Makefile dlls/sensapi/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/stdole32.tlb/Makefile dlls/sti/Makefile dlls/strmiids/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/unicows/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user/Makefile dlls/user/tests/Makefile dlls/uuid/Makefile dlls/uxtheme/Makefile dlls/vdhcp.vxd/Makefile dlls/vdmdbg/Makefile dlls/version/Makefile dlls/version/tests/Makefile dlls/vmm.vxd/Makefile dlls/vnbt.vxd/Makefile dlls/vnetbios.vxd/Makefile dlls/vtdapi.vxd/Makefile dlls/vwin32.vxd/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/tests/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winealsa/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineaudioio/Makefile dlls/winmm/winejack/Makefile dlls/winmm/winenas/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winsock/tests/Makefile dlls/winspool/Makefile dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/wtsapi32/Makefile dlls/x11drv/Makefile documentation/Makefile fonts/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/unicode/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile programs/msiexec/Makefile programs/notepad/Makefile programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/taskmgr/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineboot/Makefile programs/winebrowser/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/winegcc/Makefile tools/wmc/Makefile tools/wrc/Makefile" cat >confcache <<\_ACEOF @@ -20617,6 +20617,7 @@ "dlls/d3dim/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/d3dim/Makefile" ;; "dlls/d3drm/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/d3drm/Makefile" ;; "dlls/d3dx8/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/d3dx8/Makefile" ;; + "dlls/d3dx9/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/d3dx9/Makefile" ;; "dlls/d3dxof/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/d3dxof/Makefile" ;; "dlls/dbghelp/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/dbghelp/Makefile" ;; "dlls/dciman32/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/dciman32/Makefile" ;; diff -urN wine.20050419/configure.ac wine.20050419.dx9/configure.ac --- wine.20050419/configure.ac 2005-03-28 02:58:45.000000000 -0700 +++ wine.20050419.dx9/configure.ac 2005-04-20 01:52:56.000000000 -0600 @@ -1536,6 +1536,7 @@ dlls/d3dim/Makefile dlls/d3drm/Makefile dlls/d3dx8/Makefile +dlls/d3dx9/Makefile dlls/d3dxof/Makefile dlls/dbghelp/Makefile dlls/dciman32/Makefile diff -urN wine.20050419/dlls/Makefile.in wine.20050419.dx9/dlls/Makefile.in --- wine.20050419/dlls/Makefile.in 2005-03-05 04:19:14.000000000 -0700 +++ wine.20050419.dx9/dlls/Makefile.in 2005-04-20 01:52:56.000000000 -0600 @@ -9,7 +9,7 @@ GLU32FILES = glu32 GLUT32FILES = glut32 -OPENGLFILES = d3d8 d3d9 d3dx8 opengl32 wined3d +OPENGLFILES = d3d8 d3d9 d3dx8 d3dx9 opengl32 wined3d XFILES = ddraw x11drv EXTRADIRS = @GLU32FILES@ @GLUT32FILES@ @OPENGLFILES@ @XFILES@ @@ -174,6 +174,7 @@ d3d8 \ d3d9 \ d3dx8 \ + d3dx9 \ ddraw \ dxerr8 \ dxerr9 \ @@ -494,6 +495,9 @@ d3dx8.dll.so: d3dx8/d3dx8.dll.so $(RM) $@ && $(LN_S) d3dx8/d3dx8.dll.so $@ +d3dx9.dll.so: d3dx9/d3dx9.dll.so + $(RM) $@ && $(LN_S) d3dx9/d3dx9.dll.so $@ + d3dxof.dll.so: d3dxof/d3dxof.dll.so $(RM) $@ && $(LN_S) d3dxof/d3dxof.dll.so $@ @@ -1003,7 +1007,6 @@ libuuid.a: uuid/libuuid.a $(RM) $@ && $(LN_S) uuid/libuuid.a $@ - # Import libraries IMPORT_LIBS = \ @@ -1029,6 +1032,7 @@ libd3dim.$(IMPLIBEXT) \ libd3drm.$(IMPLIBEXT) \ libd3dx8.$(IMPLIBEXT) \ + libd3dx9.$(IMPLIBEXT) \ libd3dxof.$(IMPLIBEXT) \ libdbghelp.$(IMPLIBEXT) \ libdciman32.$(IMPLIBEXT) \ @@ -1256,6 +1260,11 @@ libd3dx8.a: d3dx8/d3dx8.spec.def $(DLLTOOL) -k -l $@ -d d3dx8/d3dx8.spec.def +libd3dx9.def: d3dx9/d3dx9.spec.def + $(RM) $@ && $(LN_S) d3dx9/d3dx9.spec.def $@ +libd3dx9.a: d3dx9/d3dx9.spec.def + $(DLLTOOL) -k -l $@ -d d3dx9/d3dx9.spec.def + libd3dxof.def: d3dxof/d3dxof.spec.def $(RM) $@ && $(LN_S) d3dxof/d3dxof.spec.def $@ libd3dxof.a: d3dxof/d3dxof.spec.def @@ -1823,6 +1832,7 @@ d3dim/d3dim.spec.def: $(WINEBUILD) d3drm/d3drm.spec.def: $(WINEBUILD) d3dx8/d3dx8.spec.def: $(WINEBUILD) +d3dx9/d3dx9.spec.def: $(WINEBUILD) d3dxof/d3dxof.spec.def: $(WINEBUILD) dbghelp/dbghelp.spec.def: $(WINEBUILD) dciman32/dciman32.spec.def: $(WINEBUILD) @@ -1960,6 +1970,7 @@ d3dim/d3dim.dll.so: d3dim d3drm/d3drm.dll.so: d3drm d3dx8/d3dx8.dll.so: d3dx8 +d3dx9/d3dx9.dll.so: d3dx9 d3dxof/d3dxof.dll.so: d3dxof dbghelp/dbghelp.dll.so: dbghelp dciman32/dciman32.dll.so: dciman32 diff -urN wine.20050419/dlls/d3d8/d3d8_private.h wine.20050419.dx9/dlls/d3d8/d3d8_private.h --- wine.20050419/dlls/d3d8/d3d8_private.h 2005-03-23 06:15:20.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d8/d3d8_private.h 2005-04-20 01:52:56.000000000 -0600 @@ -596,6 +596,9 @@ /* OpenGL/GLX related */ GLXContext swap_ctx; Drawable swap_drawable; + + /* ready for when we move over to wined3d */ + IWineD3DSwapChain *wineD3DSwapChain; }; /* IUnknown: */ diff -urN wine.20050419/dlls/d3d8/device.c wine.20050419.dx9/dlls/d3d8/device.c --- wine.20050419/dlls/d3d8/device.c 2005-03-23 06:15:20.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d8/device.c 2005-04-20 01:52:56.000000000 -0600 @@ -70,6 +70,12 @@ memcpy(gl_mat, (mat), 16 * sizeof(float)); \ } while (0) + +/*internal function, (static) */ + +HRESULT WINAPI IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 , UINT , UINT , D3DFORMAT , BOOL Lockable, + IDirect3DSurface8** ppSurface, D3DRESOURCETYPE , UINT ,D3DPOOL , D3DMULTISAMPLE_TYPE ); + /* Apply the current values to the specified texture stage */ void setupTextureStates(LPDIRECT3DDEVICE8 iface, DWORD Stage, DWORD Flags) { IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; @@ -352,9 +358,90 @@ } HRESULT WINAPI IDirect3DDevice8Impl_GetDeviceCaps(LPDIRECT3DDEVICE8 iface, D3DCAPS8* pCaps) { IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - FIXME("(%p) : stub, calling idirect3d for now\n", This); - IDirect3D8Impl_GetDeviceCaps((LPDIRECT3D8) This->direct3d8, This->adapterNo, This->devType, pCaps); - return D3D_OK; + HRESULT hrc = D3D_OK; + WINED3DCAPS *pWineCaps = NULL; + + if(NULL == pCaps){ + return D3DERR_INVALIDCALL; + } + + pWineCaps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINED3DCAPS)); + if(pWineCaps == NULL){ + return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/ + } + pWineCaps->DeviceType = &pCaps->DeviceType; + pWineCaps->AdapterOrdinal = &pCaps->AdapterOrdinal; + pWineCaps->Caps = &pCaps->Caps; + pWineCaps->Caps2 = &pCaps->Caps2; + pWineCaps->Caps3 = &pCaps->Caps3; + pWineCaps->PresentationIntervals = &pCaps->PresentationIntervals; + pWineCaps->CursorCaps = &pCaps->CursorCaps; + pWineCaps->DevCaps = &pCaps->DevCaps; + pWineCaps->PrimitiveMiscCaps = &pCaps->PrimitiveMiscCaps; + pWineCaps->RasterCaps = &pCaps->RasterCaps; + pWineCaps->ZCmpCaps = &pCaps->ZCmpCaps; + pWineCaps->SrcBlendCaps = &pCaps->SrcBlendCaps; + pWineCaps->DestBlendCaps = &pCaps->DestBlendCaps; + pWineCaps->AlphaCmpCaps = &pCaps->AlphaCmpCaps; + pWineCaps->ShadeCaps = &pCaps->ShadeCaps; + pWineCaps->TextureCaps = &pCaps->TextureCaps; + pWineCaps->TextureFilterCaps = &pCaps->TextureFilterCaps; + pWineCaps->CubeTextureFilterCaps = &pCaps->CubeTextureFilterCaps; + pWineCaps->VolumeTextureFilterCaps = &pCaps->VolumeTextureFilterCaps; + pWineCaps->TextureAddressCaps = &pCaps->TextureAddressCaps; + pWineCaps->VolumeTextureAddressCaps = &pCaps->VolumeTextureAddressCaps; + pWineCaps->LineCaps = &pCaps->LineCaps; + pWineCaps->MaxTextureWidth = &pCaps->MaxTextureWidth; + pWineCaps->MaxTextureHeight = &pCaps->MaxTextureHeight; + pWineCaps->MaxVolumeExtent = &pCaps->MaxVolumeExtent; + pWineCaps->MaxTextureRepeat = &pCaps->MaxTextureRepeat; + pWineCaps->MaxTextureAspectRatio = &pCaps->MaxTextureAspectRatio; + pWineCaps->MaxAnisotropy = &pCaps->MaxAnisotropy; + pWineCaps->MaxVertexW = &pCaps->MaxVertexW; + pWineCaps->GuardBandLeft = &pCaps->GuardBandLeft; + pWineCaps->GuardBandTop = &pCaps->GuardBandTop; + pWineCaps->GuardBandRight = &pCaps->GuardBandRight; + pWineCaps->GuardBandBottom = &pCaps->GuardBandBottom; + pWineCaps->ExtentsAdjust = &pCaps->ExtentsAdjust; + pWineCaps->StencilCaps = &pCaps->StencilCaps; + pWineCaps->FVFCaps = &pCaps->FVFCaps; + pWineCaps->TextureOpCaps = &pCaps->TextureOpCaps; + pWineCaps->MaxTextureBlendStages = &pCaps->MaxTextureBlendStages; + pWineCaps->MaxSimultaneousTextures = &pCaps->MaxSimultaneousTextures; + pWineCaps->VertexProcessingCaps = &pCaps->VertexProcessingCaps; + pWineCaps->MaxActiveLights = &pCaps->MaxActiveLights; + pWineCaps->MaxUserClipPlanes = &pCaps->MaxUserClipPlanes; + pWineCaps->MaxVertexBlendMatrices = &pCaps->MaxVertexBlendMatrices; + pWineCaps->MaxVertexBlendMatrixIndex = &pCaps->MaxVertexBlendMatrixIndex; + pWineCaps->MaxPointSize = &pCaps->MaxPointSize; + pWineCaps->MaxPrimitiveCount = &pCaps->MaxPrimitiveCount; + pWineCaps->MaxVertexIndex = &pCaps->MaxVertexIndex; + pWineCaps->MaxStreams = &pCaps->MaxStreams; + pWineCaps->MaxStreamStride = &pCaps->MaxStreamStride; + pWineCaps->VertexShaderVersion = &pCaps->VertexShaderVersion; + pWineCaps->MaxVertexShaderConst = &pCaps->MaxVertexShaderConst; + pWineCaps->PixelShaderVersion = &pCaps->PixelShaderVersion; + /* d3d9 only + pWineCaps->PixelShader1xMaxValue = &pCaps->PixelShader1xMaxValue; + pWineCaps->DevCaps2 = &pCaps->DevCaps2; + pWineCaps->MaxNpatchTessellationLevel = &pCaps->MaxNpatchTessellationLevel; + pWineCaps->MasterAdapterOrdinal = &pCaps->MasterAdapterOrdinal; + pWineCaps->AdapterOrdinalInGroup = &pCaps->AdapterOrdinalInGroup; + pWineCaps->NumberOfAdaptersInGroup = &pCaps->NumberOfAdaptersInGroup; + pWineCaps->DeclTypes = &pCaps->DeclTypes; + pWineCaps->NumSimultaneousRTs = &pCaps->NumSimultaneousRTs; + pWineCaps->StretchRectFilterCaps = &pCaps->StretchRectFilterCaps; + pWineCaps->VS20Caps = &pCaps->VS20Caps; + pWineCaps->PS20Caps = &pCaps->PS20Caps; + pWineCaps->VertexTextureFilterCaps = &pCaps->VertexTextureFilterCaps; + pWineCaps->MaxVShaderInstructionsExecuted = &pCaps->MaxVShaderInstructionsExecuted; + pWineCaps->MaxPShaderInstructionsExecuted = &pCaps->MaxPShaderInstructionsExecuted; + pWineCaps->MaxVertexShader30InstructionSlots = &pCaps->MaxVertexShader30InstructionSlots; + pWineCaps->MaxPixelShader30InstructionSlots = &pCaps->MaxPixelShader30InstructionSlots; + */ + hrc = IWineD3DDevice_GetDeviceCaps(This->WineD3DDevice, pWineCaps); + HeapFree(GetProcessHeap(), 0, pWineCaps); + return hrc; } HRESULT WINAPI IDirect3DDevice8Impl_GetDisplayMode(LPDIRECT3DDEVICE8 iface, D3DDISPLAYMODE* pMode) { @@ -387,6 +474,10 @@ HRESULT WINAPI IDirect3DDevice8Impl_GetCreationParameters(LPDIRECT3DDEVICE8 iface, D3DDEVICE_CREATION_PARAMETERS *pParameters) { IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; TRACE("(%p) copying to %p\n", This, pParameters); + if(pParameters == NULL || (int)pParameters < 1000) { + FIXME("GetCrationParameters called with no buffer or corrupt buffer!\n"); + return D3DERR_INVALIDCALL; /*should we allocate?*/ + } memcpy(pParameters, &This->CreateParms, sizeof(D3DDEVICE_CREATION_PARAMETERS)); return D3D_OK; } @@ -854,7 +945,6 @@ object->Device = This; object->ref = 1; object->ResourceType = D3DRTYPE_INDEXBUFFER; - object->currentDesc.Type = D3DRTYPE_INDEXBUFFER; object->currentDesc.Usage = Usage; object->currentDesc.Pool = Pool; @@ -869,47 +959,11 @@ return D3D_OK; } -HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) { - IDirect3DSurface8Impl *object; - IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl)); - if (NULL == object) { - *ppSurface = NULL; - return D3DERR_OUTOFVIDEOMEMORY; - } - *ppSurface = (LPDIRECT3DSURFACE8) object; - object->lpVtbl = &Direct3DSurface8_Vtbl; - object->Device = This; - object->ResourceType = D3DRTYPE_SURFACE; - object->Container = (IUnknown*) This; - object->ref = 1; - object->myDesc.Width = Width; - object->myDesc.Height = Height; - object->myDesc.Format = Format; - object->myDesc.Type = D3DRTYPE_SURFACE; - object->myDesc.Usage = D3DUSAGE_RENDERTARGET; - object->myDesc.Pool = D3DPOOL_DEFAULT; - object->myDesc.MultiSampleType = MultiSample; - object->bytesPerPixel = D3DFmtGetBpp(This, Format); - if (Format == D3DFMT_DXT1) { - object->myDesc.Size = (Width * object->bytesPerPixel)/2 * Height; /* DXT1 is half byte per pixel */ - } else { - object->myDesc.Size = (Width * object->bytesPerPixel) * Height; - } - object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size); - object->lockable = Lockable; - object->locked = FALSE; - memset(&object->lockedRect, 0, sizeof(RECT)); - IDirect3DSurface8Impl_CleanDirtyRect((LPDIRECT3DSURFACE8) object); +HRESULT WINAPI IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, IDirect3DSurface8** ppSurface,D3DRESOURCETYPE Type, UINT Usage,D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample ) { - TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) lockable(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), Lockable, *ppSurface, object->allocatedMemory, object->myDesc.Size); - return D3D_OK; -} -HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, IDirect3DSurface8** ppSurface) { IDirect3DSurface8Impl *object; - IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl)); @@ -917,6 +971,7 @@ *ppSurface = NULL; return D3DERR_OUTOFVIDEOMEMORY; } + *ppSurface = (LPDIRECT3DSURFACE8) object; object->lpVtbl = &Direct3DSurface8_Vtbl; object->Device = This; @@ -927,45 +982,12 @@ object->myDesc.Width = Width; object->myDesc.Height = Height; object->myDesc.Format = Format; - object->myDesc.Type = D3DRTYPE_SURFACE; - object->myDesc.Usage = D3DUSAGE_DEPTHSTENCIL; - object->myDesc.Pool = D3DPOOL_DEFAULT; + object->myDesc.Type = Type; + object->myDesc.Usage = Usage; + object->myDesc.Pool = Pool; object->myDesc.MultiSampleType = MultiSample; object->bytesPerPixel = D3DFmtGetBpp(This, Format); - if (Format == D3DFMT_DXT1) { - object->myDesc.Size = (Width * object->bytesPerPixel)/2 * Height; /* DXT1 is half byte per pixel */ - } else { - object->myDesc.Size = (Width * object->bytesPerPixel) * Height; - } - object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size); - object->lockable = (D3DFMT_D16_LOCKABLE == Format) ? TRUE : FALSE; - object->locked = FALSE; - memset(&object->lockedRect, 0, sizeof(RECT)); - IDirect3DSurface8Impl_CleanDirtyRect((LPDIRECT3DSURFACE8) object); - - TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), *ppSurface, object->allocatedMemory, object->myDesc.Size); - return D3D_OK; -} -HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, IDirect3DSurface8** ppSurface) { - IDirect3DSurface8Impl *object; - - IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl)); - *ppSurface = (LPDIRECT3DSURFACE8) object; - object->lpVtbl = &Direct3DSurface8_Vtbl; - object->Device = This; - object->ResourceType = D3DRTYPE_SURFACE; - object->Container = (IUnknown*) This; - object->ref = 1; - object->myDesc.Width = Width; - object->myDesc.Height = Height; - object->myDesc.Format = Format; - object->myDesc.Type = D3DRTYPE_SURFACE; - object->myDesc.Usage = 0; - object->myDesc.Pool = D3DPOOL_SYSTEMMEM; - object->bytesPerPixel = D3DFmtGetBpp(This, Format); /* DXTn mipmaps use the same number of 'levels' down to eg. 8x1, but since it is based around 4x4 pixel blocks it requires padding, so allocate enough space! */ @@ -977,15 +999,43 @@ } else { object->myDesc.Size = (Width * object->bytesPerPixel) * Height; } + object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size); - object->lockable = TRUE; + object->lockable = (D3DFMT_D16_LOCKABLE == Format) ? TRUE : Lockable; object->locked = FALSE; memset(&object->lockedRect, 0, sizeof(RECT)); IDirect3DSurface8Impl_CleanDirtyRect((LPDIRECT3DSURFACE8) object); TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), *ppSurface, object->allocatedMemory, object->myDesc.Size); return D3D_OK; + + + +} + + +HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) { + + Format |= Lockable?D3DFMT_D16_LOCKABLE:0; + return IDirect3DDevice8Impl_CreateSurface(iface,Width,Height,Format,TRUE /*Lockable*/,ppSurface,D3DRTYPE_SURFACE,D3DUSAGE_DEPTHSTENCIL,D3DPOOL_SYSTEMMEM,MultiSample); + } + + +HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, IDirect3DSurface8** ppSurface) { + + return IDirect3DDevice8Impl_CreateSurface(iface,Width,Height,Format,FALSE/*Lockable*/,ppSurface,D3DRTYPE_SURFACE,D3DUSAGE_DEPTHSTENCIL,D3DPOOL_DEFAULT,MultiSample); +} + + + +HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, IDirect3DSurface8** ppSurface) { + + return IDirect3DDevice8Impl_CreateSurface(iface,Width,Height,Format,TRUE/*Lockable*/,ppSurface,D3DRTYPE_SURFACE,0,D3DPOOL_SCRATCH,D3DMULTISAMPLE_NONE); + +} + + HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pSourceSurface, CONST RECT* pSourceRectsArray, UINT cRects, IDirect3DSurface8* pDestinationSurface, CONST POINT* pDestPointsArray) { @@ -3111,7 +3161,7 @@ IDirect3DStateBlockImpl* pSB = (IDirect3DStateBlockImpl*) Token; IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - TRACE("(%p)\n", This); + FIXME("(%p)\n", This); return IDirect3DDeviceImpl_CaptureStateBlock(This, pSB); } diff -urN wine.20050419/dlls/d3d8/directx.c wine.20050419.dx9/dlls/d3d8/directx.c --- wine.20050419/dlls/d3d8/directx.c 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d8/directx.c 2005-04-20 01:52:56.000000000 -0600 @@ -192,7 +192,88 @@ HRESULT WINAPI IDirect3D8Impl_GetDeviceCaps(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS8* pCaps) { IDirect3D8Impl *This = (IDirect3D8Impl *)iface; - return IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, (void *)pCaps); + HRESULT hrc = D3D_OK; + WINED3DCAPS *pWineCaps = NULL; + if(NULL == pCaps){ + return D3DERR_INVALIDCALL; + } + pWineCaps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINED3DCAPS)); + if(pWineCaps == NULL){ + return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/ + } + pWineCaps->DeviceType = &pCaps->DeviceType; + pWineCaps->AdapterOrdinal = &pCaps->AdapterOrdinal; + pWineCaps->Caps = &pCaps->Caps; + pWineCaps->Caps2 = &pCaps->Caps2; + pWineCaps->Caps3 = &pCaps->Caps3; + pWineCaps->PresentationIntervals = &pCaps->PresentationIntervals; + pWineCaps->CursorCaps = &pCaps->CursorCaps; + pWineCaps->DevCaps = &pCaps->DevCaps; + pWineCaps->PrimitiveMiscCaps = &pCaps->PrimitiveMiscCaps; + pWineCaps->RasterCaps = &pCaps->RasterCaps; + pWineCaps->ZCmpCaps = &pCaps->ZCmpCaps; + pWineCaps->SrcBlendCaps = &pCaps->SrcBlendCaps; + pWineCaps->DestBlendCaps = &pCaps->DestBlendCaps; + pWineCaps->AlphaCmpCaps = &pCaps->AlphaCmpCaps; + pWineCaps->ShadeCaps = &pCaps->ShadeCaps; + pWineCaps->TextureCaps = &pCaps->TextureCaps; + pWineCaps->TextureFilterCaps = &pCaps->TextureFilterCaps; + pWineCaps->CubeTextureFilterCaps = &pCaps->CubeTextureFilterCaps; + pWineCaps->VolumeTextureFilterCaps = &pCaps->VolumeTextureFilterCaps; + pWineCaps->TextureAddressCaps = &pCaps->TextureAddressCaps; + pWineCaps->VolumeTextureAddressCaps = &pCaps->VolumeTextureAddressCaps; + pWineCaps->LineCaps = &pCaps->LineCaps; + pWineCaps->MaxTextureWidth = &pCaps->MaxTextureWidth; + pWineCaps->MaxTextureHeight = &pCaps->MaxTextureHeight; + pWineCaps->MaxVolumeExtent = &pCaps->MaxVolumeExtent; + pWineCaps->MaxTextureRepeat = &pCaps->MaxTextureRepeat; + pWineCaps->MaxTextureAspectRatio = &pCaps->MaxTextureAspectRatio; + pWineCaps->MaxAnisotropy = &pCaps->MaxAnisotropy; + pWineCaps->MaxVertexW = &pCaps->MaxVertexW; + pWineCaps->GuardBandLeft = &pCaps->GuardBandLeft; + pWineCaps->GuardBandTop = &pCaps->GuardBandTop; + pWineCaps->GuardBandRight = &pCaps->GuardBandRight; + pWineCaps->GuardBandBottom = &pCaps->GuardBandBottom; + pWineCaps->ExtentsAdjust = &pCaps->ExtentsAdjust; + pWineCaps->StencilCaps = &pCaps->StencilCaps; + pWineCaps->FVFCaps = &pCaps->FVFCaps; + pWineCaps->TextureOpCaps = &pCaps->TextureOpCaps; + pWineCaps->MaxTextureBlendStages = &pCaps->MaxTextureBlendStages; + pWineCaps->MaxSimultaneousTextures = &pCaps->MaxSimultaneousTextures; + pWineCaps->VertexProcessingCaps = &pCaps->VertexProcessingCaps; + pWineCaps->MaxActiveLights = &pCaps->MaxActiveLights; + pWineCaps->MaxUserClipPlanes = &pCaps->MaxUserClipPlanes; + pWineCaps->MaxVertexBlendMatrices = &pCaps->MaxVertexBlendMatrices; + pWineCaps->MaxVertexBlendMatrixIndex = &pCaps->MaxVertexBlendMatrixIndex; + pWineCaps->MaxPointSize = &pCaps->MaxPointSize; + pWineCaps->MaxPrimitiveCount = &pCaps->MaxPrimitiveCount; + pWineCaps->MaxVertexIndex = &pCaps->MaxVertexIndex; + pWineCaps->MaxStreams = &pCaps->MaxStreams; + pWineCaps->MaxStreamStride = &pCaps->MaxStreamStride; + pWineCaps->VertexShaderVersion = &pCaps->VertexShaderVersion; + pWineCaps->MaxVertexShaderConst = &pCaps->MaxVertexShaderConst; + pWineCaps->PixelShaderVersion = &pCaps->PixelShaderVersion; + /* d3d9 only + pWineCaps->PixelShader1xMaxValue = &pCaps->PixelShader1xMaxValue; + pWineCaps->DevCaps2 = &pCaps->DevCaps2; + pWineCaps->MaxNpatchTessellationLevel = &pCaps->MaxNpatchTessellationLevel; + pWineCaps->MasterAdapterOrdinal = &pCaps->MasterAdapterOrdinal; + pWineCaps->AdapterOrdinalInGroup = &pCaps->AdapterOrdinalInGroup; + pWineCaps->NumberOfAdaptersInGroup = &pCaps->NumberOfAdaptersInGroup; + pWineCaps->DeclTypes = &pCaps->DeclTypes; + pWineCaps->NumSimultaneousRTs = &pCaps->NumSimultaneousRTs; + pWineCaps->StretchRectFilterCaps = &pCaps->StretchRectFilterCaps; + pWineCaps->VS20Caps = &pCaps->VS20Caps; + pWineCaps->PS20Caps = &pCaps->PS20Caps; + pWineCaps->VertexTextureFilterCaps = &pCaps->VertexTextureFilterCaps; + pWineCaps->MaxVShaderInstructionsExecuted = &pCaps->MaxVShaderInstructionsExecuted; + pWineCaps->MaxPShaderInstructionsExecuted = &pCaps->MaxPShaderInstructionsExecuted; + pWineCaps->MaxVertexShader30InstructionSlots = &pCaps->MaxVertexShader30InstructionSlots; + pWineCaps->MaxPixelShader30InstructionSlots = &pCaps->MaxPixelShader30InstructionSlots; + */ + hrc = IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, pWineCaps); + HeapFree(GetProcessHeap(), 0, pWineCaps); + return hrc; } HMONITOR WINAPI IDirect3D8Impl_GetAdapterMonitor(LPDIRECT3D8 iface, UINT Adapter) { @@ -563,6 +644,86 @@ return res; } + +/* Internal function called back during the CreateDevice to create a render target */ +HRESULT WINAPI D3D8CB_CreateDepthStencilSurface(IUnknown *device, UINT Width, UINT Height, + D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, + DWORD MultisampleQuality, BOOL Discard, + IWineD3DSurface** ppSurface, HANDLE* pSharedHandle) { + HRESULT res = D3D_OK; + IDirect3DSurface8Impl *d3dSurface = NULL; + + res = IDirect3DDevice8_CreateDepthStencilSurface((IDirect3DDevice8 *)device, Width, Height, + Format, MultiSample, (IDirect3DSurface8 **)&d3dSurface); + if (res == D3D_OK) { + *ppSurface = d3dSurface->wineD3DSurface; + }else{ + FIXME("Error create depth stencil surface\n"); + *ppSurface = NULL; + } + return res; +} + + +/* Callback for creating the inplicite swapchain when the device is created */ + +HRESULT WINAPI D3D8CB_CreateAdditionalSwapChain(IUnknown *device, + WINED3DPRESENT_PARAMETERS* pPresentationParameters, + IWineD3DSwapChain ** ppSwapChain){ + HRESULT res = D3D_OK; + IDirect3DSwapChain8Impl *d3dSwapChain = NULL; + /* We have to pass the presentation parameters back and forth */ + D3DPRESENT_PARAMETERS localParameters; + localParameters.BackBufferWidth = *(pPresentationParameters->BackBufferWidth); + localParameters.BackBufferHeight = *(pPresentationParameters->BackBufferHeight); + localParameters.BackBufferFormat = *(pPresentationParameters->BackBufferFormat); + localParameters.BackBufferCount = *(pPresentationParameters->BackBufferCount); + localParameters.MultiSampleType = *(pPresentationParameters->MultiSampleType); +/* d3d9 only */ +/* localParameters.MultiSampleQuality = *(pPresentationParameters->MultiSampleQuality); */ + localParameters.SwapEffect = *(pPresentationParameters->SwapEffect); + localParameters.hDeviceWindow = *(pPresentationParameters->hDeviceWindow); + localParameters.Windowed = *(pPresentationParameters->Windowed); + localParameters.EnableAutoDepthStencil = *(pPresentationParameters->EnableAutoDepthStencil); + localParameters.AutoDepthStencilFormat = *(pPresentationParameters->AutoDepthStencilFormat); + localParameters.Flags = *(pPresentationParameters->Flags); + localParameters.FullScreen_RefreshRateInHz = *(pPresentationParameters->FullScreen_RefreshRateInHz); +/* not in d3d8 */ +/* localParameters.PresentationInterval = *(pPresentationParameters->PresentationInterval); */ + + TRACE("(%p) rellaying\n", device); + /*copy the presentation parameters*/ + res = IDirect3DDevice8_CreateAdditionalSwapChain((IDirect3DDevice8 *)device, &localParameters, (IDirect3DSwapChain8 **)&d3dSwapChain); + + if (res == D3D_OK){ + *ppSwapChain = d3dSwapChain->wineD3DSwapChain; + } else { + FIXME("failed to create additional swap chain\n"); + *ppSwapChain = NULL; + } + /* Copy back the presentation parameters */ + TRACE("(%p) setting up return parameters\n", device); + *pPresentationParameters->BackBufferWidth = localParameters.BackBufferWidth; + *pPresentationParameters->BackBufferHeight = localParameters.BackBufferHeight; + *pPresentationParameters->BackBufferFormat = localParameters.BackBufferFormat; + *pPresentationParameters->BackBufferCount = localParameters.BackBufferCount; + *pPresentationParameters->MultiSampleType = localParameters.MultiSampleType; +/* *pPresentationParameters->MultiSampleQuality leave alone incase wineD3D set something internally */ + *pPresentationParameters->SwapEffect = localParameters.SwapEffect; + *pPresentationParameters->hDeviceWindow = localParameters.hDeviceWindow; + *pPresentationParameters->Windowed = localParameters.Windowed; + *pPresentationParameters->EnableAutoDepthStencil = localParameters.EnableAutoDepthStencil; + *pPresentationParameters->AutoDepthStencilFormat = localParameters.AutoDepthStencilFormat; + *pPresentationParameters->Flags = localParameters.Flags; + *pPresentationParameters->FullScreen_RefreshRateInHz = localParameters.FullScreen_RefreshRateInHz; +/* *pPresentationParameters->PresentationInterval leave alone incase wineD3D set something internally */ + + return res; + +} + + + HRESULT WINAPI IDirect3D8Impl_CreateDevice (LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviourFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, @@ -608,7 +769,8 @@ localParameters.Flags = &pPresentationParameters->Flags; localParameters.FullScreen_RefreshRateInHz = &pPresentationParameters->FullScreen_RefreshRateInHz; localParameters.PresentationInterval = &pPresentationParameters->FullScreen_PresentationInterval; /* Renamed in dx9 */ - IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags, &localParameters, &object->WineD3DDevice, (IUnknown *)object, D3D8CB_CreateRenderTarget); + /*TODO: remove createRenderTarget and CreateDepthSurfae call backs*/ + IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags, &localParameters, &object->WineD3DDevice, (IUnknown *)object, D3D8CB_CreateRenderTarget, D3D8CB_CreateDepthStencilSurface, D3D8CB_CreateAdditionalSwapChain); /** use StateBlock Factory here, for creating the startup stateBlock */ object->StateBlock = NULL; diff -urN wine.20050419/dlls/d3d8/stateblock.c wine.20050419.dx9/dlls/d3d8/stateblock.c --- wine.20050419/dlls/d3d8/stateblock.c 2004-12-23 11:33:45.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d8/stateblock.c 2005-04-20 01:52:56.000000000 -0600 @@ -286,7 +286,9 @@ TRACE("(%p) : Type(%d)\n", This, Type); /* Allocate Storage */ + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlockImpl)); + FIXME("Allocated %p stateblock\n",object); if (object) { if (NULL == This->StateBlock) { /** if it the main stateblock only do init and returns */ /*object->lpVtbl = &Direct3DStateBlock9_Vtbl;*/ @@ -354,6 +356,7 @@ while (src) { newEl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PLIGHTINFOEL)); + FIXME("Allocated %p sblights\n",newEl); if (newEl == NULL) return D3DERR_OUTOFVIDEOMEMORY; memcpy(newEl, src, sizeof(PLIGHTINFOEL)); newEl->prev = dst; @@ -386,10 +389,13 @@ tmp = pSB->lights; if (tmp) tmp = tmp->next; while (tmp != NULL) { + FIXME("(%p) Freeing sblight %p\n",This,tmp->prev); HeapFree(GetProcessHeap(), 0, (void *)(tmp->prev)); tmp = tmp->next; } + FIXME("(%p) Freeing sblight %p\n",This,tmp); HeapFree(GetProcessHeap(), 0, (void *)tmp); + FIXME("(%p) Freeing stateblock %p\n",This,pSB); HeapFree(GetProcessHeap(), 0, (void *)pSB); return D3D_OK; } @@ -407,6 +413,7 @@ /* Allocate Storage */ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlockImpl)); if (object) { + FIXME("Allocated %p IDirect3DStateBlockImpl\n",object); } else { return E_OUTOFMEMORY; } diff -urN wine.20050419/dlls/d3d9/cubetexture.c wine.20050419.dx9/dlls/d3d9/cubetexture.c --- wine.20050419/dlls/d3d9/cubetexture.c 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/cubetexture.c 2005-04-20 01:52:56.000000000 -0600 @@ -236,6 +236,8 @@ + + /* IDirect3DDevice9 IDirect3DCubeTexture9 Methods follow: */ HRESULT WINAPI IDirect3DDevice9Impl_CreateCubeTexture(LPDIRECT3DDEVICE9 iface, UINT EdgeLength, UINT Levels, DWORD Usage, diff -urN wine.20050419/dlls/d3d9/d3d9_main.c wine.20050419.dx9/dlls/d3d9/d3d9_main.c --- wine.20050419/dlls/d3d9/d3d9_main.c 2005-03-02 06:44:59.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/d3d9_main.c 2005-04-20 01:52:56.000000000 -0600 @@ -44,6 +44,7 @@ object->lpVtbl = &Direct3D9_Vtbl; object->ref = 1; + FIXME("calling WineDirect3DCreate with %d %d %p\n", SDKVersion, 9, (IUnknown *)object); object->WineD3D = WineDirect3DCreate(SDKVersion, 9, (IUnknown *)object); TRACE("SDKVersion = %x, Created Direct3D object @ %p, WineObj @ %p\n", SDKVersion, object, object->WineD3D); diff -urN wine.20050419/dlls/d3d9/d3d9_private.h wine.20050419.dx9/dlls/d3d9/d3d9_private.h --- wine.20050419/dlls/d3d9/d3d9_private.h 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/d3d9_private.h 2005-04-20 01:52:56.000000000 -0600 @@ -27,7 +27,6 @@ # error You must include config.h to use this header #endif -/* THIS FILE MUST NOT CONTAIN X11 or MESA DEFINES */ #include #define NONAMELESSUNION @@ -35,19 +34,10 @@ #define COBJMACROS #include "windef.h" #include "winbase.h" -#include "wingdi.h" #include "winuser.h" #include "wine/debug.h" #include "wine/unicode.h" -#define XMD_H -#include -#include -#ifdef HAVE_GL_GLEXT_H -# include -#endif -#undef XMD_H - #undef APIENTRY #undef CALLBACK #undef WINAPI @@ -61,116 +51,14 @@ #include "d3d9_private.h" #include "wine/wined3d_interface.h" -/* X11 locking */ - -extern void (*wine_tsx11_lock_ptr)(void); -extern void (*wine_tsx11_unlock_ptr)(void); - -/* As GLX relies on X, this is needed */ -#define ENTER_GL() wine_tsx11_lock_ptr() -#define LEAVE_GL() wine_tsx11_unlock_ptr() #include + #include "windef.h" #include "winbase.h" -#include "d3d9.h" +#include "d3d9.h" /*why is this included twice?*/ -/* Device caps */ -#define MAX_PALETTES 256 -#define MAX_STREAMS 16 -#define MAX_ACTIVE_LIGHTS 8 -#define MAX_CLIPPLANES D3DMAXUSERCLIPPLANES -#define MAX_LEVELS 256 - -/* Other useful values */ -#define HIGHEST_RENDER_STATE D3DRS_BLENDOPALPHA -#define HIGHEST_TEXTURE_STATE 29 -#define HIGHEST_TRANSFORMSTATE 512 -#define D3DSBT_RECORDED 0xfffffffe - -#define D3D_VSHADER_MAX_CONSTANTS 96 -#define D3D_PSHADER_MAX_CONSTANTS 32 - -/* Direct3D9 Interfaces: */ -typedef struct IDirect3D9Impl IDirect3D9Impl; -typedef struct IDirect3DDevice9Impl IDirect3DDevice9Impl; -typedef struct IDirect3DBaseTexture9Impl IDirect3DBaseTexture9Impl; -typedef struct IDirect3DTexture9Impl IDirect3DTexture9Impl; -typedef struct IDirect3DVolumeTexture9Impl IDirect3DVolumeTexture9Impl; -typedef struct IDirect3DCubeTexture9Impl IDirect3DCubeTexture9Impl; -typedef struct IDirect3DVertexBuffer9Impl IDirect3DVertexBuffer9Impl; -typedef struct IDirect3DIndexBuffer9Impl IDirect3DIndexBuffer9Impl; -typedef struct IDirect3DSurface9Impl IDirect3DSurface9Impl; -typedef struct IDirect3DSwapChain9Impl IDirect3DSwapChain9Impl; -typedef struct IDirect3DResource9Impl IDirect3DResource9Impl; -typedef struct IDirect3DVolume9Impl IDirect3DVolume9Impl; -typedef struct IDirect3DStateBlock9Impl IDirect3DStateBlock9Impl; -typedef struct IDirect3DVertexShader9Impl IDirect3DVertexShader9Impl; -typedef struct IDirect3DPixelShader9Impl IDirect3DPixelShader9Impl; -typedef struct IDirect3DVertexDeclaration9Impl IDirect3DVertexDeclaration9Impl; - - -#define D3DCOLOR_R(dw) (((float) (((dw) >> 16) & 0xFF)) / 255.0f) -#define D3DCOLOR_G(dw) (((float) (((dw) >> 8) & 0xFF)) / 255.0f) -#define D3DCOLOR_B(dw) (((float) (((dw) >> 0) & 0xFF)) / 255.0f) -#define D3DCOLOR_A(dw) (((float) (((dw) >> 24) & 0xFF)) / 255.0f) - -#define D3DCOLORTOCOLORVALUE(dw, col) \ - (col).r = D3DCOLOR_R(dw); \ - (col).g = D3DCOLOR_G(dw); \ - (col).b = D3DCOLOR_B(dw); \ - (col).a = D3DCOLOR_A(dw); - -#define D3DCOLORTOVECTOR4(dw, vec) \ - (vec).x = D3DCOLOR_R(dw); \ - (vec).y = D3DCOLOR_G(dw); \ - (vec).z = D3DCOLOR_B(dw); \ - (vec).w = D3DCOLOR_A(dw); - -#define D3DCOLORTOGLFLOAT4(dw, vec) \ - (vec)[0] = D3DCOLOR_R(dw); \ - (vec)[1] = D3DCOLOR_G(dw); \ - (vec)[2] = D3DCOLOR_B(dw); \ - (vec)[3] = D3DCOLOR_A(dw); - -/** - * State Block for Begin/End/Capture/Create/Apply State Block - * Note: Very long winded but I do not believe gl Lists will - * resolve everything we need, so doing it manually for now - */ -typedef struct SAVEDSTATES { - BOOL lightEnable[MAX_ACTIVE_LIGHTS]; - BOOL Indices; - BOOL lights[MAX_ACTIVE_LIGHTS]; - BOOL material; - BOOL stream_source[MAX_STREAMS]; - BOOL textures[8]; - BOOL transform[HIGHEST_TRANSFORMSTATE]; - BOOL viewport; - BOOL vertexShader; - BOOL vertexShaderConstant; - BOOL vertexShaderDecl; - BOOL pixelShader; - BOOL pixelShaderConstant; - BOOL renderstate[HIGHEST_RENDER_STATE]; - BOOL texture_state[8][HIGHEST_TEXTURE_STATE]; - BOOL clipplane[MAX_CLIPPLANES]; -} SAVEDSTATES; - -typedef struct D3DSHADERVECTORF { - float x; - float y; - float z; - float w; -} D3DSHADERVECTORF; - -typedef struct D3DSHADERVECTORI { - int x; - int y; - int z; - int w; -} D3DSHADERVECTORI; /* =========================================================================== The interfactes themselves @@ -188,7 +76,7 @@ /***************************************************************************** * IDirect3D implementation structure */ -struct IDirect3D9Impl +typedef struct IDirect3D9Impl { /* IUnknown fields */ IDirect3D9Vtbl *lpVtbl; @@ -197,33 +85,11 @@ /* The WineD3D device */ IWineD3D *WineD3D; - /* IDirect3D9 fields */ -}; +} IDirect3D9Impl; -/* IUnknown: */ -extern HRESULT WINAPI IDirect3D9Impl_QueryInterface(LPDIRECT3D9 iface,REFIID refiid,LPVOID *obj); -extern ULONG WINAPI IDirect3D9Impl_AddRef(LPDIRECT3D9 iface); -extern ULONG WINAPI IDirect3D9Impl_Release(LPDIRECT3D9 iface); - -/* IDirect3d9: */ -extern HRESULT WINAPI IDirect3D9Impl_RegisterSoftwareDevice(LPDIRECT3D9 iface, void* pInitializeFunction); -extern UINT WINAPI IDirect3D9Impl_GetAdapterCount(LPDIRECT3D9 iface); -extern HRESULT WINAPI IDirect3D9Impl_GetAdapterIdentifier(LPDIRECT3D9 iface, UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9* pIdentifier); -extern UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format); -extern HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode); -extern HRESULT WINAPI IDirect3D9Impl_GetAdapterDisplayMode(LPDIRECT3D9 iface, UINT Adapter, D3DDISPLAYMODE* pMode); -extern HRESULT WINAPI IDirect3D9Impl_CheckDeviceType(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE CheckType, D3DFORMAT DisplayFormat, D3DFORMAT BackBufferFormat, BOOL Windowed); -extern HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormat(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat); -extern HRESULT WINAPI IDirect3D9Impl_CheckDeviceMultiSampleType(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType, DWORD* pQualityLevels); -extern HRESULT WINAPI IDirect3D9Impl_CheckDepthStencilMatch(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat); -extern HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormatConversion(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SourceFormat, D3DFORMAT TargetFormat); -extern HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps); -extern HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9 iface, UINT Adapter); -extern HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface); - -/* ---------------- */ -/* IDirect3DDevice9 */ -/* ---------------- */ +/* ---------- */ +/* IDirect3D9 */ +/* ---------- */ /***************************************************************************** * Predeclare the interface implementation structures @@ -231,168 +97,33 @@ extern IDirect3DDevice9Vtbl Direct3DDevice9_Vtbl; /***************************************************************************** - * IDirect3DDevice9 implementation structure + * IDirect3D implementation structure */ -struct IDirect3DDevice9Impl +typedef struct IDirect3DDevice9Impl { /* IUnknown fields */ IDirect3DDevice9Vtbl *lpVtbl; DWORD ref; - /* IDirect3DDevice9 fields */ - IDirect3D9Impl *direct3d; + /* The IDirect3DDevice9 fields */ IWineD3DDevice *WineD3DDevice; - /* FIXME: To be sorted out during move */ - IDirect3DSurface9Impl *frontBuffer; - IDirect3DSurface9Impl *backBuffer; - IDirect3DSurface9Impl *depthStencilBuffer; - - IDirect3DSurface9Impl *renderTarget; - IDirect3DSurface9Impl *stencilBufferTarget; - - D3DPRESENT_PARAMETERS PresentParms; - D3DDEVICE_CREATION_PARAMETERS CreateParms; - - UINT adapterNo; - D3DDEVTYPE devType; - - UINT srcBlend; - UINT dstBlend; - UINT alphafunc; - UINT stencilfunc; - - /* State block related */ - BOOL isRecordingState; - IDirect3DStateBlock9Impl *StateBlock; - IDirect3DStateBlock9Impl *UpdateStateBlock; - - /* Other required values */ - float lightPosn[MAX_ACTIVE_LIGHTS][4]; - float lightDirn[MAX_ACTIVE_LIGHTS][4]; - - /* palettes texture management */ - PALETTEENTRY palettes[MAX_PALETTES][256]; - UINT currentPalette; - - /* Optimization */ - D3DMATRIX lastProj; - D3DMATRIX lastView; - D3DMATRIX lastWorld0; - D3DMATRIX lastTexTrans[8]; - - /* OpenGL related */ - /* - GLXContext glCtx; - XVisualInfo *visInfo; - Display *display; - GLXContext render_ctx; - Drawable drawable; - Window win; - */ - HWND win_handle; - - /* OpenGL Extension related */ - - /* Cursor management */ - BOOL bCursorVisible; - UINT xHotSpot; - UINT yHotSpot; - UINT xScreenSpace; - UINT yScreenSpace; +} IDirect3DDevice9Impl; - UINT dummyTextureName[8]; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DDevice9Impl_QueryInterface(LPDIRECT3DDEVICE9 iface, REFIID refiid, LPVOID *obj); -extern ULONG WINAPI IDirect3DDevice9Impl_AddRef(LPDIRECT3DDEVICE9 iface); -extern ULONG WINAPI IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9 iface); /* IDirect3DDevice9: */ -extern HRESULT WINAPI IDirect3DDevice9Impl_TestCooperativeLevel(LPDIRECT3DDEVICE9 iface); -extern UINT WINAPI IDirect3DDevice9Impl_GetAvailableTextureMem(LPDIRECT3DDEVICE9 iface); -extern HRESULT WINAPI IDirect3DDevice9Impl_EvictManagedRessources(LPDIRECT3DDEVICE9 iface); extern HRESULT WINAPI IDirect3DDevice9Impl_GetDirect3D(LPDIRECT3DDEVICE9 iface, IDirect3D9** ppD3D9); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetDeviceCaps(LPDIRECT3DDEVICE9 iface, D3DCAPS9* pCaps); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetDisplayMode(LPDIRECT3DDEVICE9 iface, UINT iSwapChain, D3DDISPLAYMODE* pMode); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetCreationParameters(LPDIRECT3DDEVICE9 iface, D3DDEVICE_CREATION_PARAMETERS* pParameters); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetCursorProperties(LPDIRECT3DDEVICE9 iface, UINT XHotSpot, UINT YHotSpot, IDirect3DSurface9* pCursorBitmap); -extern void WINAPI IDirect3DDevice9Impl_SetCursorPosition(LPDIRECT3DDEVICE9 iface, int XScreenSpace, int YScreenSpace, DWORD Flags); -extern BOOL WINAPI IDirect3DDevice9Impl_ShowCursor(LPDIRECT3DDEVICE9 iface, BOOL bShow); extern HRESULT WINAPI IDirect3DDevice9Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE9 iface, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain9** pSwapChain); extern HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9 iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain); extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(LPDIRECT3DDEVICE9 iface); -extern HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9 iface, D3DPRESENT_PARAMETERS* pPresentationParameters); -extern HRESULT WINAPI IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetBackBuffer(LPDIRECT3DDEVICE9 iface, UINT iSwapChain, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9** ppBackBuffer); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetRasterStatus(LPDIRECT3DDEVICE9 iface, UINT iSwapChain, D3DRASTER_STATUS* pRasterStatus); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetDialogBoxMode(LPDIRECT3DDEVICE9 iface, BOOL bEnableDialogs); -extern void WINAPI IDirect3DDevice9Impl_SetGammaRamp(LPDIRECT3DDEVICE9 iface, UINT iSwapChain, DWORD Flags, CONST D3DGAMMARAMP* pRamp); -extern void WINAPI IDirect3DDevice9Impl_GetGammaRamp(LPDIRECT3DDEVICE9 iface, UINT iSwapChain, D3DGAMMARAMP* pRamp); extern HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(LPDIRECT3DDEVICE9 iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle); extern HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(LPDIRECT3DDEVICE9 iface, UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture9** ppVolumeTexture, HANDLE* pSharedHandle); extern HRESULT WINAPI IDirect3DDevice9Impl_CreateCubeTexture(LPDIRECT3DDEVICE9 iface, UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture9** ppCubeTexture, HANDLE* pSharedHandle); extern HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexBuffer(LPDIRECT3DDEVICE9 iface, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle); extern HRESULT WINAPI IDirect3DDevice9Impl_CreateIndexBuffer(LPDIRECT3DDEVICE9 iface, UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateRenderTarget(LPDIRECT3DDEVICE9 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Lockable, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE9 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Discard, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle); -extern HRESULT WINAPI IDirect3DDevice9Impl_UpdateSurface(LPDIRECT3DDEVICE9 iface, IDirect3DSurface9* pSourceSurface, CONST RECT* pSourceRect, IDirect3DSurface9* pDestinationSurface, CONST POINT* pDestPoint); -extern HRESULT WINAPI IDirect3DDevice9Impl_UpdateTexture(LPDIRECT3DDEVICE9 iface, IDirect3DBaseTexture9* pSourceTexture, IDirect3DBaseTexture9* pDestinationTexture); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTargetData(LPDIRECT3DDEVICE9 iface, IDirect3DSurface9* pRenderTarget, IDirect3DSurface9* pDestSurface); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetFrontBufferData(LPDIRECT3DDEVICE9 iface, UINT iSwapChain, IDirect3DSurface9* pDestSurface); -extern HRESULT WINAPI IDirect3DDevice9Impl_StretchRects(LPDIRECT3DDEVICE9 iface, IDirect3DSurface9* pSourceSurface, CONST RECT* pSourceRect, IDirect3DSurface9* pDestSurface, CONST RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter); -extern HRESULT WINAPI IDirect3DDevice9Impl_ColorFill(LPDIRECT3DDEVICE9 iface, IDirect3DSurface9* pSurface, CONST RECT* pRect, D3DCOLOR color); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateOffscreenPlainSurface(LPDIRECT3DDEVICE9 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DPOOL Pool, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetRenderTarget(LPDIRECT3DDEVICE9 iface, DWORD RenderTargetIndex, IDirect3DSurface9* pRenderTarget); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget(LPDIRECT3DDEVICE9 iface, DWORD RenderTargetIndex, IDirect3DSurface9** ppRenderTarget); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetDepthStencilSurface(LPDIRECT3DDEVICE9 iface, IDirect3DSurface9* pNewZStencilSurface); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE9 iface, IDirect3DSurface9** ppZStencilSurface); -extern HRESULT WINAPI IDirect3DDevice9Impl_BeginScene(LPDIRECT3DDEVICE9 iface); -extern HRESULT WINAPI IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9 iface); -extern HRESULT WINAPI IDirect3DDevice9Impl_Clear(LPDIRECT3DDEVICE9 iface, DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetTransform(LPDIRECT3DDEVICE9 iface, D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetTransform(LPDIRECT3DDEVICE9 iface, D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix); -extern HRESULT WINAPI IDirect3DDevice9Impl_MultiplyTransform(LPDIRECT3DDEVICE9 iface, D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetViewport(LPDIRECT3DDEVICE9 iface, CONST D3DVIEWPORT9* pViewport); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetViewport(LPDIRECT3DDEVICE9 iface, D3DVIEWPORT9* pViewport); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetMaterial(LPDIRECT3DDEVICE9 iface, CONST D3DMATERIAL9* pMaterial); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetMaterial(LPDIRECT3DDEVICE9 iface, D3DMATERIAL9* pMaterial); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetLight(LPDIRECT3DDEVICE9 iface, DWORD Index, CONST D3DLIGHT9* pLight); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetLight(LPDIRECT3DDEVICE9 iface, DWORD Index, D3DLIGHT9* pLight); -extern HRESULT WINAPI IDirect3DDevice9Impl_LightEnable(LPDIRECT3DDEVICE9 iface, DWORD Index, BOOL Enable); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetLightEnable(LPDIRECT3DDEVICE9 iface, DWORD Index, BOOL* pEnable); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetClipPlane(LPDIRECT3DDEVICE9 iface, DWORD Index, CONST float* pPlane); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetClipPlane(LPDIRECT3DDEVICE9 iface, DWORD Index, float* pPlane); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9 iface, D3DRENDERSTATETYPE State, DWORD Value); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetRenderState(LPDIRECT3DDEVICE9 iface, D3DRENDERSTATETYPE State, DWORD* pValue); extern HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9 iface, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppSB); extern HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(LPDIRECT3DDEVICE9 iface); extern HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(LPDIRECT3DDEVICE9 iface, IDirect3DStateBlock9** ppSB); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetClipStatus(LPDIRECT3DDEVICE9 iface, CONST D3DCLIPSTATUS9* pClipStatus); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetClipStatus(LPDIRECT3DDEVICE9 iface, D3DCLIPSTATUS9* pClipStatus); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetTexture(LPDIRECT3DDEVICE9 iface, DWORD Stage, IDirect3DBaseTexture9** ppTexture); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetTexture(LPDIRECT3DDEVICE9 iface, DWORD Stage, IDirect3DBaseTexture9* pTexture); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetTextureStageState(LPDIRECT3DDEVICE9 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD* pValue); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetTextureStageState(LPDIRECT3DDEVICE9 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetSamplerState(LPDIRECT3DDEVICE9 iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD* pValue); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9 iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value); -extern HRESULT WINAPI IDirect3DDevice9Impl_ValidateDevice(LPDIRECT3DDEVICE9 iface, DWORD* pNumPasses); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetPaletteEntries(LPDIRECT3DDEVICE9 iface, UINT PaletteNumber, CONST PALETTEENTRY* pEntries); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetPaletteEntries(LPDIRECT3DDEVICE9 iface, UINT PaletteNumber, PALETTEENTRY* pEntries); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetCurrentTexturePalette(LPDIRECT3DDEVICE9 iface, UINT PaletteNumber); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetCurrentTexturePalette(LPDIRECT3DDEVICE9 iface, UINT *PaletteNumber); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetScissorRect(LPDIRECT3DDEVICE9 iface, CONST RECT* pRect); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetScissorRect(LPDIRECT3DDEVICE9 iface, RECT* pRect); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetSoftwareVertexProcessing(LPDIRECT3DDEVICE9 iface, BOOL bSoftware); -extern BOOL WINAPI IDirect3DDevice9Impl_GetSoftwareVertexProcessing(LPDIRECT3DDEVICE9 iface); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetNPatchMode(LPDIRECT3DDEVICE9 iface, float nSegments); -extern float WINAPI IDirect3DDevice9Impl_GetNPatchMode(LPDIRECT3DDEVICE9 iface); -extern HRESULT WINAPI IDirect3DDevice9Impl_DrawPrimitive(LPDIRECT3DDEVICE9 iface, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_DrawIndexedPrimitive(LPDIRECT3DDEVICE9 iface, D3DPRIMITIVETYPE, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_DrawPrimitiveUP(LPDIRECT3DDEVICE9 iface, D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride); -extern HRESULT WINAPI IDirect3DDevice9Impl_DrawIndexedPrimitiveUP(LPDIRECT3DDEVICE9 iface, D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertices, UINT PrimitiveCount, CONST void* pIndexData, D3DFORMAT IndexDataFormat, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride); -extern HRESULT WINAPI IDirect3DDevice9Impl_ProcessVertices(LPDIRECT3DDEVICE9 iface, UINT SrcStartIndex, UINT DestIndex, UINT VertexCount, IDirect3DVertexBuffer9* pDestBuffer, IDirect3DVertexDeclaration9* pVertexDecl, DWORD Flags); extern HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(LPDIRECT3DDEVICE9 iface, CONST D3DVERTEXELEMENT9* pVertexElements, IDirect3DVertexDeclaration9** ppDecl); extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(LPDIRECT3DDEVICE9 iface, IDirect3DVertexDeclaration9* pDecl); extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(LPDIRECT3DDEVICE9 iface, IDirect3DVertexDeclaration9** ppDecl); @@ -409,11 +140,8 @@ extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantB(LPDIRECT3DDEVICE9 iface, UINT StartRegister, BOOL* pConstantData, UINT BoolCount); extern HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSource(LPDIRECT3DDEVICE9 iface, UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride); extern HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSource(LPDIRECT3DDEVICE9 iface, UINT StreamNumber, IDirect3DVertexBuffer9** ppStreamData, UINT* OffsetInBytes, UINT* pStride); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSourceFreq(LPDIRECT3DDEVICE9 iface, UINT StreamNumber, UINT Divider); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSourceFreq(LPDIRECT3DDEVICE9 iface, UINT StreamNumber, UINT* Divider); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetIndices(LPDIRECT3DDEVICE9 iface, IDirect3DIndexBuffer9* pIndexData); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetIndices(LPDIRECT3DDEVICE9 iface, IDirect3DIndexBuffer9** ppIndexData); extern HRESULT WINAPI IDirect3DDevice9Impl_CreatePixelShader(LPDIRECT3DDEVICE9 iface, CONST DWORD* pFunction, IDirect3DPixelShader9** ppShader); + extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(LPDIRECT3DDEVICE9 iface, IDirect3DPixelShader9* pShader); extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(LPDIRECT3DDEVICE9 iface, IDirect3DPixelShader9** ppShader); extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantF(LPDIRECT3DDEVICE9 iface, UINT StartRegister, CONST float* pConstantData, UINT Vector4fCount); @@ -422,9 +150,6 @@ extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantI(LPDIRECT3DDEVICE9 iface, UINT StartRegister, int* pConstantData, UINT Vector4iCount); extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(LPDIRECT3DDEVICE9 iface, UINT StartRegister, CONST BOOL* pConstantData, UINT BoolCount); extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(LPDIRECT3DDEVICE9 iface, UINT StartRegister, BOOL* pConstantData, UINT BoolCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_DrawRectPatch(LPDIRECT3DDEVICE9 iface, UINT Handle, CONST float* pNumSegs, CONST D3DRECTPATCH_INFO* pRectPatchInfo); -extern HRESULT WINAPI IDirect3DDevice9Impl_DrawTriPatch(LPDIRECT3DDEVICE9 iface, UINT Handle, CONST float* pNumSegs, CONST D3DTRIPATCH_INFO* pTriPatchInfo); -extern HRESULT WINAPI IDirect3DDevice9Impl_DeletePatch(LPDIRECT3DDEVICE9 iface, UINT Handle); extern HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(LPDIRECT3DDEVICE9 iface, D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery); @@ -440,7 +165,7 @@ /***************************************************************************** * IDirect3DVolume9 implementation structure */ -struct IDirect3DVolume9Impl +typedef struct IDirect3DVolume9Impl { /* IUnknown fields */ IDirect3DVolume9Vtbl *lpVtbl; @@ -448,23 +173,7 @@ /* IDirect3DVolume9 fields */ IWineD3DVolume *wineD3DVolume; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DVolume9Impl_QueryInterface(LPDIRECT3DVOLUME9 iface, REFIID refiid, LPVOID* obj); -extern ULONG WINAPI IDirect3DVolume9Impl_AddRef(LPDIRECT3DVOLUME9 iface); -extern ULONG WINAPI IDirect3DVolume9Impl_Release(LPDIRECT3DVOLUME9 iface); - -/* IDirect3DVolume9: */ -extern HRESULT WINAPI IDirect3DVolume9Impl_GetDevice(LPDIRECT3DVOLUME9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DVolume9Impl_SetPrivateData(LPDIRECT3DVOLUME9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags); -extern HRESULT WINAPI IDirect3DVolume9Impl_GetPrivateData(LPDIRECT3DVOLUME9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData); -extern HRESULT WINAPI IDirect3DVolume9Impl_FreePrivateData(LPDIRECT3DVOLUME9 iface, REFGUID refguid); -extern HRESULT WINAPI IDirect3DVolume9Impl_GetContainer(LPDIRECT3DVOLUME9 iface, REFIID riid, void** ppContainer); -extern HRESULT WINAPI IDirect3DVolume9Impl_GetDesc(LPDIRECT3DVOLUME9 iface, D3DVOLUME_DESC* pDesc); -extern HRESULT WINAPI IDirect3DVolume9Impl_LockBox(LPDIRECT3DVOLUME9 iface, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags); -extern HRESULT WINAPI IDirect3DVolume9Impl_UnlockBox(LPDIRECT3DVOLUME9 iface); - +} IDirect3DVolume9Impl; /* ------------------- */ /* IDirect3DSwapChain9 */ @@ -478,34 +187,15 @@ /***************************************************************************** * IDirect3DSwapChain9 implementation structure */ -struct IDirect3DSwapChain9Impl +typedef struct IDirect3DSwapChain9Impl { /* IUnknown fields */ IDirect3DSwapChain9Vtbl *lpVtbl; DWORD ref; /* IDirect3DSwapChain9 fields */ - IDirect3DDevice9Impl *Device; - IDirect3DSurface9Impl *frontBuffer; - IDirect3DSurface9Impl *backBuffer; - IDirect3DSurface9Impl *depthStencilBuffer; - D3DPRESENT_PARAMETERS PresentParms; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DSwapChain9Impl_QueryInterface(LPDIRECT3DSWAPCHAIN9 iface, REFIID refiid, LPVOID* obj); -extern ULONG WINAPI IDirect3DSwapChain9Impl_AddRef(LPDIRECT3DSWAPCHAIN9 iface); -extern ULONG WINAPI IDirect3DSwapChain9Impl_Release(LPDIRECT3DSWAPCHAIN9 iface); - -/* IDirect3DSwapChain9: */ -extern HRESULT WINAPI IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags); -extern HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(LPDIRECT3DSWAPCHAIN9 iface, IDirect3DSurface9* pDestSurface); -extern HRESULT WINAPI IDirect3DSwapChain9Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN9 iface, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9** ppBackBuffer); -extern HRESULT WINAPI IDirect3DSwapChain9Impl_GetRasterStatus(LPDIRECT3DSWAPCHAIN9 iface, D3DRASTER_STATUS* pRasterStatus); -extern HRESULT WINAPI IDirect3DSwapChain9Impl_GetDisplayMode(LPDIRECT3DSWAPCHAIN9 iface, D3DDISPLAYMODE* pMode); -extern HRESULT WINAPI IDirect3DSwapChain9Impl_GetDevice(LPDIRECT3DSWAPCHAIN9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DSwapChain9Impl_GetPresentParameters(LPDIRECT3DSWAPCHAIN9 iface, D3DPRESENT_PARAMETERS* pPresentationParameters); - + IWineD3DSwapChain *wineD3DSwapChain; +} IDirect3DSwapChain9Impl; /* ------------------ */ /* IDirect3DResource9 */ @@ -519,7 +209,7 @@ /***************************************************************************** * IDirect3DResource9 implementation structure */ -struct IDirect3DResource9Impl +typedef struct IDirect3DResource9Impl { /* IUnknown fields */ IDirect3DResource9Vtbl *lpVtbl; @@ -527,7 +217,7 @@ /* IDirect3DResource9 fields */ IWineD3DResource *wineD3DResource; -}; +} IDirect3DResource9Impl; /* IUnknown: */ extern HRESULT WINAPI IDirect3DResource9Impl_QueryInterface(LPDIRECT3DRESOURCE9 iface,REFIID refiid,LPVOID *obj); @@ -544,7 +234,6 @@ extern void WINAPI IDirect3DResource9Impl_PreLoad(LPDIRECT3DRESOURCE9 iface); extern D3DRESOURCETYPE WINAPI IDirect3DResource9Impl_GetType(LPDIRECT3DRESOURCE9 iface); - /* ----------------- */ /* IDirect3DSurface9 */ /* ----------------- */ @@ -557,7 +246,7 @@ /***************************************************************************** * IDirect3DSurface9 implementation structure */ -struct IDirect3DSurface9Impl +typedef struct IDirect3DSurface9Impl { /* IUnknown fields */ IDirect3DSurface9Vtbl *lpVtbl; @@ -566,31 +255,7 @@ /* IDirect3DResource9 fields */ IWineD3DSurface *wineD3DSurface; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DSurface9Impl_QueryInterface(LPDIRECT3DSURFACE9 iface, REFIID refiid, LPVOID* obj); -extern ULONG WINAPI IDirect3DSurface9Impl_AddRef(LPDIRECT3DSURFACE9 iface); -extern ULONG WINAPI IDirect3DSurface9Impl_Release(LPDIRECT3DSURFACE9 iface); - -/* IDirect3DSurface9: (Inherited from IDirect3DResource9) */ -extern HRESULT WINAPI IDirect3DSurface9Impl_GetDevice(LPDIRECT3DSURFACE9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DSurface9Impl_SetPrivateData(LPDIRECT3DSURFACE9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags); -extern HRESULT WINAPI IDirect3DSurface9Impl_GetPrivateData(LPDIRECT3DSURFACE9 iface, REFGUID refguid, void* pData,DWORD* pSizeOfData); -extern HRESULT WINAPI IDirect3DSurface9Impl_FreePrivateData(LPDIRECT3DSURFACE9 iface, REFGUID refguid); -extern DWORD WINAPI IDirect3DSurface9Impl_SetPriority(LPDIRECT3DSURFACE9 iface, DWORD PriorityNew); -extern DWORD WINAPI IDirect3DSurface9Impl_GetPriority(LPDIRECT3DSURFACE9 iface); -extern void WINAPI IDirect3DSurface9Impl_PreLoad(LPDIRECT3DSURFACE9 iface); -extern D3DRESOURCETYPE WINAPI IDirect3DSurface9Impl_GetType(LPDIRECT3DSURFACE9 iface); - -/* IDirect3DSurface9: */ -extern HRESULT WINAPI IDirect3DSurface9Impl_GetContainer(LPDIRECT3DSURFACE9 iface, REFIID riid, void** ppContainer); -extern HRESULT WINAPI IDirect3DSurface9Impl_GetDesc(LPDIRECT3DSURFACE9 iface, D3DSURFACE_DESC *pDesc); -extern HRESULT WINAPI IDirect3DSurface9Impl_LockRect(LPDIRECT3DSURFACE9 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags); -extern HRESULT WINAPI IDirect3DSurface9Impl_UnlockRect(LPDIRECT3DSURFACE9 iface); -extern HRESULT WINAPI IDirect3DSurface9Impl_GetDC(LPDIRECT3DSURFACE9 iface, HDC* phdc); -extern HRESULT WINAPI IDirect3DSurface9Impl_ReleaseDC(LPDIRECT3DSURFACE9 iface, HDC hdc); - +} IDirect3DSurface9Impl; /* ---------------------- */ /* IDirect3DVertexBuffer9 */ @@ -604,7 +269,7 @@ /***************************************************************************** * IDirect3DVertexBuffer9 implementation structure */ -struct IDirect3DVertexBuffer9Impl +typedef struct IDirect3DVertexBuffer9Impl { /* IUnknown fields */ IDirect3DVertexBuffer9Vtbl *lpVtbl; @@ -612,28 +277,8 @@ /* IDirect3DResource9 fields */ IWineD3DVertexBuffer *wineD3DVertexBuffer; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DVertexBuffer9Impl_QueryInterface(LPDIRECT3DVERTEXBUFFER9 iface,REFIID refiid,LPVOID *obj); -extern ULONG WINAPI IDirect3DVertexBuffer9Impl_AddRef(LPDIRECT3DVERTEXBUFFER9 iface); -extern ULONG WINAPI IDirect3DVertexBuffer9Impl_Release(LPDIRECT3DVERTEXBUFFER9 iface); - -/* IDirect3DVertexBuffer9: (Inherited from IDirect3DResource9) */ -extern HRESULT WINAPI IDirect3DVertexBuffer9Impl_GetDevice(LPDIRECT3DVERTEXBUFFER9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DVertexBuffer9Impl_SetPrivateData(LPDIRECT3DVERTEXBUFFER9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags); -extern HRESULT WINAPI IDirect3DVertexBuffer9Impl_GetPrivateData(LPDIRECT3DVERTEXBUFFER9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData); -extern HRESULT WINAPI IDirect3DVertexBuffer9Impl_FreePrivateData(LPDIRECT3DVERTEXBUFFER9 iface, REFGUID refguid); -extern DWORD WINAPI IDirect3DVertexBuffer9Impl_SetPriority(LPDIRECT3DVERTEXBUFFER9 iface, DWORD PriorityNew); -extern DWORD WINAPI IDirect3DVertexBuffer9Impl_GetPriority(LPDIRECT3DVERTEXBUFFER9 iface); -extern void WINAPI IDirect3DVertexBuffer9Impl_PreLoad(LPDIRECT3DVERTEXBUFFER9 iface); -extern D3DRESOURCETYPE WINAPI IDirect3DVertexBuffer9Impl_GetType(LPDIRECT3DVERTEXBUFFER9 iface); - -/* IDirect3DVertexBuffer9: */ -extern HRESULT WINAPI IDirect3DVertexBuffer9Impl_Lock(LPDIRECT3DVERTEXBUFFER9 iface, UINT OffsetToLock, UINT SizeToLock, void** ppbData, DWORD Flags); -extern HRESULT WINAPI IDirect3DVertexBuffer9Impl_Unlock(LPDIRECT3DVERTEXBUFFER9 iface); -extern HRESULT WINAPI IDirect3DVertexBuffer9Impl_GetDesc(LPDIRECT3DVERTEXBUFFER9 iface, D3DVERTEXBUFFER_DESC *pDesc); +} IDirect3DVertexBuffer9Impl; /* --------------------- */ /* IDirect3DIndexBuffer9 */ @@ -647,7 +292,7 @@ /***************************************************************************** * IDirect3DIndexBuffer9 implementation structure */ -struct IDirect3DIndexBuffer9Impl +typedef struct IDirect3DIndexBuffer9Impl { /* IUnknown fields */ IDirect3DIndexBuffer9Vtbl *lpVtbl; @@ -655,28 +300,7 @@ /* IDirect3DResource9 fields */ IWineD3DIndexBuffer *wineD3DIndexBuffer; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DIndexBuffer9Impl_QueryInterface(LPDIRECT3DINDEXBUFFER9 iface,REFIID refiid,LPVOID *obj); -extern ULONG WINAPI IDirect3DIndexBuffer9Impl_AddRef(LPDIRECT3DINDEXBUFFER9 iface); -extern ULONG WINAPI IDirect3DIndexBuffer9Impl_Release(LPDIRECT3DINDEXBUFFER9 iface); - -/* IDirect3DIndexBuffer9: (Inherited from IDirect3DResource9) */ -extern HRESULT WINAPI IDirect3DIndexBuffer9Impl_GetDevice(LPDIRECT3DINDEXBUFFER9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DIndexBuffer9Impl_SetPrivateData(LPDIRECT3DINDEXBUFFER9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags); -extern HRESULT WINAPI IDirect3DIndexBuffer9Impl_GetPrivateData(LPDIRECT3DINDEXBUFFER9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData); -extern HRESULT WINAPI IDirect3DIndexBuffer9Impl_FreePrivateData(LPDIRECT3DINDEXBUFFER9 iface, REFGUID refguid); -extern DWORD WINAPI IDirect3DIndexBuffer9Impl_SetPriority(LPDIRECT3DINDEXBUFFER9 iface, DWORD PriorityNew); -extern DWORD WINAPI IDirect3DIndexBuffer9Impl_GetPriority(LPDIRECT3DINDEXBUFFER9 iface); -extern void WINAPI IDirect3DIndexBuffer9Impl_PreLoad(LPDIRECT3DINDEXBUFFER9 iface); -extern D3DRESOURCETYPE WINAPI IDirect3DIndexBuffer9Impl_GetType(LPDIRECT3DINDEXBUFFER9 iface); - -/* IDirect3DIndexBuffer9: */ -extern HRESULT WINAPI IDirect3DIndexBuffer9Impl_Lock(LPDIRECT3DINDEXBUFFER9 iface, UINT OffsetToLock, UINT SizeToLock, void** ppbData, DWORD Flags); -extern HRESULT WINAPI IDirect3DIndexBuffer9Impl_Unlock(LPDIRECT3DINDEXBUFFER9 iface); -extern HRESULT WINAPI IDirect3DIndexBuffer9Impl_GetDesc(LPDIRECT3DINDEXBUFFER9 iface, D3DINDEXBUFFER_DESC *pDesc); - +} IDirect3DIndexBuffer9Impl; /* --------------------- */ /* IDirect3DBaseTexture9 */ @@ -690,7 +314,7 @@ /***************************************************************************** * IDirect3DBaseTexture9 implementation structure */ -struct IDirect3DBaseTexture9Impl +typedef struct IDirect3DBaseTexture9Impl { /* IUnknown fields */ IDirect3DBaseTexture9Vtbl *lpVtbl; @@ -698,7 +322,8 @@ /* IDirect3DResource9 fields */ IWineD3DBaseTexture *wineD3DBaseTexture; -}; + +} IDirect3DBaseTexture9Impl; /* IUnknown: */ extern HRESULT WINAPI IDirect3DBaseTexture9Impl_QueryInterface(LPDIRECT3DBASETEXTURE9 iface,REFIID refiid,LPVOID *obj); @@ -723,113 +348,45 @@ extern D3DTEXTUREFILTERTYPE WINAPI IDirect3DBaseTexture9Impl_GetAutoGenFilterType(LPDIRECT3DBASETEXTURE9 iface); extern void WINAPI IDirect3DBaseTexture9Impl_GenerateMipSubLevels(LPDIRECT3DBASETEXTURE9 iface); - -/* --------------------- */ -/* IDirect3DCubeTexture9 */ -/* --------------------- */ +/* ----------------- */ +/* IDirect3DTexture9 */ +/* ----------------- */ /***************************************************************************** * Predeclare the interface implementation structures */ -extern IDirect3DCubeTexture9Vtbl Direct3DCubeTexture9_Vtbl; +extern IDirect3DTexture9Vtbl Direct3DTexture9_Vtbl; /***************************************************************************** - * IDirect3DCubeTexture9 implementation structure + * IDirect3DTexture9 implementation structure */ -struct IDirect3DCubeTexture9Impl +typedef struct IDirect3DTexture9Impl { /* IUnknown fields */ - IDirect3DCubeTexture9Vtbl *lpVtbl; + IDirect3DTexture9Vtbl *lpVtbl; DWORD ref; - /* IDirect3DResource9 fields */ - IWineD3DCubeTexture *wineD3DCubeTexture; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_QueryInterface(LPDIRECT3DCUBETEXTURE9 iface,REFIID refiid,LPVOID *obj); -extern ULONG WINAPI IDirect3DCubeTexture9Impl_AddRef(LPDIRECT3DCUBETEXTURE9 iface); -extern ULONG WINAPI IDirect3DCubeTexture9Impl_Release(LPDIRECT3DCUBETEXTURE9 iface); - -/* IDirect3DCubeTexture9: (Inherited from IDirect3DResource9) */ -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_GetDevice(LPDIRECT3DCUBETEXTURE9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_SetPrivateData(LPDIRECT3DCUBETEXTURE9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags); -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_GetPrivateData(LPDIRECT3DCUBETEXTURE9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData); -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_FreePrivateData(LPDIRECT3DCUBETEXTURE9 iface, REFGUID refguid); -extern DWORD WINAPI IDirect3DCubeTexture9Impl_SetPriority(LPDIRECT3DCUBETEXTURE9 iface, DWORD PriorityNew); -extern DWORD WINAPI IDirect3DCubeTexture9Impl_GetPriority(LPDIRECT3DCUBETEXTURE9 iface); -extern void WINAPI IDirect3DCubeTexture9Impl_PreLoad(LPDIRECT3DCUBETEXTURE9 iface); -extern D3DRESOURCETYPE WINAPI IDirect3DCubeTexture9Impl_GetType(LPDIRECT3DCUBETEXTURE9 iface); - -/* IDirect3DCubeTexture9: (Inherited from IDirect3DBaseTexture9) */ -extern DWORD WINAPI IDirect3DCubeTexture9Impl_SetLOD(LPDIRECT3DCUBETEXTURE9 iface, DWORD LODNew); -extern DWORD WINAPI IDirect3DCubeTexture9Impl_GetLOD(LPDIRECT3DCUBETEXTURE9 iface); -extern DWORD WINAPI IDirect3DCubeTexture9Impl_GetLevelCount(LPDIRECT3DCUBETEXTURE9 iface); -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_SetAutoGenFilterType(LPDIRECT3DCUBETEXTURE9 iface, D3DTEXTUREFILTERTYPE FilterType); -extern D3DTEXTUREFILTERTYPE WINAPI IDirect3DCubeTexture9Impl_GetAutoGenFilterType(LPDIRECT3DCUBETEXTURE9 iface); -extern void WINAPI IDirect3DCubeTexture9Impl_GenerateMipSubLevels(LPDIRECT3DCUBETEXTURE9 iface); - -/* IDirect3DCubeTexture9 */ -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_GetLevelDesc(LPDIRECT3DCUBETEXTURE9 iface, UINT Level, D3DSURFACE_DESC* pDesc); -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_GetCubeMapSurface(LPDIRECT3DCUBETEXTURE9 iface, D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface9** ppCubeMapSurface); -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_LockRect(LPDIRECT3DCUBETEXTURE9 iface, D3DCUBEMAP_FACES FaceType, UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags); -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_UnlockRect(LPDIRECT3DCUBETEXTURE9 iface, D3DCUBEMAP_FACES FaceType, UINT Level); -extern HRESULT WINAPI IDirect3DCubeTexture9Impl_AddDirtyRect(LPDIRECT3DCUBETEXTURE9 iface, D3DCUBEMAP_FACES FaceType, CONST RECT* pDirtyRect); + IWineD3DTexture *wineD3DTexture; - -/* ----------------- */ -/* IDirect3DTexture9 */ -/* ----------------- */ +} IDirect3DTexture9Impl; /***************************************************************************** * Predeclare the interface implementation structures */ -extern IDirect3DTexture9Vtbl Direct3DTexture9_Vtbl; +extern IDirect3DCubeTexture9Vtbl Direct3DCubeTexture9_Vtbl; /***************************************************************************** - * IDirect3DTexture9 implementation structure + * IDirect3DCubeTexture9 implementation structure */ -struct IDirect3DTexture9Impl +typedef struct IDirect3DCubeTexture9Impl { /* IUnknown fields */ - IDirect3DTexture9Vtbl *lpVtbl; + IDirect3DCubeTexture9Vtbl *lpVtbl; DWORD ref; - /* IDirect3DResource9 fields */ - IWineD3DTexture *wineD3DTexture; - -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DTexture9Impl_QueryInterface(LPDIRECT3DTEXTURE9 iface,REFIID refiid,LPVOID *obj); -extern ULONG WINAPI IDirect3DTexture9Impl_AddRef(LPDIRECT3DTEXTURE9 iface); -extern ULONG WINAPI IDirect3DTexture9Impl_Release(LPDIRECT3DTEXTURE9 iface); - -/* IDirect3DTexture9: (Inherited from IDirect3DResource9) */ -extern HRESULT WINAPI IDirect3DTexture9Impl_GetDevice(LPDIRECT3DTEXTURE9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DTexture9Impl_SetPrivateData(LPDIRECT3DTEXTURE9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags); -extern HRESULT WINAPI IDirect3DTexture9Impl_GetPrivateData(LPDIRECT3DTEXTURE9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData); -extern HRESULT WINAPI IDirect3DTexture9Impl_FreePrivateData(LPDIRECT3DTEXTURE9 iface, REFGUID refguid); -extern DWORD WINAPI IDirect3DTexture9Impl_SetPriority(LPDIRECT3DTEXTURE9 iface, DWORD PriorityNew); -extern DWORD WINAPI IDirect3DTexture9Impl_GetPriority(LPDIRECT3DTEXTURE9 iface); -extern void WINAPI IDirect3DTexture9Impl_PreLoad(LPDIRECT3DTEXTURE9 iface); -extern D3DRESOURCETYPE WINAPI IDirect3DTexture9Impl_GetType(LPDIRECT3DTEXTURE9 iface); - -/* IDirect3DTexture9: (Inherited from IDirect3DBaseTexture9) */ -extern DWORD WINAPI IDirect3DTexture9Impl_SetLOD(LPDIRECT3DTEXTURE9 iface, DWORD LODNew); -extern DWORD WINAPI IDirect3DTexture9Impl_GetLOD(LPDIRECT3DTEXTURE9 iface); -extern DWORD WINAPI IDirect3DTexture9Impl_GetLevelCount(LPDIRECT3DTEXTURE9 iface); -extern HRESULT WINAPI IDirect3DTexture9Impl_SetAutoGenFilterType(LPDIRECT3DTEXTURE9 iface, D3DTEXTUREFILTERTYPE FilterType); -extern D3DTEXTUREFILTERTYPE WINAPI IDirect3DTexture9Impl_GetAutoGenFilterType(LPDIRECT3DTEXTURE9 iface); -extern void WINAPI IDirect3DTexture9Impl_GenerateMipSubLevels(LPDIRECT3DTEXTURE9 iface); - -/* IDirect3DTexture9: */ -extern HRESULT WINAPI IDirect3DTexture9Impl_GetLevelDesc(LPDIRECT3DTEXTURE9 iface, UINT Level, D3DSURFACE_DESC* pDesc); -extern HRESULT WINAPI IDirect3DTexture9Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE9 iface, UINT Level, IDirect3DSurface9** ppSurfaceLevel); -extern HRESULT WINAPI IDirect3DTexture9Impl_LockRect(LPDIRECT3DTEXTURE9 iface, UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags); -extern HRESULT WINAPI IDirect3DTexture9Impl_UnlockRect(LPDIRECT3DTEXTURE9 iface, UINT Level); -extern HRESULT WINAPI IDirect3DTexture9Impl_AddDirtyRect(LPDIRECT3DTEXTURE9 iface, CONST RECT* pDirtyRect); + IWineD3DCubeTexture *wineD3DCubeTexture; +} IDirect3DCubeTexture9Impl; /* ----------------------- */ /* IDirect3DVolumeTexture9 */ @@ -843,7 +400,7 @@ /***************************************************************************** * IDirect3DVolumeTexture9 implementation structure */ -struct IDirect3DVolumeTexture9Impl +typedef struct IDirect3DVolumeTexture9Impl { /* IUnknown fields */ IDirect3DVolumeTexture9Vtbl *lpVtbl; @@ -851,38 +408,7 @@ /* IDirect3DResource9 fields */ IWineD3DVolumeTexture *wineD3DVolumeTexture; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_QueryInterface(LPDIRECT3DVOLUMETEXTURE9 iface,REFIID refiid,LPVOID *obj); -extern ULONG WINAPI IDirect3DVolumeTexture9Impl_AddRef(LPDIRECT3DVOLUMETEXTURE9 iface); -extern ULONG WINAPI IDirect3DVolumeTexture9Impl_Release(LPDIRECT3DVOLUMETEXTURE9 iface); - -/* IDirect3DVolumeTexture9: (Inherited from IDirect3DResource9) */ -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetDevice(LPDIRECT3DVOLUMETEXTURE9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetPrivateData(LPDIRECT3DVOLUMETEXTURE9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags); -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetPrivateData(LPDIRECT3DVOLUMETEXTURE9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData); -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_FreePrivateData(LPDIRECT3DVOLUMETEXTURE9 iface, REFGUID refguid); -extern DWORD WINAPI IDirect3DVolumeTexture9Impl_SetPriority(LPDIRECT3DVOLUMETEXTURE9 iface, DWORD PriorityNew); -extern DWORD WINAPI IDirect3DVolumeTexture9Impl_GetPriority(LPDIRECT3DVOLUMETEXTURE9 iface); -extern void WINAPI IDirect3DVolumeTexture9Impl_PreLoad(LPDIRECT3DVOLUMETEXTURE9 iface); -extern D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture9Impl_GetType(LPDIRECT3DVOLUMETEXTURE9 iface); - -/* IDirect3DVolumeTexture9: (Inherited from IDirect3DBaseTexture9) */ -extern DWORD WINAPI IDirect3DVolumeTexture9Impl_SetLOD(LPDIRECT3DVOLUMETEXTURE9 iface, DWORD LODNew); -extern DWORD WINAPI IDirect3DVolumeTexture9Impl_GetLOD(LPDIRECT3DVOLUMETEXTURE9 iface); -extern DWORD WINAPI IDirect3DVolumeTexture9Impl_GetLevelCount(LPDIRECT3DVOLUMETEXTURE9 iface); -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetAutoGenFilterType(LPDIRECT3DVOLUMETEXTURE9 iface, D3DTEXTUREFILTERTYPE FilterType); -extern D3DTEXTUREFILTERTYPE WINAPI IDirect3DVolumeTexture9Impl_GetAutoGenFilterType(LPDIRECT3DVOLUMETEXTURE9 iface); -extern void WINAPI IDirect3DVolumeTexture9Impl_GenerateMipSubLevels(LPDIRECT3DVOLUMETEXTURE9 iface); - -/* IDirect3DVolumeTexture9: */ -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetLevelDesc(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, D3DVOLUME_DESC *pDesc); -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetVolumeLevel(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, IDirect3DVolume9** ppVolumeLevel); -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_LockBox(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags); -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_UnlockBox(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level); -extern HRESULT WINAPI IDirect3DVolumeTexture9Impl_AddDirtyBox(LPDIRECT3DVOLUMETEXTURE9 iface, CONST D3DBOX* pDirtyBox); - +} IDirect3DVolumeTexture9Impl; /* ----------------------- */ /* IDirect3DStateBlock9 */ @@ -896,91 +422,14 @@ /***************************************************************************** * IDirect3DStateBlock9 implementation structure */ -struct IDirect3DStateBlock9Impl { +typedef struct IDirect3DStateBlock9Impl { /* IUnknown fields */ IDirect3DStateBlock9Vtbl *lpVtbl; DWORD ref; /* IDirect3DStateBlock9 fields */ - IDirect3DDevice9Impl* Device; - - D3DSTATEBLOCKTYPE blockType; - - SAVEDSTATES Changed; - SAVEDSTATES Set; - - /* Light Enable */ - BOOL lightEnable[MAX_ACTIVE_LIGHTS]; - - /* ClipPlane */ - double clipplane[MAX_CLIPPLANES][4]; - - /* Stream Source */ - UINT stream_stride[MAX_STREAMS]; - IDirect3DVertexBuffer9* stream_source[MAX_STREAMS]; - BOOL streamIsUP; - - /* Indices */ - IDirect3DIndexBuffer9* pIndexData; - UINT baseVertexIndex; - - /* Texture */ - IDirect3DBaseTexture9* textures[8]; - int textureDimensions[8]; - /* Texture State Stage */ - DWORD texture_state[8][HIGHEST_TEXTURE_STATE]; - - /* RenderState */ - DWORD renderstate[HIGHEST_RENDER_STATE]; - - /* Transform */ - D3DMATRIX transforms[HIGHEST_TRANSFORMSTATE]; - - - /* ViewPort */ - D3DVIEWPORT9 viewport; - - /* Lights */ - D3DLIGHT9 lights[MAX_ACTIVE_LIGHTS]; - - /* Material */ - D3DMATERIAL9 material; - - DWORD FVF; - - /* Vertex Shader */ - IDirect3DVertexShader9* VertexShader; - - /* Vertex Shader Declaration */ - IDirect3DVertexDeclaration9Impl* vertexDecl; - - /* Pixel Shader */ - IDirect3DPixelShader9* PixelShader; - - /* Indexed Vertex Blending */ - D3DVERTEXBLENDFLAGS vertex_blend; - FLOAT tween_factor; - - /* Vertex Shader Constant */ - D3DSHADERVECTORF vertexShaderConstantF[D3D_VSHADER_MAX_CONSTANTS]; - D3DSHADERVECTORI vertexShaderConstantI[D3D_VSHADER_MAX_CONSTANTS]; - BOOL vertexShaderConstantB[D3D_VSHADER_MAX_CONSTANTS]; - /* Pixel Shader Constant */ - D3DSHADERVECTORF pixelShaderConstantF[D3D_PSHADER_MAX_CONSTANTS]; - D3DSHADERVECTORI pixelShaderConstantI[D3D_PSHADER_MAX_CONSTANTS]; - BOOL pixelShaderConstantB[D3D_PSHADER_MAX_CONSTANTS]; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DStateBlock9Impl_QueryInterface(LPDIRECT3DSTATEBLOCK9 iface, REFIID refiid, LPVOID* obj); -extern ULONG WINAPI IDirect3DStateBlock9Impl_AddRef(LPDIRECT3DSTATEBLOCK9 iface); -extern ULONG WINAPI IDirect3DStateBlock9Impl_Release(LPDIRECT3DSTATEBLOCK9 iface); - -/* IDirect3DStateBlock9: */ -extern HRESULT WINAPI IDirect3DStateBlock9Impl_GetDevice(LPDIRECT3DSTATEBLOCK9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DStateBlock9Impl_Capture(LPDIRECT3DSTATEBLOCK9 iface); -extern HRESULT WINAPI IDirect3DStateBlock9Impl_Apply(LPDIRECT3DSTATEBLOCK9 iface); - + IWineD3DStateBlock *wineD3DStateBlock; +} IDirect3DStateBlock9Impl; /* --------------------------- */ /* IDirect3DVertexDeclaration9 */ @@ -994,24 +443,14 @@ /***************************************************************************** * IDirect3DVertexShaderDeclaration implementation structure */ -struct IDirect3DVertexDeclaration9Impl { +typedef struct IDirect3DVertexDeclaration9Impl { /* IUnknown fields */ IDirect3DVertexDeclaration9Vtbl *lpVtbl; DWORD ref; /* IDirect3DVertexDeclaration9 fields */ IWineD3DVertexDeclaration *wineD3DVertexDeclaration; -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DVertexDeclaration9Impl_QueryInterface(LPDIRECT3DVERTEXDECLARATION9 iface, REFIID refiid, LPVOID* obj); -extern ULONG WINAPI IDirect3DVertexDeclaration9Impl_AddRef(LPDIRECT3DVERTEXDECLARATION9 iface); -extern ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(LPDIRECT3DVERTEXDECLARATION9 iface); - -/* IDirect3DVertexDeclaration9: */ -extern HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDevice(LPDIRECT3DVERTEXDECLARATION9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDeclaration(LPDIRECT3DVERTEXDECLARATION9 iface, D3DVERTEXELEMENT9* pDecl, UINT* pNumElements); - +} IDirect3DVertexDeclaration9Impl; /* ---------------------- */ /* IDirect3DVertexShader9 */ @@ -1025,35 +464,14 @@ /***************************************************************************** * IDirect3DVertexShader implementation structure */ -struct IDirect3DVertexShader9Impl { +typedef struct IDirect3DVertexShader9Impl { /* IUnknown fields */ IDirect3DVertexShader9Vtbl *lpVtbl; DWORD ref; - /* IDirect3DVertexDeclaration9 fields */ - IDirect3DDevice9Impl* Device; - - DWORD* function; - UINT functionLength; - DWORD usage; /* 0 || D3DUSAGE_SOFTWAREPROCESSING */ - DWORD version; - /* run time datas */ - /* - VSHADERDATA* data; - VSHADERINPUTDATA input; - VSHADEROUTPUTDATA output; - */ -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DVertexShader9Impl_QueryInterface(LPDIRECT3DVERTEXSHADER9 iface, REFIID refiid, LPVOID* obj); -extern ULONG WINAPI IDirect3DVertexShader9Impl_AddRef(LPDIRECT3DVERTEXSHADER9 iface); -extern ULONG WINAPI IDirect3DVertexShader9Impl_Release(LPDIRECT3DVERTEXSHADER9 iface); - -/* IDirect3DVertexShader9: */ -extern HRESULT WINAPI IDirect3DVertexShader9Impl_GetDevice(LPDIRECT3DVERTEXSHADER9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DVertexShader9Impl_GetFunction(LPDIRECT3DVERTEXSHADER9 iface, VOID* pData, UINT* pSizeOfData); - + /* IDirect3DVertexShader9 fields */ + IWineD3DVertexShader *wineD3DVertexShader; +} IDirect3DVertexShader9Impl; /* --------------------- */ /* IDirect3DPixelShader9 */ @@ -1067,34 +485,14 @@ /***************************************************************************** * IDirect3DPixelShader implementation structure */ -struct IDirect3DPixelShader9Impl { +typedef struct IDirect3DPixelShader9Impl { /* IUnknown fields */ IDirect3DPixelShader9Vtbl *lpVtbl; DWORD ref; /* IDirect3DPixelShader9 fields */ - IDirect3DDevice9Impl* Device; - - DWORD* function; - UINT functionLength; - DWORD version; - /* run time datas */ - /* - PSHADERDATA* data; - PSHADERINPUTDATA input; - PSHADEROUTPUTDATA output; - */ -}; - -/* IUnknown: */ -extern HRESULT WINAPI IDirect3DPixelShader9Impl_QueryInterface(LPDIRECT3DPIXELSHADER9 iface, REFIID refiid, LPVOID* obj); -extern ULONG WINAPI IDirect3DPixelShader9Impl_AddRef(LPDIRECT3DPIXELSHADER9 iface); -extern ULONG WINAPI IDirect3DPixelShader9Impl_Release(LPDIRECT3DPIXELSHADER9 iface); - -/* IDirect3DPixelShader9: */ -extern HRESULT WINAPI IDirect3DPixelShader9Impl_GetDevice(LPDIRECT3DPIXELSHADER9 iface, IDirect3DDevice9** ppDevice); -extern HRESULT WINAPI IDirect3DPixelShader9Impl_GetFunction(LPDIRECT3DPIXELSHADER9 iface, VOID* pData, UINT* pSizeOfData); - + IWineD3DPixelShader *wineD3DPixelShader; +} IDirect3DPixelShader9Impl; /* --------------- */ /* IDirect3DQuery9 */ @@ -1128,4 +526,15 @@ IWineD3DVolume **ppVolume, HANDLE * pSharedHandle); +extern HRESULT WINAPI D3D9CB_CreateDepthStencilSurface(IUnknown *device, UINT Width, UINT Height, + D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, + DWORD MultisampleQuality, BOOL Discard, + IWineD3DSurface** ppSurface, HANDLE* pSharedHandle); + +extern HRESULT WINAPI D3D9CB_CreateRenderTarget(IUnknown *device, UINT Width, UINT Height, + D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, + DWORD MultisampleQuality, BOOL Lockable, + IWineD3DSurface** ppSurface, HANDLE* pSharedHandle); + + #endif /* __WINE_D3D9_PRIVATE_H */ diff -urN wine.20050419/dlls/d3d9/d3dcore_gl.h wine.20050419.dx9/dlls/d3d9/d3dcore_gl.h --- wine.20050419/dlls/d3d9/d3dcore_gl.h 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/d3dcore_gl.h 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,878 @@ +/* + * Direct3D gl definitions + * + * Copyright 2003-2004 Raphael Junqueira + * Copyright 2004 Christian Costa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_D3DCORE_GL_H +#define __WINE_D3DCORE_GL_H + +#ifndef __WINE_CONFIG_H +# error You must include config.h to use this header +#endif + +#define XMD_H /* This is to prevent the Xmd.h inclusion bug :-/ */ +#include +#include +#ifdef HAVE_GL_GLEXT_H +# include +#endif +#undef XMD_H + +#undef APIENTRY +#define APIENTRY + +/********************************** + * OpenGL Extensions (EXT and ARB) + * defines and functions pointer + */ + +/* GL_ARB_vertex_blend */ +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#endif +/* GL_EXT_secondary_color */ +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#endif +typedef void (APIENTRY * PGLFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRY * PGLFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRY * PGLFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRY * PGLFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +/* GL_EXT_paletted_texture */ +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#endif +typedef void (APIENTRY * PGLFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +/* GL_EXT_point_parameters */ +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#endif +typedef void (APIENTRY * PGLFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +/* GL_EXT_texture_env_combine */ +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_SUBTRACT_EXT 0x84E7 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE3_RGB_EXT 0x8583 +#define GL_SOURCE4_RGB_EXT 0x8584 +#define GL_SOURCE5_RGB_EXT 0x8585 +#define GL_SOURCE6_RGB_EXT 0x8586 +#define GL_SOURCE7_RGB_EXT 0x8587 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_SOURCE3_ALPHA_EXT 0x858B +#define GL_SOURCE4_ALPHA_EXT 0x858C +#define GL_SOURCE5_ALPHA_EXT 0x858D +#define GL_SOURCE6_ALPHA_EXT 0x858E +#define GL_SOURCE7_ALPHA_EXT 0x858F +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND3_RGB_EXT 0x8593 +#define GL_OPERAND4_RGB_EXT 0x8594 +#define GL_OPERAND5_RGB_EXT 0x8595 +#define GL_OPERAND6_RGB_EXT 0x8596 +#define GL_OPERAND7_RGB_EXT 0x8597 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#define GL_OPERAND3_ALPHA_EXT 0x859B +#define GL_OPERAND4_ALPHA_EXT 0x859C +#define GL_OPERAND5_ALPHA_EXT 0x859D +#define GL_OPERAND6_ALPHA_EXT 0x859E +#define GL_OPERAND7_ALPHA_EXT 0x859F +#endif +/* GL_EXT_texture_env_dot3 */ +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif +/* GL_EXT_texture_lod_bias */ +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif +/* GL_ARB_texture_border_clamp */ +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif +/* GL_ARB_texture_mirrored_repeat (full support GL1.4) */ +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif +/* GL_ATI_texture_mirror_once */ +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif +/* GL_ARB_texture_env_dot3 */ +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif +/* GL_EXT_texture_env_dot3 */ +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif +/* GL_ARB_vertex_program */ +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#endif +typedef void (APIENTRY * PGLFNVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRY * PGLFNVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRY * PGLFNVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRY * PGLFNVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRY * PGLFNVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRY * PGLFNVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRY * PGLFNVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY * PGLFNVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY * PGLFNVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRY * PGLFNVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRY * PGLFNVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRY * PGLFNENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRY * PGLFNDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRY * PGLFNPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (APIENTRY * PGLFNBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRY * PGLFNDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRY * PGLFNGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRY * PGLFNPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY * PGLFNPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRY * PGLFNPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY * PGLFNPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRY * PGLFNPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY * PGLFNPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRY * PGLFNPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY * PGLFNPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRY * PGLFNGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRY * PGLFNGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRY * PGLFNGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRY * PGLFNGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRY * PGLFNGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRY * PGLFNGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); +typedef void (APIENTRY * PGLFNGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRY * PGLFNGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PGLFNGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRY * PGLFNGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRY * PGLFNISPROGRAMARBPROC) (GLuint program); +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif +/* GL_EXT_texture_compression_s3tc */ +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif +typedef void (APIENTRY * PGLFNCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PGLFNCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PGLFNCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PGLFNCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRY * PGLFNGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); +/* GL_EXT_stencil_wrap */ +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif +/* GL_NV_fog_distance */ +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +/* reuse GL_EYE_PLANE */ +#endif +/* GL_NV_texgen_reflection */ +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif +/* GL_NV_register_combiners */ +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +/* reuse GL_TEXTURE0_ARB */ +/* reuse GL_TEXTURE1_ARB */ +/* reuse GL_ZERO */ +/* reuse GL_NONE */ +/* reuse GL_FOG */ +#endif +typedef void (APIENTRY * PGLFNCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PGLFNCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY * PGLFNCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRY * PGLFNCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRY * PGLFNCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRY * PGLFNCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRY * PGLFNFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRY * PGLFNGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PGLFNGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRY * PGLFNGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PGLFNGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRY * PGLFNGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRY * PGLFNGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +/* GL_NV_register_combiners2 */ +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#endif +typedef void (APIENTRY * PGLFNCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRY * PGLFNGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +/* GL_NV_texture_shader */ +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif +/* GL_NV_texture_shader2 */ +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif +/* GL_NV_texture_shader3 */ +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif +/* GL_ATI_texture_env_combine3 */ +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +/* #define ONE */ +/* #define ZERO */ +#endif + +/******* + * OpenGL Official Version + * defines + */ + +/* GL_VERSION_1_3 */ +#if !defined(GL_DOT3_RGBA) +# define GL_DOT3_RGBA 0x8741 +#endif +#if !defined(GL_SUBTRACT) +# define GL_SUBTRACT 0x84E7 +#endif + + +/********************************* + * OpenGL GLX Extensions + * defines and functions pointer + */ + + + +/********************************* + * OpenGL GLX Official Version + * defines and functions pointer + */ + +/* GLX_VERSION_1_3 */ +typedef GLXFBConfig * (APIENTRY * PGLXFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); +typedef GLXFBConfig * (APIENTRY * PGLXFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef int (APIENTRY * PGLXFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef XVisualInfo * (APIENTRY * PGLXFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); +typedef GLXWindow (APIENTRY * PGLXFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void (APIENTRY * PGLXFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); +typedef GLXPixmap (APIENTRY * PGLXFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef void (APIENTRY * PGLXFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); +typedef GLXPbuffer (APIENTRY * PGLXFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef void (APIENTRY * PGLXFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void (APIENTRY * PGLXFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef GLXContext (APIENTRY * PGLXFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef Bool (APIENTRY * PGLXFNGLXMAKECONTEXTCURRENTPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef GLXDrawable (APIENTRY * PGLXFNGLXGETCURRENTREADDRAWABLEPROC) (void); +typedef Display * (APIENTRY * PGLXFNGLXGETCURRENTDISPLAYPROC) (void); +typedef int (APIENTRY * PGLXFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void (APIENTRY * PGLXFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); +typedef void (APIENTRY * PGLXFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); + + +/******************************************** + * OpenGL Supported Extensions (ARB and EXT) + */ + +typedef enum _GL_SupportedExt { + /* ARB */ + ARB_FRAGMENT_PROGRAM, + ARB_MULTISAMPLE, + ARB_MULTITEXTURE, + ARB_POINT_PARAMETERS, + ARB_TEXTURE_COMPRESSION, + ARB_TEXTURE_CUBE_MAP, + ARB_TEXTURE_ENV_ADD, + ARB_TEXTURE_ENV_COMBINE, + ARB_TEXTURE_ENV_DOT3, + ARB_TEXTURE_BORDER_CLAMP, + ARB_TEXTURE_MIRRORED_REPEAT, + ARB_VERTEX_PROGRAM, + ARB_VERTEX_BLEND, + /* EXT */ + EXT_FOG_COORD, + EXT_PALETTED_TEXTURE, + EXT_POINT_PARAMETERS, + EXT_SECONDARY_COLOR, + EXT_STENCIL_WRAP, + EXT_TEXTURE_COMPRESSION_S3TC, + EXT_TEXTURE_FILTER_ANISOTROPIC, + EXT_TEXTURE_LOD, + EXT_TEXTURE_LOD_BIAS, + EXT_TEXTURE_ENV_ADD, + EXT_TEXTURE_ENV_COMBINE, + EXT_TEXTURE_ENV_DOT3, + EXT_VERTEX_WEIGHTING, + /* NVIDIA */ + NV_FOG_DISTANCE, + NV_FRAGMENT_PROGRAM, + NV_REGISTER_COMBINERS, + NV_REGISTER_COMBINERS2, + NV_TEXGEN_REFLECTION, + NV_TEXTURE_ENV_COMBINE4, + NV_TEXTURE_SHADER, + NV_TEXTURE_SHADER2, + NV_TEXTURE_SHADER3, + NV_VERTEX_PROGRAM, + /* ATI */ + ATI_TEXTURE_ENV_COMBINE3, + ATI_TEXTURE_MIRROR_ONCE, + EXT_VERTEX_SHADER, + + OPENGL_SUPPORTED_EXT_END +} GL_SupportedExt; + +typedef enum _GL_Vendors { + VENDOR_WINE = 0x0, + VENDOR_MESA = 0x1, + VENDOR_ATI = 0x1002, + VENDOR_NVIDIA = 0x10de +} GL_Vendors; + +typedef enum _GL_Cards { + CARD_WINE = 0x0, + CARD_ATI_RADEON_8500 = 0x514c, + CARD_ATI_RADEON_9700PRO = 0x4e44, + CARD_ATI_RADEON_9800PRO = 0x4e48, + CARD_NVIDIA_GEFORCE4_TI4600 = 0x0250, + CARD_NVIDIA_GEFORCEFX_5900ULTRA = 0x0330 +} GL_Cards; + +typedef enum _GL_VSVersion { + VS_VERSION_NOT_SUPPORTED = 0x0, + VS_VERSION_10 = 0x10, + VS_VERSION_11 = 0x11, + VS_VERSION_20 = 0x20, + VS_VERSION_30 = 0x30, + /*Force 32-bits*/ + VS_VERSION_FORCE_DWORD = 0x7FFFFFFF +} GL_VSVersion; + +typedef enum _GL_PSVersion { + PS_VERSION_NOT_SUPPORTED = 0x0, + PS_VERSION_10 = 0x10, + PS_VERSION_11 = 0x11, + PS_VERSION_12 = 0x12, + PS_VERSION_13 = 0x13, + PS_VERSION_14 = 0x14, + PS_VERSION_20 = 0x20, + PS_VERSION_30 = 0x30, + /*Force 32-bits*/ + PS_VERSION_FORCE_DWORD = 0x7FFFFFFF +} GL_PSVersion; + +#define MAKEDWORD_VERSION(maj, min) ((maj & 0x0000FFFF) << 16) | (min & 0x0000FFFF) + +#define GL_EXT_FUNCS_GEN \ + /** ARB Extensions **/ \ + /* GL_ARB_texture_compression */ \ + USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC, glCompressedTexImage2DARB); \ + USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3DARB); \ + USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2DARB); \ + USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3DARB); \ + /** EXT Extensions **/ \ + /* GL_EXT_fog_coord */ \ + /* GL_EXT_paletted_texture */ \ + USE_GL_FUNC(PGLFNGLCOLORTABLEEXTPROC, glColorTableEXT); \ + /* GL_EXT_point_parameters */ \ + USE_GL_FUNC(PGLFNGLPOINTPARAMETERFEXTPROC, glPointParameterfEXT); \ + USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVEXTPROC, glPointParameterfvEXT); \ + /* GL_EXT_secondary_color */ \ + USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBEXTPROC, glSecondaryColor3ubEXT); \ + USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FEXTPROC, glSecondaryColor3fEXT); \ + USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FVEXTPROC, glSecondaryColor3fvEXT); \ + USE_GL_FUNC(PGLFNGLSECONDARYCOLORPOINTEREXTPROC, glSecondaryColorPointerEXT); \ + /* GL_EXT_secondary_color */ \ + USE_GL_FUNC(PGLFNGENPROGRAMSARBPROC, glGenProgramsARB); \ + USE_GL_FUNC(PGLFNBINDPROGRAMARBPROC, glBindProgramARB); \ + USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC, glProgramStringARB); \ + USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC, glDeleteProgramsARB); \ + USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC, glProgramEnvParameter4fvARB); \ + USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC, glVertexAttribPointerARB); \ + USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC, glEnableVertexAttribArrayARB); \ + USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC, glDisableVertexAttribArrayARB); \ + +#define GLX_EXT_FUNCS_GEN \ + /** GLX_VERSION_1_3 **/ \ + USE_GL_FUNC(PGLXFNGLXCREATEPBUFFERPROC, glXCreatePbuffer); \ + USE_GL_FUNC(PGLXFNGLXDESTROYPBUFFERPROC, glXDestroyPbuffer); \ + USE_GL_FUNC(PGLXFNGLXCREATEPIXMAPPROC, glXCreatePixmap); \ + USE_GL_FUNC(PGLXFNGLXDESTROYPIXMAPPROC, glXDestroyPixmap); \ + USE_GL_FUNC(PGLXFNGLXCREATENEWCONTEXTPROC, glXCreateNewContext); \ + USE_GL_FUNC(PGLXFNGLXMAKECONTEXTCURRENTPROC, glXMakeContextCurrent); \ + USE_GL_FUNC(PGLXFNGLXCHOOSEFBCONFIGPROC, glXChooseFBConfig); \ + +#undef APIENTRY +#undef CALLBACK +#undef WINAPI + +/* Redefines the constants */ +#define CALLBACK __stdcall +#define WINAPI __stdcall +#define APIENTRY WINAPI + +/* Routine common to the draw primitive and draw indexed primitive routines */ +void drawPrimitive(LPDIRECT3DDEVICE9 iface, + int PrimitiveType, + long NumPrimitives, + + /* for Indexed: */ + long StartVertexIndex, + long StartIdx, + short idxBytes, + const void *idxData, + int minIndex); + + +/***************************************** + * Structures required to draw primitives + */ + +typedef struct Direct3DStridedData { + BYTE *lpData; /* Pointer to start of data */ + DWORD dwStride; /* Stride between occurances of this data */ + DWORD dwType; /* Type (as in D3DVSDT_TYPE) */ +} Direct3DStridedData; + +typedef struct Direct3DVertexStridedData { + union { + struct { + Direct3DStridedData position; + Direct3DStridedData blendWeights; + Direct3DStridedData blendMatrixIndices; + Direct3DStridedData normal; + Direct3DStridedData pSize; + Direct3DStridedData diffuse; + Direct3DStridedData specular; + Direct3DStridedData texCoords[8]; + } s; + Direct3DStridedData input[16]; /* Indexed by constants in D3DVSDE_REGISTER */ + } u; +} Direct3DVertexStridedData; + +typedef struct _WineD3D_GLContext { + GLXContext glCtx; + XVisualInfo* visInfo; + Display* display; + Drawable drawable; + DWORD ref; +} WineD3D_Context; + +#define USE_GL_FUNC(type, pfn) type pfn; +typedef struct _GL_Info { + unsigned bIsFilled; + + DWORD glx_version; + DWORD gl_version; + + GL_Vendors gl_vendor; + GL_Cards gl_card; + DWORD gl_driver_version; + CHAR gl_renderer[255]; + /** + * CAPS Constants + */ + UINT max_lights; + UINT max_textures; + UINT max_clipplanes; + + GL_PSVersion ps_arb_version; + GL_PSVersion ps_nv_version; + + GL_VSVersion vs_arb_version; + GL_VSVersion vs_nv_version; + GL_VSVersion vs_ati_version; + + BOOL supported[50]; + + /** OpenGL EXT and ARB functions ptr */ + GL_EXT_FUNCS_GEN; + /** OpenGL GLX functions ptr */ + GLX_EXT_FUNCS_GEN; + /**/ +} GL_Info; +#undef USE_GL_FUNC + + +#endif /* __WINE_D3DCORE_GL_H */ diff -urN wine.20050419/dlls/d3d9/device.c wine.20050419.dx9/dlls/d3d9/device.c --- wine.20050419/dlls/d3d9/device.c 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/device.c 2005-04-20 01:52:56.000000000 -0600 @@ -32,7 +32,7 @@ if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3DDevice9)) { - IDirect3DDevice9Impl_AddRef(iface); + IUnknown_AddRef(iface); *ppobj = This; return D3D_OK; } @@ -57,7 +57,6 @@ TRACE("(%p) : ReleaseRef to %ld\n", This, ref); if (ref == 0) { - IDirect3D9_Release((LPDIRECT3D9) This->direct3d); IWineD3DDevice_Release(This->WineD3DDevice); HeapFree(GetProcessHeap(), 0, This); } @@ -88,29 +87,128 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetDirect3D(LPDIRECT3DDEVICE9 iface, IDirect3D9** ppD3D9) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - TRACE("(%p) : returning %p\n", This, This->direct3d); - /* Inc ref count */ - *ppD3D9 = (IDirect3D9*) This->direct3d; - IDirect3D9_AddRef(*ppD3D9); - return D3D_OK; + HRESULT hr = D3D_OK; + IWineD3D* pWineD3D; + + TRACE("(%p) Relay\n", This); + + if(NULL == ppD3D9){ + return D3DERR_INVALIDCALL; + } + hr = IWineD3DDevice_GetDirect3D(This->WineD3DDevice, &pWineD3D); + if(hr == D3D_OK && pWineD3D != NULL) + { + IWineD3DResource_GetParent((IWineD3DResource *)pWineD3D,(IUnknown **)ppD3D9); + IWineD3DResource_Release((IWineD3DResource *)pWineD3D); + }else{ + FIXME("Call to IWineD3DDevice_GetDirect3D failed\n"); + *ppD3D9 = NULL; + } + TRACE("(%p) returning %p\b",This , *ppD3D9); + return hr; } HRESULT WINAPI IDirect3DDevice9Impl_GetDeviceCaps(LPDIRECT3DDEVICE9 iface, D3DCAPS9* pCaps) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - return IWineD3DDevice_GetDeviceCaps(This->WineD3DDevice, pCaps); + HRESULT hrc = D3D_OK; + WINED3DCAPS *pWineCaps; + + TRACE("(%p) : Relay pCaps %p \n", This, pCaps); + if(NULL == pCaps){ + return D3DERR_INVALIDCALL; + } + pWineCaps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINED3DCAPS)); + if(pWineCaps == NULL){ + return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/ + } + + pWineCaps->DeviceType = &pCaps->DeviceType; + pWineCaps->AdapterOrdinal = &pCaps->AdapterOrdinal; + pWineCaps->Caps = &pCaps->Caps; + pWineCaps->Caps2 = &pCaps->Caps2; + pWineCaps->Caps3 = &pCaps->Caps3; + pWineCaps->PresentationIntervals = &pCaps->PresentationIntervals; + pWineCaps->CursorCaps = &pCaps->CursorCaps; + pWineCaps->DevCaps = &pCaps->DevCaps; + pWineCaps->PrimitiveMiscCaps = &pCaps->PrimitiveMiscCaps; + pWineCaps->RasterCaps = &pCaps->RasterCaps; + pWineCaps->ZCmpCaps = &pCaps->ZCmpCaps; + pWineCaps->SrcBlendCaps = &pCaps->SrcBlendCaps; + pWineCaps->DestBlendCaps = &pCaps->DestBlendCaps; + pWineCaps->AlphaCmpCaps = &pCaps->AlphaCmpCaps; + pWineCaps->ShadeCaps = &pCaps->ShadeCaps; + pWineCaps->TextureCaps = &pCaps->TextureCaps; + pWineCaps->TextureFilterCaps = &pCaps->TextureFilterCaps; + pWineCaps->CubeTextureFilterCaps = &pCaps->CubeTextureFilterCaps; + pWineCaps->VolumeTextureFilterCaps = &pCaps->VolumeTextureFilterCaps; + pWineCaps->TextureAddressCaps = &pCaps->TextureAddressCaps; + pWineCaps->VolumeTextureAddressCaps = &pCaps->VolumeTextureAddressCaps; + pWineCaps->LineCaps = &pCaps->LineCaps; + pWineCaps->MaxTextureWidth = &pCaps->MaxTextureWidth; + pWineCaps->MaxTextureHeight = &pCaps->MaxTextureHeight; + pWineCaps->MaxVolumeExtent = &pCaps->MaxVolumeExtent; + pWineCaps->MaxTextureRepeat = &pCaps->MaxTextureRepeat; + pWineCaps->MaxTextureAspectRatio = &pCaps->MaxTextureAspectRatio; + pWineCaps->MaxAnisotropy = &pCaps->MaxAnisotropy; + pWineCaps->MaxVertexW = &pCaps->MaxVertexW; + pWineCaps->GuardBandLeft = &pCaps->GuardBandLeft; + pWineCaps->GuardBandTop = &pCaps->GuardBandTop; + pWineCaps->GuardBandRight = &pCaps->GuardBandRight; + pWineCaps->GuardBandBottom = &pCaps->GuardBandBottom; + pWineCaps->ExtentsAdjust = &pCaps->ExtentsAdjust; + pWineCaps->StencilCaps = &pCaps->StencilCaps; + pWineCaps->FVFCaps = &pCaps->FVFCaps; + pWineCaps->TextureOpCaps = &pCaps->TextureOpCaps; + pWineCaps->MaxTextureBlendStages = &pCaps->MaxTextureBlendStages; + pWineCaps->MaxSimultaneousTextures = &pCaps->MaxSimultaneousTextures; + pWineCaps->VertexProcessingCaps = &pCaps->VertexProcessingCaps; + pWineCaps->MaxActiveLights = &pCaps->MaxActiveLights; + pWineCaps->MaxUserClipPlanes = &pCaps->MaxUserClipPlanes; + pWineCaps->MaxVertexBlendMatrices = &pCaps->MaxVertexBlendMatrices; + pWineCaps->MaxVertexBlendMatrixIndex = &pCaps->MaxVertexBlendMatrixIndex; + pWineCaps->MaxPointSize = &pCaps->MaxPointSize; + pWineCaps->MaxPrimitiveCount = &pCaps->MaxPrimitiveCount; + pWineCaps->MaxVertexIndex = &pCaps->MaxVertexIndex; + pWineCaps->MaxStreams = &pCaps->MaxStreams; + pWineCaps->MaxStreamStride = &pCaps->MaxStreamStride; + pWineCaps->VertexShaderVersion = &pCaps->VertexShaderVersion; + pWineCaps->MaxVertexShaderConst = &pCaps->MaxVertexShaderConst; + pWineCaps->PixelShaderVersion = &pCaps->PixelShaderVersion; + pWineCaps->PixelShader1xMaxValue = &pCaps->PixelShader1xMaxValue; + pWineCaps->DevCaps2 = &pCaps->DevCaps2; + pWineCaps->MaxNpatchTessellationLevel = &pCaps->MaxNpatchTessellationLevel; + pWineCaps->MasterAdapterOrdinal = &pCaps->MasterAdapterOrdinal; + pWineCaps->AdapterOrdinalInGroup = &pCaps->AdapterOrdinalInGroup; + pWineCaps->NumberOfAdaptersInGroup = &pCaps->NumberOfAdaptersInGroup; + pWineCaps->DeclTypes = &pCaps->DeclTypes; + pWineCaps->NumSimultaneousRTs = &pCaps->NumSimultaneousRTs; + pWineCaps->StretchRectFilterCaps = &pCaps->StretchRectFilterCaps; + pWineCaps->VS20Caps = (WINED3DVSHADERCAPS2_0 *)&pCaps->VS20Caps; /* structurally identical*/ + pWineCaps->PS20Caps = (WINED3DPSHADERCAPS2_0 *)&pCaps->PS20Caps; + pWineCaps->VertexTextureFilterCaps = &pCaps->VertexTextureFilterCaps; + pWineCaps->MaxVShaderInstructionsExecuted = &pCaps->MaxVShaderInstructionsExecuted; + pWineCaps->MaxPShaderInstructionsExecuted = &pCaps->MaxPShaderInstructionsExecuted; + pWineCaps->MaxVertexShader30InstructionSlots = &pCaps->MaxVertexShader30InstructionSlots; + pWineCaps->MaxPixelShader30InstructionSlots = &pCaps->MaxPixelShader30InstructionSlots; + hrc = IWineD3DDevice_GetDeviceCaps(This->WineD3DDevice, pWineCaps); + HeapFree(GetProcessHeap(), 0, pWineCaps); + TRACE("Returning %p %p\n", This, pCaps); + return hrc; } HRESULT WINAPI IDirect3DDevice9Impl_GetDisplayMode(LPDIRECT3DDEVICE9 iface, UINT iSwapChain, D3DDISPLAYMODE* pMode) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_GetDisplayMode(This->WineD3DDevice, iSwapChain, pMode); } HRESULT WINAPI IDirect3DDevice9Impl_GetCreationParameters(LPDIRECT3DDEVICE9 iface, D3DDEVICE_CREATION_PARAMETERS *pParameters) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) copying to %p\n", This, pParameters); - memcpy(pParameters, &This->CreateParms, sizeof(D3DDEVICE_CREATION_PARAMETERS)); - return D3D_OK; + + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_GetCreationParameters(This->WineD3DDevice, pParameters); } HRESULT WINAPI IDirect3DDevice9Impl_SetCursorProperties(LPDIRECT3DDEVICE9 iface, UINT XHotSpot, UINT YHotSpot, IDirect3DSurface9* pCursorBitmap) { @@ -205,7 +303,6 @@ return IWineD3DDevice_GetGammaRamp(This->WineD3DDevice, iSwapChain, pRamp); } - HRESULT WINAPI IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9 iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface9 **ppSurface,D3DRESOURCETYPE Type, UINT Usage,D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality,HANDLE* pSharedHandle ) { HRESULT hrc; IDirect3DSurface9Impl *object; @@ -343,56 +440,63 @@ return IDirect3DDevice9Impl_CreateSurface(iface,Width,Height,Format,TRUE/*Loackable*/,FALSE/*Discard*/,0/*Level*/ , ppSurface,D3DRTYPE_SURFACE, 0/*Usage (undefined/none)*/,Pool,D3DMULTISAMPLE_NONE,0/*MultisampleQuality*/,pSharedHandle); } -/* TODO: move to wineD3D */ HRESULT WINAPI IDirect3DDevice9Impl_SetRenderTarget(LPDIRECT3DDEVICE9 iface, DWORD RenderTargetIndex, IDirect3DSurface9* pRenderTarget) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr = S_OK; + IDirect3DSurface9Impl *pSurface = (IDirect3DSurface9Impl*)pRenderTarget; + TRACE("(%p) Relay\n" , This); + return IWineD3DDevice_SetRenderTarget(This->WineD3DDevice,RenderTargetIndex,(IWineD3DSurface*)pSurface->wineD3DSurface); +} - /* If pRenderTarget == NULL, it seems to default to back buffer */ - if (pRenderTarget == NULL) pRenderTarget = (IDirect3DSurface9*) This->backBuffer; +HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget(LPDIRECT3DDEVICE9 iface, DWORD RenderTargetIndex, IDirect3DSurface9 **ppRenderTarget) { + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + HRESULT hr = D3D_OK; + IWineD3DSurface *pRenderTarget; - /* If we are trying to set what we already have, don't bother */ - if ((IDirect3DSurface9Impl*) pRenderTarget == This->renderTarget) { - TRACE("Trying to do a NOP SetRenderTarget operation\n"); - } else { - /* Otherwise, set the render target up */ - TRACE("(%p) : newRender@%p (default is backbuffer=(%p))\n", This, pRenderTarget, This->backBuffer); - hr = E_FAIL; /* not supported yet */ - } + TRACE("(%p) Relay\n" , This); - return hr; + if(ppRenderTarget == NULL){ + return D3DERR_INVALIDCALL; } + hr=IWineD3DDevice_GetRenderTarget(This->WineD3DDevice,RenderTargetIndex,&pRenderTarget); -/* TODO: move to wineD3D */ -HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget(LPDIRECT3DDEVICE9 iface, DWORD RenderTargetIndex, IDirect3DSurface9** ppRenderTarget) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - TRACE("(%p)->returning (%p) default is backbuffer=(%p)\n", This, This->renderTarget, This->backBuffer); - *ppRenderTarget = (LPDIRECT3DSURFACE9) This->renderTarget; - IDirect3DSurface9Impl_AddRef((LPDIRECT3DSURFACE9) *ppRenderTarget); - return D3D_OK; + if(hr == D3D_OK && pRenderTarget != NULL){ + IWineD3DResource_GetParent((IWineD3DResource *)pRenderTarget,(IUnknown**)ppRenderTarget); + IWineD3DResource_Release((IWineD3DResource *)pRenderTarget); + }else{ + FIXME("Call to IWineD3DDevice_GetRenderTarget failed\n"); + *ppRenderTarget = NULL; + } + return hr; } -/* TODO: move to wineD3D */ HRESULT WINAPI IDirect3DDevice9Impl_SetDepthStencilSurface(LPDIRECT3DDEVICE9 iface, IDirect3DSurface9* pZStencilSurface) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr = S_OK; - /* If we are trying to set what we already have, don't bother */ - if ((IDirect3DSurface9Impl*) pZStencilSurface == This->stencilBufferTarget) { - TRACE("Trying to do a NOP SetDepthStencilSurface operation\n"); - } else { - /* Otherwise, set the target up */ - TRACE("(%p) : newDepthStencil@%p (default is stencilbuffer=(%p))\n", This, pZStencilSurface, This->depthStencilBuffer); - hr = E_FAIL; /* not supported yet */ - } - return D3D_OK; + IDirect3DSurface9Impl *pSurface; + + TRACE("(%p) Relay\n" , This); + + pSurface = (IDirect3DSurface9Impl*)pZStencilSurface; + return IWineD3DDevice_SetDepthStencilSurface(This->WineD3DDevice,NULL==pSurface?NULL:(IWineD3DSurface*)pSurface->wineD3DSurface); } -/* TODO: move to wineD3D */ HRESULT WINAPI IDirect3DDevice9Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE9 iface, IDirect3DSurface9** ppZStencilSurface) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - TRACE("(%p)->returning (%p) default is stencilbuffer=(%p)\n", This, This->stencilBufferTarget, This->depthStencilBuffer); - *ppZStencilSurface = (LPDIRECT3DSURFACE9) This->stencilBufferTarget; - if (NULL != *ppZStencilSurface) IDirect3DSurface9Impl_AddRef((LPDIRECT3DSURFACE9) *ppZStencilSurface); + HRESULT hr = D3D_OK; + IWineD3DSurface *pZStencilSurface; + + TRACE("(%p) Relay\n" , This); + if(ppZStencilSurface == NULL){ + return D3DERR_INVALIDCALL; + } + + hr=IWineD3DDevice_GetDepthStencilSurface(This->WineD3DDevice,&pZStencilSurface); + if(hr == D3D_OK && pZStencilSurface != NULL){ + IWineD3DResource_GetParent((IWineD3DResource *)pZStencilSurface,(IUnknown**)ppZStencilSurface); + IWineD3DResource_Release((IWineD3DResource *)pZStencilSurface); + }else{ + FIXME("Call to IWineD3DDevice_GetRenderTarget failed\n"); + *ppZStencilSurface = NULL; + } return D3D_OK; } @@ -521,7 +625,6 @@ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IWineD3DBaseTexture *retTexture = NULL; HRESULT rc = D3D_OK; - TRACE("(%p) Relay\n" , This); if(ppTexture == NULL){ @@ -700,6 +803,9 @@ if(pStream == NULL){ return D3DERR_INVALIDCALL; } + if(pStream == NULL){ + return D3DERR_INVALIDCALL; + } rc = IWineD3DDevice_GetStreamSource(This->WineD3DDevice, StreamNumber, (IWineD3DVertexBuffer **)&retStream, OffsetInBytes, pStride); if (rc == D3D_OK && NULL != retStream) { @@ -745,6 +851,9 @@ if(ppIndexData == NULL){ return D3DERR_INVALIDCALL; } + if(ppIndexData == NULL){ + return D3DERR_INVALIDCALL; + } rc = IWineD3DDevice_GetIndices(This->WineD3DDevice, &retIndexData, &tmp); if (rc == D3D_OK && NULL != retIndexData) { @@ -775,6 +884,34 @@ return IWineD3DDevice_DeletePatch(This->WineD3DDevice, Handle); } +HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9 iface, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppStateBlock) { + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DStateBlock9Impl* object; + HRESULT hrc = D3D_OK; + + TRACE("(%p) Relay\n", This); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl)); + if (NULL == object) { + FIXME("(%p) Failed to allocate %d bytes\n", This, sizeof(IDirect3DStateBlock9Impl)); + *ppStateBlock = NULL; + return E_OUTOFMEMORY; + } + object->lpVtbl = &Direct3DStateBlock9_Vtbl; + object->ref = 1; + + hrc=IWineD3DDevice_CreateStateBlock(This->WineD3DDevice,Type,&object->wineD3DStateBlock,(IUnknown*)object); + if(hrc != D3D_OK){ + FIXME("(%p) Call to IWineD3DDevice_CreateStateBlock failed.\n", This); + HeapFree(GetProcessHeap(), 0, object); + *ppStateBlock = NULL; + } else { + *ppStateBlock = (IDirect3DStateBlock9*)object; + } + TRACE("(%p) returning token (ptr to stateblock) of %p\n", This, object); + return hrc; +} + IDirect3DDevice9Vtbl Direct3DDevice9_Vtbl = { IDirect3DDevice9Impl_QueryInterface, @@ -921,3 +1058,4 @@ } return res; } + diff -urN wine.20050419/dlls/d3d9/directx.c wine.20050419.dx9/dlls/d3d9/directx.c --- wine.20050419/dlls/d3d9/directx.c 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/directx.c 2005-04-20 02:47:47.000000000 -0600 @@ -21,7 +21,7 @@ #include "config.h" #include "d3d9_private.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d); +WINE_DEFAULT_DEBUG_CHANNEL(d3d9); /* IDirect3D9 IUnknown parts follow: */ HRESULT WINAPI IDirect3D9Impl_QueryInterface(LPDIRECT3D9 iface, REFIID riid, LPVOID* ppobj) @@ -30,7 +30,7 @@ if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3D9)) { - IDirect3D9Impl_AddRef(iface); + IUnknown_AddRef(iface); *ppobj = This; return D3D_OK; } @@ -76,10 +76,11 @@ HRESULT WINAPI IDirect3D9Impl_GetAdapterIdentifier(LPDIRECT3D9 iface, UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9* pIdentifier) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; WINED3DADAPTER_IDENTIFIER adapter_id; - + TRACE("(%p) Relay \n", This); /* dx8 and dx9 have different structures to be filled in, with incompatible layouts so pass in pointers to the places to be filled via an internal - structure */ + structure + */ adapter_id.Driver = pIdentifier->Driver; adapter_id.Description = pIdentifier->Description; adapter_id.DeviceName = pIdentifier->DeviceName; @@ -96,16 +97,19 @@ UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; + TRACE("(%p) Relay \n", This); return IWineD3D_GetAdapterModeCount(This->WineD3D, Adapter, Format); } HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; + TRACE("(%p) Relay \n", This); return IWineD3D_EnumAdapterModes(This->WineD3D, Adapter, Format, Mode, pMode); } HRESULT WINAPI IDirect3D9Impl_GetAdapterDisplayMode(LPDIRECT3D9 iface, UINT Adapter, D3DDISPLAYMODE* pMode) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; + TRACE("(%p) Relay %p \n", This, This->WineD3D); return IWineD3D_GetAdapterDisplayMode(This->WineD3D, Adapter, pMode); } @@ -113,6 +117,7 @@ UINT Adapter, D3DDEVTYPE CheckType, D3DFORMAT DisplayFormat, D3DFORMAT BackBufferFormat, BOOL Windowed) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; + TRACE("(%p) Relay \n", This); return IWineD3D_CheckDeviceType(This->WineD3D, Adapter, CheckType, DisplayFormat, BackBufferFormat, Windowed); } @@ -121,6 +126,7 @@ UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; + TRACE("(%p) Relay \n", This); return IWineD3D_CheckDeviceFormat(This->WineD3D, Adapter, DeviceType, AdapterFormat, Usage, RType, CheckFormat); } @@ -129,6 +135,7 @@ UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType, DWORD* pQualityLevels) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; + TRACE("(%p) Relay \n", This); return IWineD3D_CheckDeviceMultiSampleType(This->WineD3D, Adapter, DeviceType, SurfaceFormat, Windowed, MultiSampleType, pQualityLevels); } @@ -137,23 +144,113 @@ UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; + TRACE("(%p) Relay \n", This); return IWineD3D_CheckDepthStencilMatch(This->WineD3D, Adapter, DeviceType, AdapterFormat, RenderTargetFormat, DepthStencilFormat); } HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormatConversion(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SourceFormat, D3DFORMAT TargetFormat) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; + TRACE("(%p) Relay \n", This); return IWineD3D_CheckDeviceFormatConversion(This->WineD3D, Adapter, DeviceType, SourceFormat, TargetFormat); } HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; - return IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, (WINED3DCAPS *)pCaps); + HRESULT hrc = D3D_OK; + WINED3DCAPS *pWineCaps; + + TRACE("(%p) Relay %d %u %p \n", This, Adapter, DeviceType, pCaps); + + if(NULL == pCaps){ + return D3DERR_INVALIDCALL; + } + pWineCaps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINED3DCAPS)); + if(pWineCaps == NULL){ + return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/ + } + + pWineCaps->DeviceType = &pCaps->DeviceType; + pWineCaps->AdapterOrdinal = &pCaps->AdapterOrdinal; + pWineCaps->Caps = &pCaps->Caps; + pWineCaps->Caps2 = &pCaps->Caps2; + pWineCaps->Caps3 = &pCaps->Caps3; + pWineCaps->PresentationIntervals = &pCaps->PresentationIntervals; + pWineCaps->CursorCaps = &pCaps->CursorCaps; + pWineCaps->DevCaps = &pCaps->DevCaps; + pWineCaps->PrimitiveMiscCaps = &pCaps->PrimitiveMiscCaps; + pWineCaps->RasterCaps = &pCaps->RasterCaps; + pWineCaps->ZCmpCaps = &pCaps->ZCmpCaps; + pWineCaps->SrcBlendCaps = &pCaps->SrcBlendCaps; + pWineCaps->DestBlendCaps = &pCaps->DestBlendCaps; + pWineCaps->AlphaCmpCaps = &pCaps->AlphaCmpCaps; + pWineCaps->ShadeCaps = &pCaps->ShadeCaps; + pWineCaps->TextureCaps = &pCaps->TextureCaps; + pWineCaps->TextureFilterCaps = &pCaps->TextureFilterCaps; + pWineCaps->CubeTextureFilterCaps = &pCaps->CubeTextureFilterCaps; + pWineCaps->VolumeTextureFilterCaps = &pCaps->VolumeTextureFilterCaps; + pWineCaps->TextureAddressCaps = &pCaps->TextureAddressCaps; + pWineCaps->VolumeTextureAddressCaps = &pCaps->VolumeTextureAddressCaps; + pWineCaps->LineCaps = &pCaps->LineCaps; + pWineCaps->MaxTextureWidth = &pCaps->MaxTextureWidth; + pWineCaps->MaxTextureHeight = &pCaps->MaxTextureHeight; + pWineCaps->MaxVolumeExtent = &pCaps->MaxVolumeExtent; + pWineCaps->MaxTextureRepeat = &pCaps->MaxTextureRepeat; + pWineCaps->MaxTextureAspectRatio = &pCaps->MaxTextureAspectRatio; + pWineCaps->MaxAnisotropy = &pCaps->MaxAnisotropy; + pWineCaps->MaxVertexW = &pCaps->MaxVertexW; + pWineCaps->GuardBandLeft = &pCaps->GuardBandLeft; + pWineCaps->GuardBandTop = &pCaps->GuardBandTop; + pWineCaps->GuardBandRight = &pCaps->GuardBandRight; + pWineCaps->GuardBandBottom = &pCaps->GuardBandBottom; + pWineCaps->ExtentsAdjust = &pCaps->ExtentsAdjust; + pWineCaps->StencilCaps = &pCaps->StencilCaps; + pWineCaps->FVFCaps = &pCaps->FVFCaps; + pWineCaps->TextureOpCaps = &pCaps->TextureOpCaps; + pWineCaps->MaxTextureBlendStages = &pCaps->MaxTextureBlendStages; + pWineCaps->MaxSimultaneousTextures = &pCaps->MaxSimultaneousTextures; + pWineCaps->VertexProcessingCaps = &pCaps->VertexProcessingCaps; + pWineCaps->MaxActiveLights = &pCaps->MaxActiveLights; + pWineCaps->MaxUserClipPlanes = &pCaps->MaxUserClipPlanes; + pWineCaps->MaxVertexBlendMatrices = &pCaps->MaxVertexBlendMatrices; + pWineCaps->MaxVertexBlendMatrixIndex = &pCaps->MaxVertexBlendMatrixIndex; + pWineCaps->MaxPointSize = &pCaps->MaxPointSize; + pWineCaps->MaxPrimitiveCount = &pCaps->MaxPrimitiveCount; + pWineCaps->MaxVertexIndex = &pCaps->MaxVertexIndex; + pWineCaps->MaxStreams = &pCaps->MaxStreams; + pWineCaps->MaxStreamStride = &pCaps->MaxStreamStride; + pWineCaps->VertexShaderVersion = &pCaps->VertexShaderVersion; + pWineCaps->MaxVertexShaderConst = &pCaps->MaxVertexShaderConst; + pWineCaps->PixelShaderVersion = &pCaps->PixelShaderVersion; + pWineCaps->PixelShader1xMaxValue = &pCaps->PixelShader1xMaxValue; + pWineCaps->DevCaps2 = &pCaps->DevCaps2; + pWineCaps->MaxNpatchTessellationLevel = &pCaps->MaxNpatchTessellationLevel; + pWineCaps->MasterAdapterOrdinal = &pCaps->MasterAdapterOrdinal; + pWineCaps->AdapterOrdinalInGroup = &pCaps->AdapterOrdinalInGroup; + pWineCaps->NumberOfAdaptersInGroup = &pCaps->NumberOfAdaptersInGroup; + pWineCaps->DeclTypes = &pCaps->DeclTypes; + pWineCaps->NumSimultaneousRTs = &pCaps->NumSimultaneousRTs; + pWineCaps->StretchRectFilterCaps = &pCaps->StretchRectFilterCaps; +#if 0 + pWineCaps->VS20Caps = &pCaps->VS20Caps; + pWineCaps->PS20Caps = &pCaps->PS20Caps; +#endif + pWineCaps->VertexTextureFilterCaps = &pCaps->VertexTextureFilterCaps; + pWineCaps->MaxVShaderInstructionsExecuted = &pCaps->MaxVShaderInstructionsExecuted; + pWineCaps->MaxPShaderInstructionsExecuted = &pCaps->MaxPShaderInstructionsExecuted; + pWineCaps->MaxVertexShader30InstructionSlots = &pCaps->MaxVertexShader30InstructionSlots; + pWineCaps->MaxPixelShader30InstructionSlots = &pCaps->MaxPixelShader30InstructionSlots; + hrc = IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, pWineCaps); + HeapFree(GetProcessHeap(), 0, pWineCaps); + TRACE("(%p) returning %p\n", This, pCaps); + return hrc; + } HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9 iface, UINT Adapter) { IDirect3D9Impl *This = (IDirect3D9Impl *)iface; + TRACE("(%p) Relay \n", This); return IWineD3D_GetAdapterMonitor(This->WineD3D, Adapter); } @@ -164,33 +261,100 @@ IWineD3DSurface** ppSurface, HANDLE* pSharedHandle) { HRESULT res = D3D_OK; IDirect3DSurface9Impl *d3dSurface = NULL; - IDirect3DDevice9Impl* pDeviceImpl = (IDirect3DDevice9Impl*) device; - + TRACE("(%p) call back\n", device); res = IDirect3DDevice9_CreateRenderTarget((IDirect3DDevice9 *)device, Width, Height, (D3DFORMAT) Format, MultiSample, MultisampleQuality, Lockable, (IDirect3DSurface9 **)&d3dSurface, pSharedHandle); if (SUCCEEDED(res)) { *ppSurface = d3dSurface->wineD3DSurface; - if (NULL == pDeviceImpl->backBuffer) { - pDeviceImpl->backBuffer = d3dSurface; - pDeviceImpl->renderTarget = d3dSurface; - IDirect3DSurface9Impl_AddRef((LPDIRECT3DSURFACE9) pDeviceImpl->renderTarget); - } } else { *ppSurface = NULL; } return res; } +HRESULT WINAPI D3D9CB_CreateAdditionalSwapChain(IUnknown *device, + WINED3DPRESENT_PARAMETERS* pPresentationParameters, + IWineD3DSwapChain ** ppSwapChain){ + HRESULT res = D3D_OK; + IDirect3DSwapChain9Impl *d3dSwapChain =NULL; + + D3DPRESENT_PARAMETERS localParameters; + + localParameters.BackBufferWidth = *(pPresentationParameters->BackBufferWidth); + localParameters.BackBufferHeight = *(pPresentationParameters->BackBufferHeight); + localParameters.BackBufferFormat = *(pPresentationParameters->BackBufferFormat); + localParameters.BackBufferCount = *(pPresentationParameters->BackBufferCount); + localParameters.MultiSampleType = *(pPresentationParameters->MultiSampleType); + localParameters.MultiSampleQuality = *(pPresentationParameters->MultiSampleQuality); + localParameters.SwapEffect = *(pPresentationParameters->SwapEffect); + localParameters.hDeviceWindow = *(pPresentationParameters->hDeviceWindow); + localParameters.Windowed = *(pPresentationParameters->Windowed); + localParameters.EnableAutoDepthStencil = *(pPresentationParameters->EnableAutoDepthStencil); + localParameters.AutoDepthStencilFormat = *(pPresentationParameters->AutoDepthStencilFormat); + localParameters.Flags = *(pPresentationParameters->Flags); + localParameters.FullScreen_RefreshRateInHz = *(pPresentationParameters->FullScreen_RefreshRateInHz); + localParameters.PresentationInterval = *(pPresentationParameters->PresentationInterval); + + TRACE("(%p) rellaying\n", device); + /*copy the presentation parameters*/ + res = IDirect3DDevice9_CreateAdditionalSwapChain((IDirect3DDevice9 *)device, &localParameters, (IDirect3DSwapChain9 **)&d3dSwapChain); + + if (res == D3D_OK){ + *ppSwapChain = d3dSwapChain->wineD3DSwapChain; + } else { + *ppSwapChain = NULL; + } + /*Copy back the presentation parameters*/ + TRACE("(%p) setting up return parameters\n", device); + *pPresentationParameters->BackBufferWidth = localParameters.BackBufferWidth; + *pPresentationParameters->BackBufferHeight = localParameters.BackBufferHeight; + *pPresentationParameters->BackBufferFormat = localParameters.BackBufferFormat; + *pPresentationParameters->BackBufferCount = localParameters.BackBufferCount; + *pPresentationParameters->MultiSampleType = localParameters.MultiSampleType; + *pPresentationParameters->MultiSampleQuality = localParameters.MultiSampleQuality; + *pPresentationParameters->SwapEffect = localParameters.SwapEffect; + *pPresentationParameters->hDeviceWindow = localParameters.hDeviceWindow; + *pPresentationParameters->Windowed = localParameters.Windowed; + *pPresentationParameters->EnableAutoDepthStencil = localParameters.EnableAutoDepthStencil; + *pPresentationParameters->AutoDepthStencilFormat = localParameters.AutoDepthStencilFormat; + *pPresentationParameters->Flags = localParameters.Flags; + *pPresentationParameters->FullScreen_RefreshRateInHz = localParameters.FullScreen_RefreshRateInHz; + *pPresentationParameters->PresentationInterval = localParameters.PresentationInterval; + + return res; + +} + + + +/* Internal function called back during the CreateDevice to create a render target */ +HRESULT WINAPI D3D9CB_CreateDepthStencilSurface(IUnknown *device, UINT Width, UINT Height, + D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, + DWORD MultisampleQuality, BOOL Discard, + IWineD3DSurface** ppSurface, HANDLE* pSharedHandle) { + HRESULT res = D3D_OK; + IDirect3DSurface9Impl *d3dSurface = NULL; + + res = IDirect3DDevice9_CreateDepthStencilSurface((IDirect3DDevice9 *)device, Width, Height, + Format, MultiSample, MultisampleQuality, Discard, + (IDirect3DSurface9 **)&d3dSurface, pSharedHandle); + if (res == D3D_OK) { + *ppSurface = d3dSurface->wineD3DSurface; + } + return res; +} + HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviourFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface) { + /*TODO: This needs to call IWINED3D*/ IDirect3D9Impl *This = (IDirect3D9Impl *)iface; IDirect3DDevice9Impl *object = NULL; WINED3DPRESENT_PARAMETERS localParameters; - + TRACE("(%p) Relay \n", This); /* Check the validity range of the adapter parameter */ if (Adapter >= IDirect3D9Impl_GetAdapterCount(iface)) { *ppReturnedDeviceInterface = NULL; @@ -207,8 +371,6 @@ object->lpVtbl = &Direct3DDevice9_Vtbl; object->ref = 1; - object->direct3d = This; - IDirect3D9_AddRef((LPDIRECT3D9) object->direct3d); *ppReturnedDeviceInterface = (IDirect3DDevice9 *)object; /* Allocate an associated WineD3DDevice object */ @@ -226,7 +388,11 @@ localParameters.Flags = &pPresentationParameters->Flags; localParameters.FullScreen_RefreshRateInHz = &pPresentationParameters->FullScreen_RefreshRateInHz; localParameters.PresentationInterval = &pPresentationParameters->PresentationInterval; - return IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags, &localParameters, &object->WineD3DDevice, (IUnknown *)object, D3D9CB_CreateRenderTarget); + + IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags, &localParameters, &object->WineD3DDevice, (IUnknown *)object, D3D9CB_CreateRenderTarget, D3D9CB_CreateDepthStencilSurface, D3D9CB_CreateAdditionalSwapChain); + + TRACE("(%p) : Created Device %p\n", This, object); + return D3D_OK; } IDirect3D9Vtbl Direct3D9_Vtbl = diff -urN wine.20050419/dlls/d3d9/pixelshader.c wine.20050419.dx9/dlls/d3d9/pixelshader.c --- wine.20050419/dlls/d3d9/pixelshader.c 2005-01-24 05:44:01.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/pixelshader.c 2005-04-20 01:52:56.000000000 -0600 @@ -22,15 +22,16 @@ #include "config.h" #include "d3d9_private.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); +WINE_DEFAULT_DEBUG_CHANNEL(d3d9); -/* IDirect3DPixelShader9 IUnknown parts follow: */ +/*IUnknown Parts*/ HRESULT WINAPI IDirect3DPixelShader9Impl_QueryInterface(LPDIRECT3DPIXELSHADER9 iface, REFIID riid, LPVOID* ppobj) { IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; + TRACE("(%p) Relay\n", This); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3DPixelShader9)) { - IDirect3DPixelShader9Impl_AddRef(iface); + IUnknown_AddRef(iface); *ppobj = This; return D3D_OK; } @@ -63,16 +64,22 @@ /* IDirect3DPixelShader9 Interface follow: */ HRESULT WINAPI IDirect3DPixelShader9Impl_GetDevice(LPDIRECT3DPIXELSHADER9 iface, IDirect3DDevice9** ppDevice) { IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - TRACE("(%p) : returning %p\n", This, This->Device); - *ppDevice = (LPDIRECT3DDEVICE9) This->Device; - IDirect3DDevice9Impl_AddRef(*ppDevice); + IWineD3DDevice *myDevice = NULL; + + TRACE("(%p) : Relay\n", This); + + IWineD3DPixelShader_GetDevice(This->wineD3DPixelShader, &myDevice); + IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice); + IWineD3DDevice_Release(myDevice); + TRACE("(%p) returing (%p)", This, *ppDevice); return D3D_OK; + } HRESULT WINAPI IDirect3DPixelShader9Impl_GetFunction(LPDIRECT3DPIXELSHADER9 iface, VOID* pData, UINT* pSizeOfData) { IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - FIXME("(%p): stub\n", This); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DPixelShader_GetFunction(This->wineD3DPixelShader, pData, pSizeOfData); } @@ -89,148 +96,100 @@ /* IDirect3DDevice9 IDirect3DPixelShader9 Methods follow: */ HRESULT WINAPI IDirect3DDevice9Impl_CreatePixelShader(LPDIRECT3DDEVICE9 iface, CONST DWORD* pFunction, IDirect3DPixelShader9** ppShader) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); + IDirect3DPixelShader9Impl *object; + HRESULT hrc = D3D_OK; + + FIXME("(%p) Relay (disabled)\n", This); + *ppShader = NULL; return D3D_OK; + if(ppShader == NULL){ + TRACE("(%p) Invalid call\n", This); + return D3DERR_INVALIDCALL; } + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); -HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(LPDIRECT3DDEVICE9 iface, IDirect3DPixelShader9* pShader) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + if(NULL == object){ + return E_OUTOFMEMORY; + }else{ - This->UpdateStateBlock->PixelShader = pShader; - This->UpdateStateBlock->Changed.pixelShader = TRUE; - This->UpdateStateBlock->Set.pixelShader = TRUE; - - /* Handle recording of state blocks */ - if (This->isRecordingState) { - TRACE("Recording... not performing anything\n"); - return D3D_OK; + object->ref = 1; + object->lpVtbl = &Direct3DPixelShader9_Vtbl; + hrc = IWineD3DDevice_CreatePixelShader(This->WineD3DDevice, pFunction, &object->wineD3DPixelShader , (IUnknown *)object); + if(hrc != D3D_OK){ + FIXME("(%p) call to IWineD3DDevice_CreatePixelShader failed\n", This); + HeapFree(GetProcessHeap(), 0 , object); + *ppShader = NULL; + }else{ + *ppShader = (IDirect3DPixelShader9*) object; } - /** - * TODO: merge HAL shaders context switching from prototype - */ - return D3D_OK; + } -HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(LPDIRECT3DDEVICE9 iface, IDirect3DPixelShader9** ppShader) { + TRACE("(%p) : returning %p\n", This, *ppShader); + return hrc; +} + +HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(LPDIRECT3DDEVICE9 iface, IDirect3DPixelShader9* pShader) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - TRACE("(%p) : GetPixelShader returning %p\n", This, This->StateBlock->PixelShader); - *ppShader = This->StateBlock->PixelShader; - IDirect3DPixelShader9Impl_AddRef(*ppShader); + IDirect3DPixelShader9Impl *shader = (IDirect3DPixelShader9Impl *)pShader; + TRACE("(%p) Relay\n", This); + IWineD3DDevice_SetPixelShader(This->WineD3DDevice, shader == NULL ? NULL :shader->wineD3DPixelShader); return D3D_OK; } -HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantF(LPDIRECT3DDEVICE9 iface, UINT Register, CONST float* pConstantData, UINT Vector4fCount) { +HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(LPDIRECT3DDEVICE9 iface, IDirect3DPixelShader9** ppShader) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IWineD3DPixelShader *object; - if (Register + Vector4fCount > D3D_VSHADER_MAX_CONSTANTS) { - ERR("(%p) : SetPixelShaderConstant C[%u] invalid\n", This, Register); + HRESULT hrc = D3D_OK; + TRACE("(%p) Relay\n", This); + if(ppShader == NULL){ + TRACE("(%p) Invalid call\n", This); return D3DERR_INVALIDCALL; } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - if (Vector4fCount > 1) { - CONST FLOAT* f = pConstantData; - UINT i; - TRACE("(%p) : SetPixelShaderConstant C[%u..%u]=\n", This, Register, Register + Vector4fCount - 1); - for (i = 0; i < Vector4fCount; ++i) { - TRACE("{%f, %f, %f, %f}\n", f[0], f[1], f[2], f[3]); - f += 4; + + hrc = IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &object); + if(hrc == D3D_OK){ + hrc = IWineD3DPixelShader_GetParent(object, (IUnknown **)ppShader); + IWineD3DPixelShader_Release(object); } - } else { - const FLOAT* f = (const FLOAT*) pConstantData; - TRACE("(%p) : SetPixelShaderConstant, C[%u]={%f, %f, %f, %f}\n", This, Register, f[0], f[1], f[2], f[3]); + + TRACE("(%p) : returning %p\n", This, *ppShader); + return hrc; } - This->UpdateStateBlock->Changed.pixelShaderConstant = TRUE; - memcpy(&This->UpdateStateBlock->pixelShaderConstantF[Register], pConstantData, Vector4fCount * 4 * sizeof(FLOAT)); - return D3D_OK; + +HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantF(LPDIRECT3DDEVICE9 iface, UINT Register, CONST float* pConstantData, UINT Vector4fCount) { + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_SetPixelShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount); } HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantF(LPDIRECT3DDEVICE9 iface, UINT Register, float* pConstantData, UINT Vector4fCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - - TRACE("(%p) : C[%u] count=%u\n", This, Register, Vector4fCount); - if (Register + Vector4fCount > D3D_VSHADER_MAX_CONSTANTS) { - return D3DERR_INVALIDCALL; - } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - memcpy(pConstantData, &This->UpdateStateBlock->pixelShaderConstantF[Register], Vector4fCount * 4 * sizeof(FLOAT)); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_GetPixelShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount); } HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantI(LPDIRECT3DDEVICE9 iface, UINT Register, CONST int* pConstantData, UINT Vector4iCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - - if (Register + Vector4iCount > D3D_VSHADER_MAX_CONSTANTS) { - ERR("(%p) : SetPixelShaderConstantI C[%u] invalid\n", This, Register); - return D3DERR_INVALIDCALL; - } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - if (Vector4iCount > 1) { - CONST int* f = pConstantData; - UINT i; - TRACE("(%p) : SetPixelShaderConstantI C[%u..%u]=\n", This, Register, Register + Vector4iCount - 1); - for (i = 0; i < Vector4iCount; ++i) { - TRACE("{%d, %d, %d, %d}\n", f[0], f[1], f[2], f[3]); - f += 4; - } - } else { - CONST int* f = pConstantData; - TRACE("(%p) : SetPixelShaderConstantI, C[%u]={%i, %i, %i, %i}\n", This, Register, f[0], f[1], f[2], f[3]); - } - This->UpdateStateBlock->Changed.pixelShaderConstant = TRUE; - memcpy(&This->UpdateStateBlock->pixelShaderConstantI[Register], pConstantData, Vector4iCount * 4 * sizeof(int)); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_SetPixelShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount); } HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantI(LPDIRECT3DDEVICE9 iface, UINT Register, int* pConstantData, UINT Vector4iCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - - TRACE("(%p) : C[%u] count=%u\n", This, Register, Vector4iCount); - if (Register + Vector4iCount > D3D_VSHADER_MAX_CONSTANTS) { - return D3DERR_INVALIDCALL; - } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - memcpy(pConstantData, &This->UpdateStateBlock->pixelShaderConstantI[Register], Vector4iCount * 4 * sizeof(FLOAT)); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_GetPixelShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount); } HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(LPDIRECT3DDEVICE9 iface, UINT Register, CONST BOOL* pConstantData, UINT BoolCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - UINT i; - - if (Register + BoolCount > D3D_VSHADER_MAX_CONSTANTS) { - ERR("(%p) : SetPixelShaderConstantB C[%u] invalid\n", This, Register); - return D3DERR_INVALIDCALL; - } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - if (BoolCount > 1) { - CONST BOOL* f = pConstantData; - TRACE("(%p) : SetPixelShaderConstantB C[%u..%u]=\n", This, Register, Register + BoolCount - 1); - for (i = 0; i < BoolCount; ++i) { - TRACE("{%u}\n", f[i]); - } - } else { - CONST BOOL* f = pConstantData; - TRACE("(%p) : SetPixelShaderConstantB, C[%u]={%u}\n", This, Register, f[0]); - } - This->UpdateStateBlock->Changed.pixelShaderConstant = TRUE; - for (i = 0; i < BoolCount; ++i) { - This->UpdateStateBlock->pixelShaderConstantB[Register] = pConstantData[i]; - } - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_SetPixelShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount); } HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(LPDIRECT3DDEVICE9 iface, UINT Register, BOOL* pConstantData, UINT BoolCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_GetPixelShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount); } diff -urN wine.20050419/dlls/d3d9/stateblock.c wine.20050419.dx9/dlls/d3d9/stateblock.c --- wine.20050419/dlls/d3d9/stateblock.c 2005-01-24 05:44:01.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/stateblock.c 2005-04-20 01:52:56.000000000 -0600 @@ -22,7 +22,7 @@ #include "config.h" #include "d3d9_private.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d); +WINE_DEFAULT_DEBUG_CHANNEL(d3d9); /* IDirect3DStateBlock9 IUnknown parts follow: */ HRESULT WINAPI IDirect3DStateBlock9Impl_QueryInterface(LPDIRECT3DSTATEBLOCK9 iface, REFIID riid, LPVOID* ppobj) { @@ -30,7 +30,7 @@ if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3DStateBlock9)) { - IDirect3DStateBlock9Impl_AddRef(iface); + IUnknown_AddRef(iface); *ppobj = This; return D3D_OK; } @@ -55,6 +55,7 @@ TRACE("(%p) : ReleaseRef to %ld\n", This, ref); if (ref == 0) { + IWineD3DStateBlock_Release(This->wineD3DStateBlock); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -63,25 +64,22 @@ /* IDirect3DStateBlock9 Interface follow: */ HRESULT WINAPI IDirect3DStateBlock9Impl_GetDevice(LPDIRECT3DSTATEBLOCK9 iface, IDirect3DDevice9** ppDevice) { IDirect3DStateBlock9Impl *This = (IDirect3DStateBlock9Impl *)iface; - TRACE("(%p) : returning %p\n", This, This->Device); - *ppDevice = (LPDIRECT3DDEVICE9) This->Device; - IDirect3DDevice9Impl_AddRef(*ppDevice); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IDirect3DResource9Impl_GetDevice((LPDIRECT3DRESOURCE9) This, ppDevice); } HRESULT WINAPI IDirect3DStateBlock9Impl_Capture(LPDIRECT3DSTATEBLOCK9 iface) { IDirect3DStateBlock9Impl *This = (IDirect3DStateBlock9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DStateBlock_Capture(This->wineD3DStateBlock); } HRESULT WINAPI IDirect3DStateBlock9Impl_Apply(LPDIRECT3DSTATEBLOCK9 iface) { IDirect3DStateBlock9Impl *This = (IDirect3DStateBlock9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DStateBlock_Apply(This->wineD3DStateBlock); } - IDirect3DStateBlock9Vtbl Direct3DStateBlock9_Vtbl = { IDirect3DStateBlock9Impl_QueryInterface, @@ -93,21 +91,36 @@ }; -/* IDirect3DDevice9 IDirect3DStateBlock9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9 iface, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppSB) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; -} + HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(LPDIRECT3DDEVICE9 iface) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_BeginStateBlock(This->WineD3DDevice); } HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(LPDIRECT3DDEVICE9 iface, IDirect3DStateBlock9** ppSB) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); + HRESULT hr; + IWineD3DStateBlock* wineD3DStateBlock; + IDirect3DStateBlock9Impl* object; + + TRACE("(%p) Relay\n", This); + + /*Tell wineD3D to endstatablock before anything else (incase we run out of memory later and cause locking problems)*/ + hr=IWineD3DDevice_EndStateBlock(This->WineD3DDevice,&wineD3DStateBlock); + if(hr!= D3D_OK){ + FIXME("IWineD3DDevice_EndStateBlock returned an error\n"); + return hr; + } + /*allocate a new IDirectD3DStateBlock*/ + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY ,sizeof(IDirect3DStateBlock9Impl)); + object->ref = 1; + object->lpVtbl = &Direct3DStateBlock9_Vtbl; + + object->wineD3DStateBlock=wineD3DStateBlock; + + *ppSB=(IDirect3DStateBlock9*)object; + TRACE("(%p)Returning %p %p\n", This, *ppSB, wineD3DStateBlock); return D3D_OK; } diff -urN wine.20050419/dlls/d3d9/swapchain.c wine.20050419.dx9/dlls/d3d9/swapchain.c --- wine.20050419/dlls/d3d9/swapchain.c 2005-01-24 05:44:01.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/swapchain.c 2005-04-20 01:52:56.000000000 -0600 @@ -22,7 +22,7 @@ #include "config.h" #include "d3d9_private.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d); +WINE_DEFAULT_DEBUG_CHANNEL(d3d9); /* IDirect3DSwapChain IUnknown parts follow: */ HRESULT WINAPI IDirect3DSwapChain9Impl_QueryInterface(LPDIRECT3DSWAPCHAIN9 iface, REFIID riid, LPVOID* ppobj) @@ -31,7 +31,7 @@ if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3DSwapChain9)) { - IDirect3DSwapChain9Impl_AddRef(iface); + IUnknown_AddRef(iface); *ppobj = This; return D3D_OK; } @@ -56,58 +56,78 @@ TRACE("(%p) : ReleaseRef to %ld\n", This, ref); if (ref == 0) { + IWineD3DSwapChain_Release(This->wineD3DSwapChain); HeapFree(GetProcessHeap(), 0, This); } return ref; } + /* IDirect3DSwapChain9 parts follow: */ HRESULT WINAPI IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) { IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; - FIXME("(%p) : stub\n", This); + TRACE("(%p) Relay\n", This); + IWineD3DSwapChain_Present(This->wineD3DSwapChain, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, dwFlags); return D3D_OK; } HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(LPDIRECT3DSWAPCHAIN9 iface, IDirect3DSurface9* pDestSurface) { IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + + TRACE("(%p) Relay\n", This); + return IWineD3DSwapChain_GetFrontBufferData(This->wineD3DSwapChain, ((IDirect3DSurface9Impl *)pDestSurface)->wineD3DSurface); + } HRESULT WINAPI IDirect3DSwapChain9Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN9 iface, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9** ppBackBuffer) { IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + HRESULT hrc = D3D_OK; + IWineD3DSurface *mySurface = NULL; + + TRACE("(%p) Relay\n", This); + + hrc = IWineD3DSwapChain_GetBackBuffer(This->wineD3DSwapChain, iBackBuffer, Type, &mySurface); + if (hrc == D3D_OK && NULL != mySurface) { + IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppBackBuffer); + IWineD3DSurface_Release(mySurface); + } + return hrc; } HRESULT WINAPI IDirect3DSwapChain9Impl_GetRasterStatus(LPDIRECT3DSWAPCHAIN9 iface, D3DRASTER_STATUS* pRasterStatus) { IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DSwapChain_GetRasterStatus(This->wineD3DSwapChain, pRasterStatus); } HRESULT WINAPI IDirect3DSwapChain9Impl_GetDisplayMode(LPDIRECT3DSWAPCHAIN9 iface, D3DDISPLAYMODE* pMode) { IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + TRACE("(%p) Relay\n", This); + return IWineD3DSwapChain_GetDisplayMode(This->wineD3DSwapChain, pMode); } HRESULT WINAPI IDirect3DSwapChain9Impl_GetDevice(LPDIRECT3DSWAPCHAIN9 iface, IDirect3DDevice9** ppDevice) { IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; - TRACE("(%p) : returning %p\n", This, This->Device); - *ppDevice = (LPDIRECT3DDEVICE9) This->Device; + HRESULT hrc = D3D_OK; + IWineD3DDevice *device = NULL; - /* Note Calling this method will increase the internal reference count - on the IDirect3DDevice9 interface. */ - IDirect3DDevice9Impl_AddRef(*ppDevice); - return D3D_OK; + TRACE("(%p) Relay\n", This); + + hrc = IWineD3DSwapChain_GetDevice(This->wineD3DSwapChain, &device); + if (hrc == D3D_OK && NULL != device) { + IWineD3DDevice_GetParent(device, (IUnknown **)ppDevice); + IWineD3DDevice_Release(device); + } + return hrc; } HRESULT WINAPI IDirect3DSwapChain9Impl_GetPresentParameters(LPDIRECT3DSWAPCHAIN9 iface, D3DPRESENT_PARAMETERS* pPresentationParameters) { IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; - FIXME("(%p) : copy\n", This); + FIXME("(%p) : inplement using WINED3DPRESENT_PARAMERS\n", This); + return IWineD3DSwapChain_GetPresentParameters(This->wineD3DSwapChain, pPresentationParameters); + /* memcpy(pPresentationParameters, &This->PresentParms, sizeof(D3DPRESENT_PARAMETERS)); - return D3D_OK; + */ } @@ -129,18 +149,69 @@ /* IDirect3DDevice9 IDirect3DSwapChain9 Methods follow: */ HRESULT WINAPI IDirect3DDevice9Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE9 iface, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain9** pSwapChain) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); + IDirect3DSwapChain9Impl* object; + HRESULT hrc = D3D_OK; + WINED3DPRESENT_PARAMETERS localParameters; + + TRACE("(%p) Relay\n", This); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (NULL == object) { + FIXME("Allocation of memory failed\n"); + *pSwapChain = NULL; + return D3DERR_OUTOFVIDEOMEMORY; + } + object->ref = 1; + object->lpVtbl = &Direct3DSwapChain9_Vtbl; + + /* Allocate an associated WineD3DDevice object */ + localParameters.BackBufferWidth = &pPresentationParameters->BackBufferWidth; + localParameters.BackBufferHeight = &pPresentationParameters->BackBufferHeight; + localParameters.BackBufferFormat = &pPresentationParameters->BackBufferFormat; + localParameters.BackBufferCount = &pPresentationParameters->BackBufferCount; + localParameters.MultiSampleType = &pPresentationParameters->MultiSampleType; + localParameters.MultiSampleQuality = &pPresentationParameters->MultiSampleQuality; + localParameters.SwapEffect = &pPresentationParameters->SwapEffect; + localParameters.hDeviceWindow = &pPresentationParameters->hDeviceWindow; + localParameters.Windowed = &pPresentationParameters->Windowed; + localParameters.EnableAutoDepthStencil = &pPresentationParameters->EnableAutoDepthStencil; + localParameters.AutoDepthStencilFormat = &pPresentationParameters->AutoDepthStencilFormat; + localParameters.Flags = &pPresentationParameters->Flags; + localParameters.FullScreen_RefreshRateInHz = &pPresentationParameters->FullScreen_RefreshRateInHz; + localParameters.PresentationInterval = &pPresentationParameters->PresentationInterval; + + + + + hrc = IWineD3DDevice_CreateAdditionalSwapChain(This->WineD3DDevice, &localParameters, &object->wineD3DSwapChain, (IUnknown*)object, D3D9CB_CreateRenderTarget, D3D9CB_CreateDepthStencilSurface); + if(hrc != D3D_OK){ + FIXME("(%p) call to IWineD3DDevice_CreateAdditionalSwapChain failed\n", This); + HeapFree(GetProcessHeap(), 0 , object); + *pSwapChain = NULL; + }else{ + *pSwapChain = (IDirect3DSwapChain9 *)object; + } + TRACE("(%p) returning %p\n", This, *pSwapChain); return D3D_OK; } HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9 iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + HRESULT hrc = D3D_OK; + IWineD3DSwapChain *swapchain = NULL; + + TRACE("(%p) Relay\n", This); + + hrc = IWineD3DDevice_GetSwapChain(This->WineD3DDevice, iSwapChain, &swapchain); + if (hrc == D3D_OK && NULL != swapchain) { + IWineD3DSwapChain_GetParent(swapchain, (IUnknown **)pSwapChain); + IWineD3DSwapChain_Release(swapchain); + } + return hrc; } UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(LPDIRECT3DDEVICE9 iface) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); - return 1; + TRACE("(%p) Relay\n", This); + return IWineD3DDevice_GetNumberOfSwapChains(This->WineD3DDevice); } diff -urN wine.20050419/dlls/d3d9/tests/.cvsignore wine.20050419.dx9/dlls/d3d9/tests/.cvsignore --- wine.20050419/dlls/d3d9/tests/.cvsignore 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/tests/.cvsignore 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,3 @@ +Makefile +ddrawmodes.ok +testlist.c diff -urN wine.20050419/dlls/d3d9/tests/Makefile.in wine.20050419.dx9/dlls/d3d9/tests/Makefile.in --- wine.20050419/dlls/d3d9/tests/Makefile.in 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/tests/Makefile.in 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,13 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = d3d9.dll +IMPORTS = ddraw user32 gdi32 kernel32 d3d9 opengl + +CTESTS = \ + d3d9tests.c + +@MAKE_TEST_RULES@ + +### Dependencies: diff -urN wine.20050419/dlls/d3d9/tests/d3d9tests.c wine.20050419.dx9/dlls/d3d9/tests/d3d9tests.c --- wine.20050419/dlls/d3d9/tests/d3d9tests.c 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/tests/d3d9tests.c 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,783 @@ +/* + * Unit tests for ddraw functions + * + * Copyright (C) 2003 Sami Aario + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "wine/test.h" +#include "ddraw.h" +#include "d3d9.h" +#include "d3dx9.h" /*This is fore some of the structures, all code relating to calls is included in the testsuite*/ + +#ifdef NONAMELESSUNION +#define UNION_MEMBER(x, y) DUMMYUNIONNAME##x.y +#else +#define UNION_MEMBER(x, y) y +#endif + + + + +typedef struct MY_CUSTOM_VERTEX +{ + D3DXVECTOR3 position; + D3DCOLOR color; +} MY_CUSTOM_VERTEX; + +#define MY_CUSTOM_VERTEX_FVF (D3DFVF_XYZ|D3DFVF_DIFFUSE) + + +static D3DXVECTOR3 D3DXVector3(float x, float y, float z); +//static extern D3DXMATR* D3DXMatrixInentity ( D3DXMATRIX *pOut ); + +static IDirect3D9 *lpD3D9 = NULL; +static IDirect3DDevice9* lpD3D9Device = NULL; +static LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer = NULL; +static WNDCLASS wc; +static HWND hwnd; +static float wndWidth; +static float wndHeight; +static int modes_cnt; +static int modes_size; +static LPDDSURFACEDESC modes; + +static D3DXMATRIX m_matProjection; +static D3DXMATRIX m_matWorld; +static D3DXMATRIX m_matView; + + // These vars hold info on the vertices +static int m_iNumVertices; // Number of vertices that will make the shape +static int m_iNumPolygons; // Number of polygons to use +static float m_fXPos; // The starting X position of our shape +static float m_fYPos; // The starting Y position of our shape +static float m_fZPos; // The starting Z position + +static void createdirectdraw() +{ + HRESULT rc; + + + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = DefWindowProcA; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = GetModuleHandleA(0); + wc.hIcon = LoadIconA(wc.hInstance, IDI_APPLICATION); + wc.hCursor = LoadCursorA(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); + wc.lpszMenuName = NULL; + wc.lpszClassName = "TestWindowClass"; + if(!RegisterClassA(&wc)) + assert(0); + + wndWidth = GetSystemMetrics(SM_CXSCREEN); + wndHeight = GetSystemMetrics(SM_CXSCREEN); + + + hwnd = CreateWindowExA(0, "TestWindowClass", "TestWindowClass", + WS_POPUP, 0, 0, + wndWidth, + wndHeight, + NULL, NULL, GetModuleHandleA(0), NULL); + assert(hwnd != NULL); + + ShowWindow(hwnd, SW_HIDE); + UpdateWindow(hwnd); + SetFocus(hwnd); + ShowCursor(TRUE); + + /*rc = DirectDrawCreate(NULL, &lpDD, NULL);*/ + + lpD3D9 = Direct3DCreate9(D3D_SDK_VERSION); + ok(lpD3D9 != NULL ,"Direct3DCreate9 returned: %lx\n",rc); + + D3DDEVICE_CREATION_PARAMETERS dcp; + dcp.AdapterOrdinal = D3DADAPTER_DEFAULT; + dcp.DeviceType = D3DDEVTYPE_HAL; + dcp.hFocusWindow = hwnd; + dcp.BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING; + + D3DDISPLAYMODE d3ddm; + + IDirect3D9_GetAdapterDisplayMode(lpD3D9, dcp.AdapterOrdinal, &d3ddm); + + D3DPRESENT_PARAMETERS d3dpp; + + memset(&d3dpp, 0 , sizeof(d3dpp)); + + /*Creation parameters*/ + d3dpp.BackBufferCount = 1; + d3dpp.SwapEffect = 0;/*D3DSWAPEFFECT_DISCARD;*/ + d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; + d3dpp.EnableAutoDepthStencil = TRUE; + d3dpp.AutoDepthStencilFormat = D3DFMT_D16; + + d3dpp.BackBufferWidth = d3ddm.Width; + d3dpp.BackBufferHeight = d3ddm.Height; + d3dpp.BackBufferFormat = d3ddm.Format; + d3dpp.Windowed = FALSE; + d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; + d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; + + IDirect3D9_CreateDevice(lpD3D9, dcp.AdapterOrdinal, dcp.DeviceType, dcp.hFocusWindow, + dcp.BehaviorFlags, &d3dpp, &lpD3D9Device); + + D3DXMatrixIdentity(&m_matWorld); + D3DXMatrixIdentity(&m_matView); + D3DXMatrixIdentity(&m_matProjection); +} +/*most of the tests will be run with the viewport set to the identity matrix*/ +static void setupDevice(){ + + IDirect3DDevice9_SetRenderState(lpD3D9Device, D3DRS_LIGHTING, FALSE); + IDirect3DDevice9_SetRenderState(lpD3D9Device, D3DRS_CULLMODE, D3DCULL_NONE); + +/* IDirect3DDevice9_SetTransform(lpD3D9Device, D3DRS_CULLMODE, D3DCULL_NONE);*/ + IDirect3DDevice9_SetRenderState(lpD3D9Device, D3DRS_CULLMODE, D3DCULL_NONE); + + /*The device needs to be setup with no perspectine since it's not needed for mosts tests + ideally it should be switched on for test without-perspective, test with-perspective. + */ + /* + D3DXMatrixPerspectiveFovLH(&m_matProjection, D3DX_PI/4.0f, + (float)(wndWidth/wndHeight), + 1.0f, 1000.0f); */ + + IDirect3DDevice9_SetTransform(lpD3D9Device, D3DTS_PROJECTION, &m_matProjection); + + D3DXVECTOR3 v1; + D3DXVECTOR3 v2; + D3DXVECTOR3 v3; + + v1 = D3DXVector3(0, 0, -50); + v2 = D3DXVector3(0, 0, 0); + v3 = D3DXVector3(0, 1, 0); + /* D3DXVector3(0.0f, 00.0f, -50.0f) */ + /* D3DXVector3(0.0f, 0.0f, 0.0f) */ + /* D3DXVector3(0.0f, 1.0f, .0f) */ + + /* D3DXMatrixLookAtLH(&m_matView, &v1, &v2, &v3); */ + + IDirect3DDevice9_SetTransform(lpD3D9Device, D3DTS_VIEW, &m_matView); + + +} +#include + +/* TODO: This needs to be a lot more generic so that it's easy to create vertex buffers with differnt sets of properties for testing */ +static void createVertexBuffer(){ + + + MY_CUSTOM_VERTEX *pVertices = NULL; + + m_pVertexBuffer = NULL; + // 3 vertices per triangle, and 2 triangles per square, + // and 2 squares. so we have 3*2*2 = 12 vertices. + m_iNumVertices = 6; + // 2 squares, and each square is made out of 2 + // triangles. A triangle is a polygon, so we + // have 4 polygons. + m_iNumPolygons = 2; + m_fXPos = 0; + m_fYPos = 0; + m_fZPos = 0; + + + + /* This function is used to initialize our vertex buffer + * interface. It is a straight forward function, which gives + * you back a pointer to your initialized vertex buffer + * ******************************************************/ + IDirect3DDevice9_CreateVertexBuffer(lpD3D9Device, m_iNumVertices*sizeof(MY_CUSTOM_VERTEX), D3DUSAGE_WRITEONLY, MY_CUSTOM_VERTEX_FVF, D3DPOOL_DEFAULT, &m_pVertexBuffer, NULL); + + + /* Now we have to fill in the vertex buffer. To do that we have to + * lock the vertex buffer, then we fill in the vertex buffer, then we + * unlock it, so ... + * ******************************************************/ + IDirect3DVertexBuffer9_Lock(m_pVertexBuffer, 0, 0, (void**)&pVertices, 0); + + + /* Now we use pVertices to access our vertex buffer, and change it + * This time we make 12 vertices. 6 for 2 squares (quads) + * ******************************************************/ + + /* First triangle in first quad */ + pVertices[0].position = D3DXVector3(-.5f, -0.5f, 0.0f); + pVertices[1].position = D3DXVector3(.5f, -0.5f, 0.0f); + pVertices[2].position = D3DXVector3(-0.5f, 0.5f, 0.0f); + + /* Second triangle in first quad */ + pVertices[3].position = D3DXVector3(0.5f, 0.5f, 0.0f); + pVertices[4].position = D3DXVector3(0.5f, -0.5f, 0.0f); + pVertices[5].position = D3DXVector3(-0.5f, 0.5f, 0.0f); + + #if 0 + // First triangle in second quad + pVertices[6].position = D3DXVector3(-2.0f, -2.0f, 2.0f); + pVertices[7].position = D3DXVector3(2.0f, -2.0f, 2.0f); + pVertices[8].position = D3DXVector3(-2.0f, 2.0f, 2.0f); + + // Second triangle in second quad + pVertices[9].position = D3DXVector3(2.0f, 2.0f, 2.0f); + pVertices[10].position = D3DXVector3(2.0f, -2.0f, 2.0f); + pVertices[11].position = D3DXVector3(-2.0f, 2.0f, 2.0f); + #endif + /* Ok we finished fixing the vertices' positions + * now we'll give them color + + * We will fill in the first 6 vertices with one color + * and the last 6 vertices with a different color. + * m_iNumVertices is the total number of vertices, so + * divide by 2 and you fill in half the buffer with one + * color, and the other half with another colot + * ******************************************************/ + + int i; + for(i = 0; i < (int)(m_iNumVertices); i++) + { + pVertices[i].color = D3DCOLOR_ARGB(255,0 ,0, 255); //Blue + } +#if 0 + // Make the colors different for the second square + for(i = (int)(m_iNumVertices/2); i < m_iNumVertices; i++) + { + // Notice I am using a different D3DCOLOR macro + // this does the same thing. right click on it in + // VC++ 6.0 and click on Go To Definition, and see what comes up + pVertices[i].color = D3DCOLOR_XRGB(255, 255, 0); //Yellow + } +#endif + /* Ok, we are done with the vertex buffer. now unlock it */ + IDirect3DVertexBuffer9_Unlock(m_pVertexBuffer); + + return TRUE; +} + + + + +static void destroyVertexBuffer(){ + if(m_pVertexBuffer != NULL){ + IDirect3DVertexBuffer9_Release(m_pVertexBuffer); + } +} + + +#include + +static void drawSomething(){ +/*draw something onto the iface*/ +/*just draw a primitive*/ + + createVertexBuffer(); + if(D3D_OK == IDirect3DDevice9_SetFVF(lpD3D9Device, MY_CUSTOM_VERTEX_FVF)){ + printf("ok\n"); + }; + + if(D3D_OK == IDirect3DDevice9_SetStreamSource(lpD3D9Device, 0, m_pVertexBuffer, 0, sizeof(MY_CUSTOM_VERTEX))){ + printf("ok\n"); + } + + // We are going to be scaling our object, moving it, and rotating + // it about the Z_Axis, so we have a matrix for Traslation + // Scaling, and Rotation. + D3DXMATRIX matS, matZ, matT; + + // We use handy D3DX functions to create our matrices + if(D3D_OK == D3DXMatrixScaling(&matS, 1.0f, 1.0f, 1.0f)){ + printf("ok\n"); + } + + /* D3DXMatrixRotationZ(&matZ, timeGetTime()/1000.0f);*/ + // We're creating the translation matrix with variables + // because we want to be able to move the quads on the + // screen. + if(D3D_OK == D3DXMatrixTranslation(&matT, m_fXPos, m_fYPos, m_fZPos)){ + printf("ok\n"); + } + + // Multiply all teh matrices together to get the final matrix. + // So now m_matWorld is a combination of movement (matT), + // rotation along the z axis (matR) and a scale value (matS) + m_matWorld = matS;/* * matZ * matT;*/ + + IDirect3DDevice9_Clear(lpD3D9Device, 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,30), 1.0f, 0); + IDirect3DDevice9_Present(lpD3D9Device, NULL, NULL, NULL, NULL); + printf("Dark blue filling the window\n"); + getchar(); + IDirect3DDevice9_BeginScene(lpD3D9Device); + + // Set the world matrix to what we calculated above. Now anything + // you draw after setting the world amtrix will be affected by the + // transformations in m_matWorld. Try setting the world matrix + // to an identity and see what happens. + IDirect3DDevice9_SetTransform(lpD3D9Device, D3DTS_WORLD, &m_matWorld); + + IDirect3DDevice9_DrawPrimitive(lpD3D9Device, D3DPT_TRIANGLELIST, 0, m_iNumPolygons); + + IDirect3DDevice9_EndScene(lpD3D9Device); + + IDirect3DDevice9_Present(lpD3D9Device, NULL, NULL, NULL, NULL); + printf("A light blue 'sqaure' on a darkblue background in the center of the window filling half the window\n"); + getchar(); + IDirect3DDevice9_Clear(lpD3D9Device, 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(30,0,30), 1.0f, 0); + IDirect3DDevice9_Present(lpD3D9Device, NULL, NULL, NULL, NULL); + printf("A purple filling the window\n"); + getchar(); + + + #if 0 + /* More stests */ + /* Test all FVF's and custom formats */ + /* Test colour blending operations */ + /* Test render targets */ + /* Textures */ + /* Materials */ + /* Transforms */ + /* Cube Textures */ + /* Volume Textures */ + /* Locking */ + /* n powe of two */ + /* viewports */ + #endif + + IDirect3DDevice9_SetStreamSource(lpD3D9Device, 0, NULL, 0, sizeof(MY_CUSTOM_VERTEX)); + + return TRUE; + + + getchar(); +} +static void releasedirectdraw() +{ + if( lpD3D9Device != NULL){ + IDirect3DDevice9_Release(lpD3D9Device); + } + if( lpD3D9 != NULL ) + { + IDirect3D9_Release(lpD3D9); + lpD3D9 = NULL; + } +} + + +#if 0 +D3DXMATRIX* D3DXMatrixIdentity ( D3DXMATRIX *pOut ){ + + pOut->_11 = 1; + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = 1; + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 1; + pOut->_33 = 0; + pOut->_34 = 0; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = 0; + pOut->_44 = 1; + + return pOut; +} + +#endif +D3DXVECTOR3 D3DXVector3(float x, float y, float z){ + D3DXVECTOR3 This; + This.x = x; + This.y = y; + This.z = z; + return This; +} + + + +#if 0 +static void adddisplaymode(LPDDSURFACEDESC lpddsd) +{ + if (!modes) + modes = malloc((modes_size = 2) * sizeof(DDSURFACEDESC)); + if (modes_cnt == modes_size) + modes = realloc(modes, (modes_size *= 2) * sizeof(DDSURFACEDESC)); + assert(modes); + modes[modes_cnt++] = *lpddsd; +} + +static void flushdisplaymodes() +{ + free(modes); + modes = 0; + modes_cnt = modes_size = 0; +} + +HRESULT WINAPI enummodescallback(LPDDSURFACEDESC lpddsd, LPVOID lpContext) +{ + trace("Width = %li, Height = %li, Refresh Rate = %li\r\n", + lpddsd->dwWidth, lpddsd->dwHeight, + lpddsd->UNION_MEMBER(2, dwRefreshRate)); + adddisplaymode(lpddsd); + + return DDENUMRET_OK; +} + +void enumdisplaymodes() +{ + DDSURFACEDESC ddsd; + HRESULT rc; + + ZeroMemory(&ddsd, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + + rc = IDirectDraw_EnumDisplayModes(lpDD, + DDEDM_STANDARDVGAMODES, &ddsd, 0, enummodescallback); + ok(rc==DD_OK,"EnumDisplayModes returned: %lx\n",rc); +} + +static void setdisplaymode(int i) +{ + HRESULT rc; + + rc = IDirectDraw_SetCooperativeLevel(lpDD, + hwnd, DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(rc==DD_OK,"SetCooperativeLevel returned: %lx\n",rc); + if (modes[i].dwFlags & DDSD_PIXELFORMAT) + { + if (modes[i].ddpfPixelFormat.dwFlags & DDPF_RGB) + { + rc = IDirectDraw_SetDisplayMode(lpDD, + modes[i].dwWidth, modes[i].dwHeight, + modes[i].ddpfPixelFormat.UNION_MEMBER(1, dwRGBBitCount)); + ok(rc==DD_OK,"SetDisplayMode returned: %lx\n",rc); + rc = IDirectDraw_RestoreDisplayMode(lpDD); + ok(rc==DD_OK,"RestoreDisplayMode returned: %lx\n",rc); + + } + } +} + +static void createsurface() +{ + DDSURFACEDESC ddsd; + DDSCAPS ddscaps; + HRESULT rc; + + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | + DDSCAPS_FLIP | + DDSCAPS_COMPLEX; + ddsd.dwBackBufferCount = 1; + rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSPrimary, NULL ); + ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc); + ddscaps.dwCaps = DDSCAPS_BACKBUFFER; + rc = IDirectDrawSurface_GetAttachedSurface(lpDDSPrimary, &ddscaps, &lpDDSBack); + ok(rc==DD_OK,"GetAttachedSurface returned: %lx\n",rc); +} + +static void destroysurface() +{ + if( lpDDSPrimary != NULL ) + { + IDirectDrawSurface_Release(lpDDSPrimary); + lpDDSPrimary = NULL; + } +} + +static void testsurface() +{ + const char* testMsg = "ddraw device context test"; + HDC hdc; + HRESULT rc; + + rc = IDirectDrawSurface_GetDC(lpDDSBack, &hdc); + ok(rc==DD_OK, "IDirectDrawSurface_GetDC returned: %lx\n",rc); + SetBkColor(hdc, RGB(0, 0, 255)); + SetTextColor(hdc, RGB(255, 255, 0)); + TextOut(hdc, 0, 0, testMsg, lstrlen(testMsg)); + IDirectDrawSurface_ReleaseDC(lpDDSBack, hdc); + ok(rc==DD_OK, "IDirectDrawSurface_ReleaseDC returned: %lx\n",rc); + + while (1) + { + rc = IDirectDrawSurface_Flip(lpDDSPrimary, NULL, DDFLIP_WAIT); + ok(rc==DD_OK || rc==DDERR_SURFACELOST, "IDirectDrawSurface_BltFast returned: %lx\n",rc); + + if (rc == DD_OK) + { + break; + } + else if (rc == DDERR_SURFACELOST) + { + rc = IDirectDrawSurface_Restore(lpDDSPrimary); + ok(rc==DD_OK, "IDirectDrawSurface_Restore returned: %lx\n",rc); + } + } +} + +static void testdisplaymodes() +{ + int i; + + for (i = 0; i < modes_cnt; ++i) + { + setdisplaymode(i); + createsurface(); + testsurface(); + destroysurface(); + } +} +#endif + +START_TEST(d3d9tests) +{ + createdirectdraw(); + #if 0 + enumdisplaymodes(); + testdisplaymodes(); + flushdisplaymodes(); + #endif + setupDevice(); + getchar(); + drawSomething(); + getchar(); + releasedirectdraw(); +} + + + +#if 0 + +/* ************************************************************** +* DirectX 9 Test suite for Wine +* Copyright +* 2005 Oliver Stieber +* +* +* +* +* +* +* +* +* +* Features: +* +* +* When something on the todo list is compleate move it to the features list +* TODO: +* Device Creation +* Device Capabilities (manual checking required?) +* Creating surfaces +* Surface locking +* Creating textures +* Texture locking +* Clear +* Present +* Reset +* +**************************************************************** */ + +/*Basic RGBA additive colours and alpha as bitwise definitions*/ + +#DEFINE RED (1 << 0) +#DEFINE GREEN (1 << 1) +#DEFINE BLUE (1 << 2) +#DEFINE ALPHA (1 << 3) +#DEFINE YELLOW (RED | GREEN) +#DEFINE CYAN (GREEN | BLUE) +#DEFINE MAGENTA (RED | BLUE) +#DEFINE BLACK 0 +#DEFINE WHITE (RED | GREEN | BLUE) + +/*ARGB Definitiona*/ +#DEFINE ARGB_RED (1 << 1) +#DEFINE ARGB_GREEN (1 << 2) +#DEFINE ARGB_BLUE (1 << 3) +#DEFINE ARGB_ALPHA (1 << 0) + + +#DEFINE YELLOW (ARGB_RED | ARGB_GREEN) +#DEFINE CYAN (ARGB_GREEN | ARGB_BLUE) +#DEFINE MAGENTA (ARGB_RED | ARGB_BLUE) +#DEFINE BLACK 0 +#DEFINE WHITE (ARGB_RED | ARGB_GREEN | ARGB_BLUE) + +/*Basic definiations for diffent colour formats*/ +#DEFINE MAKE_R8G8B8A8(r, g, b, a) ( r | (g << 8) | (b << 16) | (a << 24)) +#DEFINE MAKE_R4G4B4A4(r, g, b, a) ( r | (g << 4) | (b << 8) | (a << 16)) + + +#DEFINE MAKE_A8R8G8B8(a, r, g, b) ( a | (r << 8) | ( g << 16) | (b << 24)) + +#DEFINE MAKE_R8G8B8(r, g, b) MAKE_R8G8B8A8(r, g, b, 0) /*This may not be correct?*/ +#DEFINE MAKE_R8G8B8X8(r, g, b) MAKE_R8G8B8(r, g, b + +/*Macros to go from 1bit to many bits + + +*/ + +#DEFINE RED_BIT(c) ((c & 1) ) +#DEFINE GREEN_BIT(c) ((c & 2) >> 1) +#DEFINE BLUE_BIT(c) ((c & 4) >> 2) +#DEFINE ALPHA_BIT(c) ((c & 8) >> 3) + +#DEFINE CONVERT_TO_8(v) (v | (v << 1) | (v << 2) | (v << 3) | (v << 4) | (v << 5) | (v << 6) | (v << 7)) +#DEFINE CONVERT_TO_4(v) (v | (v << 1) | (v << 2) | (v << 3)) + +#DEFINE BITCOLOUR_TO_RGBA8(c) ( MAKE_R8G8B8A8(CONVERT_TO_8(RED_BIT(c)) + ,CONVERT_TO_8(GREEN_BIT(c)) + ,CONVERT_TO_8(BLUE_BIT(c) + ,CONVERT_TO_8(ALPHA_BIT(c))) + +#DEFINE BITCOLOUR_TO_RGBA4(c) ( MAKE_R4G4B4A4(CONVERT_TO_4(RED_BIT(c)) + ,CONVERT_TO_4(GREEN_BIT(c)) + ,CONVERT_TO_4(BLUE_BIT(c) + ,CONVERT_TO_4(ALPHA_BIT(c))) + + +typdef enum TEXTURESTYPES { + PASS + FAIL + PASSCHECK + FAILCHECK + PASSCHECKALPHA + FAILCHECKALPHA +} TEXTURESTYPES; + +MAX_TEXTURE_TYPES=FAILCHECKALPHA +1; + +int * checkpatterns[MAX_TEXTURE_TYPES]; +int * checkpatterns[PASS] = { 1, GREEN }; +int * checkpatterns[FAIL] = { 1, RED }; +int * checkpatterns[PASSCHECK] = { 2, GREEN, BLACK + , BLACK, GREEN}; +int * checkpatterns[FAILCHECK] = { 2, RED, BLACK + , BLACK, RED}; + +int * checkpatterns[PASSCHECKALPHA] = { 2, BLACK , RED + GREEN ,BLACK} +int * checkpatterns[FAILCHECKALPHA] = { 2, BLACK , GREEN + , RED | ALPHA , RED | ALPHA}; + + + +/* +make a basic texture using one of the check patterns +*/ +void * CreateTexture(TEXTURESTYPES type, int width, int height, int format){ + + if(height != width){ + /*fail, nopow2 textures arn't supported at the moment*/ + return NULL; + } + int width; + int checkWidth = width / 2; + + if( type < 0 || type >= MAX_TEXTURE_TYPES ){ + /*fail out of range*/ + return NULL; + } + int bpp = 32; + + void * result = HeapAlloc(GetProcessHeap(), 0 , width * height * (bpp >> 3)); + + int* pattern = checkPatterns[type]; + + int checks = width >> 4; /*make each check 16x16*/ + /*should adjust by the pattern width or something*/ + if(checks >= 0 ){ + checks = 2; + } + + if(pattern[0] == 1){ + checks = 1; + } + + int checkwidth = width/checks; + char* data = result; + + for(y = 0 ; y < height; y ++){ + for(u = 0 ; u < checks; u ++){ + colour = BITCOLOUR_TO_RGBA8(pattern[(u % pattern[0]) + (y / checkwidth) % pattern[0]) * pattern[0]]); + for(x = 0; x < checkwidth; x++){ + (*data++)=colour; + } + } + } + + return result; +} + +typedef struct Parameter { + union { + int intV; + float floatV; + void* pV; + } value; + char* name; +} Parameter; + +void * jobs; + +run(TEST_CASES test){ +/*The test is just going to consist of a lot of functions to run in order that return pass or fail*/ +/*We need to do some setting up of parametes*/ + for(i = 0 ; i < totaljobs; i++){ + if(jobs[i](parameters) == FAIL){ + return FAIL; + } + } + + +} + +int createWindowInThread(Parameter* parameters){ + /*Create a window with it's event loop in a seperate thread (this allows for the runction to return, leaving the window intact)*/ + setIParameter(parameters,"HWND", hwnd); + +} + +int initilize(Parameter * parameters){ + return PASS; +} + + +void setIParameter(Parameter* parameters, char* parametername, int value){ + /*if the parameter doesn't exist create it*/ +} + +void setFParameter(Parameter* parameters, char* parametername, float value){ + /*if the parameter doesn't exist create it*/ +} + +void createIParameter(Parameter* parameters, char* parametername, int value){ + +} +void createFParameter(Pa + +#endif diff -urN wine.20050419/dlls/d3d9/texture.c wine.20050419.dx9/dlls/d3d9/texture.c --- wine.20050419/dlls/d3d9/texture.c 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/texture.c 2005-04-20 01:52:56.000000000 -0600 @@ -212,7 +212,6 @@ IDirect3DTexture9Impl_AddDirtyRect }; - /* IDirect3DDevice9 IDirect3DTexture9 Methods follow: */ HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(LPDIRECT3DDEVICE9 iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle) { diff -urN wine.20050419/dlls/d3d9/vertexdeclaration.c wine.20050419.dx9/dlls/d3d9/vertexdeclaration.c --- wine.20050419/dlls/d3d9/vertexdeclaration.c 2005-03-02 05:16:11.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/vertexdeclaration.c 2005-04-20 01:52:56.000000000 -0600 @@ -22,7 +22,7 @@ #include "config.h" #include "d3d9_private.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d); +WINE_DEFAULT_DEBUG_CHANNEL(d3d9); /* IDirect3DVertexDeclaration9 IUnknown parts follow: */ HRESULT WINAPI IDirect3DVertexDeclaration9Impl_QueryInterface(LPDIRECT3DVERTEXDECLARATION9 iface, REFIID riid, LPVOID* ppobj) { @@ -30,7 +30,7 @@ if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3DVertexDeclaration9)) { - IDirect3DVertexDeclaration9Impl_AddRef(iface); + IUnknown_AddRef(iface); *ppobj = This; return D3D_OK; } @@ -124,13 +124,8 @@ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IDirect3DVertexDeclaration9Impl *pDeclImpl = (IDirect3DVertexDeclaration9Impl *)pDecl; HRESULT hr = S_OK; - - This->UpdateStateBlock->vertexDecl = NULL; if (NULL != pDecl) { hr = IWineD3DDevice_SetVertexDeclaration(This->WineD3DDevice, pDeclImpl->wineD3DVertexDeclaration); - if (SUCCEEDED(hr)) { - This->UpdateStateBlock->vertexDecl = (IDirect3DVertexDeclaration9Impl*) pDecl; - } } return hr; } @@ -139,15 +134,19 @@ IDirect3DDevice9Impl* This = (IDirect3DDevice9Impl*) iface; IWineD3DVertexDeclaration* pTest = NULL; HRESULT hr = S_OK; - IDirect3DVertexDeclaration9Impl* pCur = This->StateBlock->vertexDecl; if (NULL == ppDecl) { return D3DERR_INVALIDCALL; } *ppDecl = NULL; hr = IWineD3DDevice_GetVertexDeclaration(This->WineD3DDevice, &pTest); - if (SUCCEEDED(hr) && (NULL == pCur || pCur->wineD3DVertexDeclaration == pTest)) { - *ppDecl = (IDirect3DVertexDeclaration9*) pCur; + if(NULL != pTest){ + IWineD3DResource_GetParent(pTest, (IUnknown **)ppDecl); + IWineD3DResource_Release(pTest); + }else{ + *ppDecl = (IDirect3DVertexDeclaration9*)NULL; } + + TRACE("(%p) : returning %p\n", This, *ppDecl); return hr; } diff -urN wine.20050419/dlls/d3d9/vertexshader.c wine.20050419.dx9/dlls/d3d9/vertexshader.c --- wine.20050419/dlls/d3d9/vertexshader.c 2005-01-24 05:44:01.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/vertexshader.c 2005-04-20 01:52:56.000000000 -0600 @@ -22,7 +22,7 @@ #include "config.h" #include "d3d9_private.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); +WINE_DEFAULT_DEBUG_CHANNEL(d3d9); /* IDirect3DVertexShader9 IUnknown parts follow: */ HRESULT WINAPI IDirect3DVertexShader9Impl_QueryInterface(LPDIRECT3DVERTEXSHADER9 iface, REFIID riid, LPVOID* ppobj) { @@ -30,7 +30,7 @@ if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3DVertexShader9)) { - IDirect3DVertexShader9Impl_AddRef(iface); + IUnknown_AddRef(iface); *ppobj = This; return D3D_OK; } @@ -55,7 +55,9 @@ TRACE("(%p) : ReleaseRef to %ld\n", This, ref); if (ref == 0) { + IWineD3DVertexShader_Release(This->wineD3DVertexShader); HeapFree(GetProcessHeap(), 0, This); + } return ref; } @@ -63,16 +65,22 @@ /* IDirect3DVertexShader9 Interface follow: */ HRESULT WINAPI IDirect3DVertexShader9Impl_GetDevice(LPDIRECT3DVERTEXSHADER9 iface, IDirect3DDevice9** ppDevice) { IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - TRACE("(%p) : returning %p\n", This, This->Device); - *ppDevice = (LPDIRECT3DDEVICE9) This->Device; - IDirect3DDevice9Impl_AddRef(*ppDevice); + IWineD3DDevice *myDevice = NULL; + + TRACE("(%p) : Relay\n", This); + + IWineD3DVertexShader_GetDevice(This->wineD3DVertexShader, &myDevice); + IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice); + IWineD3DDevice_Release(myDevice); + TRACE("(%p) returing (%p)", This, *ppDevice); return D3D_OK; } HRESULT WINAPI IDirect3DVertexShader9Impl_GetFunction(LPDIRECT3DVERTEXSHADER9 iface, VOID* pData, UINT* pSizeOfData) { IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + + TRACE("(%p) : Relay\n", This); + return IWineD3DVertexShader_GetFunction(This->wineD3DVertexShader, pData, pSizeOfData); } @@ -89,148 +97,92 @@ /* IDirect3DDevice9 IDirect3DVertexShader9 Methods follow: */ HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexShader(LPDIRECT3DDEVICE9 iface, CONST DWORD* pFunction, IDirect3DVertexShader9** ppShader) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); + HRESULT hrc = D3D_OK; + IDirect3DVertexShader9Impl *object; + + FIXME("(%p) : Relay (disabled) \n", This); + *ppShader = NULL; return D3D_OK; + /* Setup a stub object for now */ + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + TRACE("(%p) : pFunction(%p), ppShader(%p)\n", This, pFunction, ppShader); + if (NULL == object) { + FIXME("Allocation of memory failed\n"); + *ppShader = NULL; + return D3DERR_OUTOFVIDEOMEMORY; + } + + object->ref = 1; + object->lpVtbl = &Direct3DVertexShader9_Vtbl; + hrc= IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, pFunction, &object->wineD3DVertexShader, (IUnknown *)object); + + if (FAILED(hrc)) { + /* free up object */ + FIXME("Call to IWineD3DDevice_CreateVertexShader failed\n"); + HeapFree(GetProcessHeap(), 0, object); + *ppShader = NULL; + }else{ + *ppShader = (IDirect3DVertexShader9 *)object; + } + + TRACE("(%p) : returning %p\n", This, *ppShader); + return hrc; } HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(LPDIRECT3DDEVICE9 iface, IDirect3DVertexShader9* pShader) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - - This->UpdateStateBlock->VertexShader = pShader; - This->UpdateStateBlock->Changed.vertexShader = TRUE; - This->UpdateStateBlock->Set.vertexShader = TRUE; - - /* Handle recording of state blocks */ - if (This->isRecordingState) { - TRACE("Recording... not performing anything\n"); - return D3D_OK; - } - /** - * TODO: merge HAL shaders context switching from prototype - */ + TRACE("(%p) : Relay (disabled) \n", This); return D3D_OK; + return IWineD3DDevice_SetVertexShader(This->WineD3DDevice, pShader==NULL?NULL:((IDirect3DVertexShader9Impl *)pShader)->wineD3DVertexShader); } HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(LPDIRECT3DDEVICE9 iface, IDirect3DVertexShader9** ppShader) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - TRACE("(%p) : GetVertexShader returning %p\n", This, This->StateBlock->VertexShader); - *ppShader = This->StateBlock->VertexShader; - IDirect3DVertexShader9Impl_AddRef(*ppShader); - return D3D_OK; + IWineD3DVertexShader *pShader; + HRESULT hrc = D3D_OK; + hrc = IWineD3DDevice_GetVertexShader(This->WineD3DDevice, &pShader); + if(hrc == D3D_OK){ + hrc = IWineD3DVertexShader_GetParent(pShader, (IUnknown **)ppShader); + IWineD3DVertexShader_Release(pShader); + } + TRACE("(%p) : returning %p\n", This, *ppShader); + return hrc; } HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantF(LPDIRECT3DDEVICE9 iface, UINT Register, CONST float* pConstantData, UINT Vector4fCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - - if (Register + Vector4fCount > D3D_VSHADER_MAX_CONSTANTS) { - ERR("(%p) : SetVertexShaderConstant C[%u] invalid\n", This, Register); - return D3DERR_INVALIDCALL; - } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - if (Vector4fCount > 1) { - CONST FLOAT* f = pConstantData; - UINT i; - TRACE("(%p) : SetVertexShaderConstant C[%u..%u]=\n", This, Register, Register + Vector4fCount - 1); - for (i = 0; i < Vector4fCount; ++i) { - TRACE("{%f, %f, %f, %f}\n", f[0], f[1], f[2], f[3]); - f += 4; - } - } else { - const FLOAT* f = (const FLOAT*) pConstantData; - TRACE("(%p) : SetVertexShaderConstant, C[%u]={%f, %f, %f, %f}\n", This, Register, f[0], f[1], f[2], f[3]); - } - This->UpdateStateBlock->Changed.vertexShaderConstant = TRUE; - memcpy(&This->UpdateStateBlock->vertexShaderConstantF[Register], pConstantData, Vector4fCount * 4 * sizeof(FLOAT)); - return D3D_OK; + TRACE("(%p) : Relay\n", This); + return IWineD3DDevice_SetVertexShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount); } HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantF(LPDIRECT3DDEVICE9 iface, UINT Register, float* pConstantData, UINT Vector4fCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - - TRACE("(%p) : C[%u] count=%u\n", This, Register, Vector4fCount); - if (Register + Vector4fCount > D3D_VSHADER_MAX_CONSTANTS) { - return D3DERR_INVALIDCALL; - } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - memcpy(pConstantData, &This->UpdateStateBlock->vertexShaderConstantF[Register], Vector4fCount * 4 * sizeof(FLOAT)); - return D3D_OK; + TRACE("(%p) : Relay\n", This); + return IWineD3DDevice_GetVertexShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount); } HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantI(LPDIRECT3DDEVICE9 iface, UINT Register, CONST int* pConstantData, UINT Vector4iCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - - if (Register + Vector4iCount > D3D_VSHADER_MAX_CONSTANTS) { - ERR("(%p) : SetVertexShaderConstantI C[%u] invalid\n", This, Register); - return D3DERR_INVALIDCALL; - } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - if (Vector4iCount > 1) { - CONST int* f = pConstantData; - UINT i; - TRACE("(%p) : SetVertexShaderConstantI C[%u..%u]=\n", This, Register, Register + Vector4iCount - 1); - for (i = 0; i < Vector4iCount; ++i) { - TRACE("{%d, %d, %d, %d}\n", f[0], f[1], f[2], f[3]); - f += 4; - } - } else { - CONST int* f = pConstantData; - TRACE("(%p) : SetVertexShaderConstantI, C[%u]={%i, %i, %i, %i}\n", This, Register, f[0], f[1], f[2], f[3]); - } - This->UpdateStateBlock->Changed.vertexShaderConstant = TRUE; - memcpy(&This->UpdateStateBlock->vertexShaderConstantI[Register], pConstantData, Vector4iCount * 4 * sizeof(int)); - return D3D_OK; + TRACE("(%p) : Relay\n", This); + return IWineD3DDevice_SetVertexShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount); } HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantI(LPDIRECT3DDEVICE9 iface, UINT Register, int* pConstantData, UINT Vector4iCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + TRACE("(%p) : Relay\n", This); + return IWineD3DDevice_GetVertexShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount); - TRACE("(%p) : C[%u] count=%u\n", This, Register, Vector4iCount); - if (Register + Vector4iCount > D3D_VSHADER_MAX_CONSTANTS) { - return D3DERR_INVALIDCALL; - } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - memcpy(pConstantData, &This->UpdateStateBlock->vertexShaderConstantI[Register], Vector4iCount * 4 * sizeof(FLOAT)); - return D3D_OK; } HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantB(LPDIRECT3DDEVICE9 iface, UINT Register, CONST BOOL* pConstantData, UINT BoolCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - UINT i; - - if (Register + BoolCount > D3D_VSHADER_MAX_CONSTANTS) { - ERR("(%p) : SetVertexShaderConstantB C[%u] invalid\n", This, Register); - return D3DERR_INVALIDCALL; - } - if (NULL == pConstantData) { - return D3DERR_INVALIDCALL; - } - if (BoolCount > 1) { - CONST BOOL* f = pConstantData; - TRACE("(%p) : SetVertexShaderConstantB C[%u..%u]=\n", This, Register, Register + BoolCount - 1); - for (i = 0; i < BoolCount; ++i) { - TRACE("{%u}\n", f[i]); - } - } else { - CONST BOOL* f = pConstantData; - TRACE("(%p) : SetVertexShaderConstantB, C[%u]={%u}\n", This, Register, f[0]); - } - This->UpdateStateBlock->Changed.vertexShaderConstant = TRUE; - for (i = 0; i < BoolCount; ++i) { - This->UpdateStateBlock->vertexShaderConstantB[Register] = pConstantData[i]; - } - return D3D_OK; + TRACE("(%p) : Relay\n", This); + return IWineD3DDevice_SetVertexShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount); } HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantB(LPDIRECT3DDEVICE9 iface, UINT Register, BOOL* pConstantData, UINT BoolCount) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; + TRACE("(%p) : Relay\n", This); + return IWineD3DDevice_GetVertexShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount); + } diff -urN wine.20050419/dlls/d3d9/volume.c wine.20050419.dx9/dlls/d3d9/volume.c --- wine.20050419/dlls/d3d9/volume.c 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/volume.c 2005-04-20 01:52:56.000000000 -0600 @@ -114,6 +114,8 @@ TRACE("(%p) Relay\n", This); + TRACE("(%p) Relay\n", This); + /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */ wined3ddesc.Format = &pDesc->Format; wined3ddesc.Type = &pDesc->Type; @@ -155,6 +157,7 @@ }; + /* Internal function called back during the CreateVolumeTexture */ HRESULT WINAPI D3D9CB_CreateVolume(IUnknown *pDevice, UINT Width, UINT Height, UINT Depth, WINED3DFORMAT Format, D3DPOOL Pool, DWORD Usage, diff -urN wine.20050419/dlls/d3d9/volumetexture.c wine.20050419.dx9/dlls/d3d9/volumetexture.c --- wine.20050419/dlls/d3d9/volumetexture.c 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3d9/volumetexture.c 2005-04-20 01:52:56.000000000 -0600 @@ -157,6 +157,8 @@ TRACE("(%p) Relay\n", This); + TRACE("(%p) Relay\n", This); + /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */ wined3ddesc.Format = &pDesc->Format; wined3ddesc.Type = &pDesc->Type; @@ -243,6 +245,8 @@ TRACE("(%p) Relay\n", This); + TRACE("(%p) Relay\n", This); + /* Allocate the storage for the device */ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolumeTexture9Impl)); if (NULL == object) { diff -urN wine.20050419/dlls/d3dx9/.cvsignore wine.20050419.dx9/dlls/d3dx9/.cvsignore --- wine.20050419/dlls/d3dx9/.cvsignore 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3dx9/.cvsignore 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,3 @@ +Makefile +d3dx8.dll.dbg.c +d3dx8.spec.def diff -urN wine.20050419/dlls/d3dx9/Makefile.in wine.20050419.dx9/dlls/d3dx9/Makefile.in --- wine.20050419/dlls/d3dx9/Makefile.in 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3dx9/Makefile.in 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,17 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx9.dll +IMPORTS = d3d9 user32 gdi32 kernel32 +EXTRAINCL = @X_CFLAGS@ +EXTRALIBS = -ldxguid -luuid @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ @OPENGL_LIBS@ + +C_SRCS = \ + d3dx9_main.c \ + d3dxbuffer.c \ + font.c + +@MAKE_DLL_RULES@ + +### Dependencies: diff -urN wine.20050419/dlls/d3dx9/d3dx9.spec wine.20050419.dx9/dlls/d3dx9/d3dx9.spec --- wine.20050419/dlls/d3dx9/d3dx9.spec 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3dx9/d3dx9.spec 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,60 @@ +@ stdcall D3DXCreateBuffer(long ptr) +@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) +@ stdcall D3DXGetFVFVertexSize(long) +@ stdcall D3DXAssembleShader(ptr long long ptr ptr ptr) +@ stdcall D3DXAssembleShaderFromFileA(ptr long ptr ptr ptr) +@ stdcall D3DXAssembleShaderFromFileW(ptr long ptr ptr ptr) +@ stdcall D3DXCreateTextureFromFile(ptr ptr ptr) +@ stdcall D3DXMatrixPerspectiveFovLH(ptr double double double double) +@ stdcall D3DXVec4Add(ptr ptr ptr) +@ stdcall D3DXVec3Add(ptr ptr ptr) +@ stdcall D3DXVec2Add(ptr ptr ptr) +@ stdcall D3DXVec4Subtract(ptr ptr ptr) +@ stdcall D3DXVec3Subtract(ptr ptr ptr) +@ stdcall D3DXVec2Subtract(ptr ptr ptr) +@ stdcall D3DXVec2Dot(ptr ptr) +@ stdcall D3DXVec3Dot(ptr ptr) +@ stdcall D3DXVec4Dot(ptr ptr) +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) +@ stdcall D3DXVec3Cross(ptr ptr ptr) +@ stdcall D3DXVec4Scale(ptr ptr double) +@ stdcall D3DXVec3Scale(ptr ptr double) +@ stdcall D3DXVec2Scale(ptr ptr double) +@ stdcall D3DXVec2LengthSq(ptr) +@ stdcall D3DXVec2Length(ptr) +@ stdcall D3DXVec3LengthSq(ptr) +@ stdcall D3DXVec3Length(ptr) +@ stdcall D3DXVec4LengthSq(ptr) +@ stdcall D3DXVec4Length(ptr) +@ stdcall D3DXVec3Normalize(ptr ptr) +@ stdcall D3DXMatrixTranslation(ptr double double double) +@ stdcall D3DXMatrixDeterminant(ptr) +@ stdcall D3DXMatrixInverse(ptr ptr ptr) +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr double double double) +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) +@ stdcall D3DXMatrixRotationAxis(ptr ptr double) +@ stdcall D3DXMatrixReflect(ptr ptr) +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) +@ stdcall D3DXFloat32To16Array(ptr ptr long) +@ stdcall D3DXFloat16To32Array(ptr ptr long) +@ stdcall D3DXColorSubtract(ptr ptr ptr) +@ stdcall D3DXColorScale(ptr ptr double) +@ stdcall D3DXColorNegative(ptr ptr) +@ stdcall D3DXColorModulate(ptr ptr ptr) +@ stdcall D3DXColorLerp(ptr ptr ptr double) +@ stdcall D3DXColorAdjustSaturation(ptr ptr double) +@ stdcall D3DXColorAdjustContrast(ptr ptr double) +@ stdcall D3DXColorAdd(ptr ptr ptr) +@ stdcall D3DXPlaneNormalize(ptr ptr) +@ stdcall D3DXPlaneScale(ptr ptr double) +@ stdcall D3DXPlaneLength(ptr) +@ stdcall D3DXMatrixShadow(ptr ptr ptr) +@ stdcall D3DXMatrixScaling(ptr double double double) +@ stdcall D3DXMatrixRotationZ(ptr double) +@ stdcall D3DXMatrixRotationY(ptr double) +@ stdcall D3DXMatrixRotationX(ptr double) +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) +@ stdcall D3DXMatrixOrthoLH(ptr double double double double) +@ stdcall D3DXMatrixOrthoRH(ptr double double double double) \ No newline at end of file diff -urN wine.20050419/dlls/d3dx9/d3dx9_main.c wine.20050419.dx9/dlls/d3dx9/d3dx9_main.c --- wine.20050419/dlls/d3dx9/d3dx9_main.c 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3dx9/d3dx9_main.c 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,1861 @@ +/* + * Direct3D X 9 main file + * + * Copyright (C) 2005 Oliver Stieber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "config.h" +#include "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "wine/debug.h" +#include +#include +#include "d3dx9core_private.h" +#include + + +WINE_DEFAULT_DEBUG_CHANNEL(d3d); +typedef enum _predefinedtextures { +WINE_PDT_DEFAULT = 0, +WINE_PDT_CROSS, +CHECK_COMPLEX, +CHECK_BIG, +WINE_PDT_NONE = 0xffffff +}predefinedtextures; + +HRESULT WINAPI D3DXCreateTextureFromFile(LPDIRECT3DDEVICE9 pDevice, LPSTR pSrcFile, LPDIRECT3DTEXTURE9 *ppTexture){ +/** +It may be a 'good' idea to give this function some 'magic' values for testing that load +predefiend textures +Create a texture, this ones just going to be a x and not a + + +**/ + int predfinedTexture = CHECK_BIG; + LPDIRECT3DSURFACE9 pSurface; + + IDirect3DDevice9_CreateTexture(pDevice, 256,256,1,0,D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, ppTexture, NULL); + IDirect3DTexture9_GetSurfaceLevel(*ppTexture, 0, &pSurface); + + if((int)pSrcFile < 0){ + predfinedTexture = -((int)pSrcFile); + } + /*Draw a multi coloured cross on the texture*/ + switch (predfinedTexture){ + /*could test colour rect here too*/ + case WINE_PDT_NONE: + break; + case CHECK_BIG: + + { + /*This is a variation of a checkerboard using 4 bits (or 16 different check patterens)*/ + /*I'm going to make the squares 8x8 so that the pattern repeats twice on the board, there should be 4 checks of each combination of RGBA*/ + D3DLOCKED_RECT lockedRect; + int *data; + int u,v,x; + + IDirect3DSurface9_LockRect(pSurface, &lockedRect, NULL, 0); + data = (int*)(lockedRect.pBits); + for(u = 0; u < 256; u ++){ + for(v = 0; v < 8 ; v ++){ + int check = (v + (u >> 5)) & 0x01; /*This is my check colour (1 bit per pixel!)*/ + int colour = (check&1?255:0) | (check&1?255:0) << 8 | (check&1?255:0) << 16 | (check&1?255:0) << 24; + /*I could do this in 8x8 blocks which may get mmx'ed and be nice and quick + the other option is to do a streight run + */ + for( x = 0 ; x < 32 ; x ++){ + *data=colour; + data++; + } + } + } + } + IDirect3DSurface9_UnlockRect(pSurface); + + break; + + case CHECK_COMPLEX: + { + /*This is a variation of a checkerboard using 4 bits (or 16 different check patterens)*/ + /*I'm going to make the squares 8x8 so that the pattern repeats twice on the board, there should be 4 checks of each combination of RGBA*/ + D3DLOCKED_RECT lockedRect; + int *data; + int u,v,x; + + IDirect3DSurface9_LockRect(pSurface, &lockedRect, NULL, 0); + data = (int*)(lockedRect.pBits); + for(u = 0; u < 256; u ++){ + for(v = 0; v < 32 ; v ++){ + int check = (v + ((u >> 4) << 2)) & 0x0F; /*This is my check colour (1 bit per pixel!)*/ + int colour = (check&1?255:0) | (check&2?255:0) << 8 | (check&4?255:0) << 16 | (check&8?255:0) << 24; + /*I could do this in 8x8 blocks which may get mmx'ed and be nice and quick + the other option is to do a streight run + */ + for( x = 0 ; x < 8 ; x ++){ + *data=colour; + data++; + } + } + } + } + IDirect3DSurface9_UnlockRect(pSurface); + + break; + case WINE_PDT_CROSS: + default: + { + D3DLOCKED_RECT lockedRect; + int x; + int *data; + int colour =255 | 255 << 8 | 255 << 16 | 255 << 24; + int colourr =255 | 255 << 24; + int colourg = 255 << 8 | 255 << 24; + int colourb = 255 << 16 | 255 << 24; + + IDirect3DSurface9_LockRect(pSurface, &lockedRect, NULL, 0); + data = (int*)(lockedRect.pBits); + /*Draw an X on the texture*/ + for(x =0;x<128;x++){ + data[x + x*256] = colour; + data[255-x + x*256] = colourr; + data[x + (256*255)-x*256] = colourg; + data[255-x + (256*255)-x*256] = colourb; + } + IDirect3DSurface9_UnlockRect(pSurface); + } + } + return D3D_OK; +} + +HRESULT WINAPI D3DXCreateBuffer(DWORD NumBytes, LPD3DXBUFFER* ppBuffer) { + ID3DXBufferImpl *object; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXBufferImpl)); + if (NULL == object) { + *ppBuffer = (LPD3DXBUFFER)NULL; + return E_OUTOFMEMORY; + } + object->lpVtbl = &D3DXBuffer_Vtbl; + object->ref = 1; + object->bufferSize = NumBytes; + object->buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, NumBytes); + if (NULL == object->buffer) { + HeapFree(GetProcessHeap(), 0, object); + *ppBuffer = (LPD3DXBUFFER)NULL; + return E_OUTOFMEMORY; + } + *ppBuffer = (LPD3DXBUFFER)object; + return D3D_OK; +} + +HRESULT WINAPI D3DXCreateFont(LPDIRECT3DDEVICE9 pDevice, + UINT Height, + UINT Width, + UINT Weight, + UINT MipLevels, + BOOL Italic, + DWORD CharSet, + DWORD OutputPrecision, + DWORD Quality, + DWORD PitchAndFamily, + LPCSTR pFaceName, + LPD3DXFONT* ppFont) { + ID3DXFontImpl* object; + FIXME("(void): stub\n"); + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXFontImpl)); + object->lpVtbl = &D3DXFont_Vtbl; + object->ref = 1; + object->device = pDevice; + return D3D_OK; +} +#if 0 + +HRESULT WINAPI + D3DXCreateFontA( + LPDIRECT3DDEVICE9 pDevice, + UINT Height, + UINT Width, + UINT Weight, + UINT MipLevels, + BOOL Italic, + DWORD CharSet, + DWORD OutputPrecision, + DWORD Quality, + DWORD PitchAndFamily, + LPCSTR pFaceName, + LPD3DXFONT* ppFont){ + +}{ + ID3DXFontImpl* object; + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXFontImpl)); + object->lpVtbl = &D3DXFont_Vtbl; + object->ref = 1; + object->device = pDevice; + IDirect3DDevice9_AddRef(pDevice); + + *LPD3DXFONT = (LPD3DXFONT)object; + FIXME("(void): stub\n"); + return D3D_OK; +} + +HRESULT WINAPI + D3DXCreateFontW( + LPDIRECT3DDEVICE9 pDevice, + UINT Height, + UINT Width, + UINT Weight, + UINT MipLevels, + BOOL Italic, + DWORD CharSet, + DWORD OutputPrecision, + DWORD Quality, + DWORD PitchAndFamily, + LPSTR pFaceName, + LPD3DXFONT* ppFont){ + ID3DXFontImpl* object; + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXFontImpl)); + object->lpVtbl = &D3DXFont_Vtbl; + object->ref = 1; + *LPD3DXFONT = (LPD3DXFONT)object; + FIXME("(void): stub\n"); + /*I need an WtoA function and then call the unicode version of this function.*/ + return D3D_OK; + +} +#endif + + + +UINT WINAPI D3DXGetFVFVertexSize(DWORD FVF) { + FIXME("(void): stub\n"); + return 0; +} + +HRESULT WINAPI D3DXAssembleShader(LPCVOID pSrcData, UINT SrcDataLen, DWORD Flags, + LPD3DXBUFFER* ppConstants, + LPD3DXBUFFER* ppCompiledShader, + LPD3DXBUFFER* ppCompilationErrors) { + FIXME("(void): stub\n"); + return D3D_OK; +} + +HRESULT WINAPI D3DXAssembleShaderFromFileA(LPSTR pSrcFile, DWORD Flags, + LPD3DXBUFFER* ppConstants, + LPD3DXBUFFER* ppCompiledShader, + LPD3DXBUFFER* ppCompilationErrors) { + FIXME("(void): stub\n"); + return D3D_OK; +} + +HRESULT WINAPI D3DXAssembleShaderFromFileW(LPSTR pSrcFile, DWORD Flags, + LPD3DXBUFFER* ppConstants, + LPD3DXBUFFER* ppCompiledShader, + LPD3DXBUFFER* ppCompilationErrors) { + FIXME("(void): stub\n"); + return D3D_OK; +} + +D3DXMATRIX *WINAPI D3DXMatrixAffineTransformation(D3DXMATRIX *pOut, + FLOAT Scaling, + const D3DXVECTOR3 *pRotationCenter, + const D3DXQUATERNION *pRotation, + const D3DXVECTOR3 *pTranslation +){ +/* +This function calculates the affine transformation matrix with the following formula, with matrix concatenation evaluated in left-to-right order: + + pOut = Scaling * (pRotationCenter)^-1 * pRotation * pRotationCenter * pTranslation + + +where: + + + pOut = output matrix (pOut) + + + Scaling = scaling matrix (Scaling) + + + pRotationCenter = center of rotation matrix (pRotationCenter) + + + pRotation = rotation matrix (pRotation) + + + pTranslation = translation matrix (pTranslation) + +*/ + FIXME("(void): stub\n"); + return pOut; +} + + +D3DXMATRIX *WINAPI D3DXMatrixAffineTransformation2D( + D3DXMATRIX *pOut, + FLOAT Scaling, + CONST D3DXVECTOR2 *pRotationCenter, + FLOAT Rotation, + CONST D3DXVECTOR2 *pTranslation +){ + +/* +This function calculates the affine transformation matrix with the following formula, with matrix concatenation evaluated in left-to-right order: + + Mout = Ms * (Mrc)^-1 * Mr * Mrc * Mt + + +where: + + + Mout = output matrix (pOut) + + + Ms = scaling matrix (Scaling) + + + Mrc = center of rotation matrix (pRotationCenter) + + + Mr = rotation matrix (Rotation) + + + Mt = translation matrix (pTranslation) + */ + + FIXME("(void): stub\n"); + return pOut; +} + +HRESULT WINAPI D3DXMatrixDecompose( + D3DXVECTOR3 *pOutScale, + D3DXQUATERNION *pOutRotation, + D3DXVECTOR3 *pOutTranslation, + const D3DXMATRIX *pM +){ + + FIXME("stub\n"); + return S_OK; +} + + +FLOAT WINAPI D3DXMatrixDeterminant( + CONST D3DXMATRIX *pM +){ + + return + pM->_14 * pM->_23 * pM->_32 * pM->_41-pM->_13 * pM->_24 * pM->_32 * pM->_41-pM->_14 * pM->_22 * pM->_33 * pM->_41+pM->_12 * pM->_24 * pM->_33 * pM->_41+ + pM->_13 * pM->_22 * pM->_34 * pM->_41-pM->_12 * pM->_23 * pM->_34 * pM->_41-pM->_14 * pM->_23 * pM->_31 * pM->_42+pM->_13 * pM->_24 * pM->_31 * pM->_42+ + pM->_14 * pM->_21 * pM->_33 * pM->_42-pM->_11 * pM->_24 * pM->_33 * pM->_42-pM->_13 * pM->_21 * pM->_34 * pM->_42+pM->_11 * pM->_23 * pM->_34 * pM->_42+ + pM->_14 * pM->_22 * pM->_31 * pM->_43-pM->_12 * pM->_24 * pM->_31 * pM->_43-pM->_14 * pM->_21 * pM->_32 * pM->_43+pM->_11 * pM->_24 * pM->_32 * pM->_43+ + pM->_12 * pM->_21 * pM->_34 * pM->_43-pM->_11 * pM->_22 * pM->_34 * pM->_43-pM->_13 * pM->_22 * pM->_31 * pM->_44+pM->_12 * pM->_23 * pM->_31 * pM->_44+ + pM->_13 * pM->_21 * pM->_32 * pM->_44-pM->_11 * pM->_23 * pM->_32 * pM->_44-pM->_12 * pM->_21 * pM->_33 * pM->_44+pM->_11 * pM->_22 * pM->_33 * pM->_44; + +} + + + + +D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFovLH(D3DXMATRIX *pOut, + FLOAT fovy, + FLOAT aspect, + FLOAT zn, + FLOAT zf){ + + FLOAT yscale; + FLOAT xscale; + + + + yscale = 1.0f/tan(fovy/2.0f); + + + xscale = aspect * yscale; + + pOut->_11 = xscale; + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = yscale; + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 0; + pOut->_33 = zf/(zf-zn); + pOut->_34 = 1; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = -zn*zf/(zf-zn); + pOut->_44 = 0; + + return pOut; + +} +D3DXMATRIX *WINAPI D3DXMatrixPerspectiveFovRH( + D3DXMATRIX *pOut, + FLOAT fovy, + FLOAT Aspect, + FLOAT zn, + FLOAT zf +){ + + +FLOAT yscale; + FLOAT xscale; + + + + yscale = 1.0f/tan(fovy/2.0f); + + + xscale = Aspect * yscale; + + pOut->_11 = xscale; + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = yscale; + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 0; + pOut->_33 = zf/(zn-zf); + pOut->_34 = -1; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = zn*zf/(zn-zf); + pOut->_44 = 0; + + return pOut; + +} + +D3DXMATRIX *WINAPI D3DXMatrixPerspectiveLH( + D3DXMATRIX *pOut, + FLOAT w, + FLOAT h, + FLOAT zn, + FLOAT zf +){ +/* +2*zn/w 0 0 0 +0 2*zn/h 0 0 +0 0 zf/(zf-zn) 1 +0 0 zn*zf/(zn-zf) 0 +*/ + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixPerspectiveOffCenterLH( + D3DXMATRIX *pOut, + FLOAT l, + FLOAT r, + FLOAT b, + FLOAT t, + FLOAT zn, + FLOAT zf +){ +/* +2*zn/(r-l) 0 0 0 +0 2*zn/(t-b) 0 0 +(l+r)/(l-r) (t+b)/(b-t) zf/(zf-zn) 1 +0 0 zn*zf/(zn-zf) 0 +*/ + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixPerspectiveOffCenterRH( + D3DXMATRIX *pOut, + FLOAT l, + FLOAT r, + FLOAT b, + FLOAT t, + FLOAT zn, + FLOAT zf +){ +/* + +2*zn/(r-l) 0 0 0 +0 2*zn*(t-b) 0 0 +(l+r)/(r-l) (t+b)/(t-b) zf/(zn-zf) -1 +0 0 zn*zf/(zn-zf) 0 +*/ + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixPerspectiveRH( + D3DXMATRIX *pOut, + FLOAT w, + FLOAT h, + FLOAT zn, + FLOAT zf +){ +/* +2*zn/w 0 0 0 +0 2*zn/h 0 0 +0 0 zf/(zn-zf) -1 +0 0 zn*zf/(zn-zf) 0 +*/ + return pOut; +} + +#if 0 +D3DXMATRIX *D3DXMatrixIdentity(D3DXMATRIX* pOut) +{ + pOut->_11 = 1; + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = 1; + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 1; + pOut->_33 = 0; + pOut->_34 = 0; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = 0; + pOut->_44 = 1; + + return pOut; + +} + +BOOL D3DXMatrixIsIdentity( + CONST D3DXMATRIX *pM +){ +return (pM->_11 == 1 && + pM->_12 == 0 && + pM->_13 == 0 && + pM->_14 == 0 && + pM->_21 == 0 && + pM->_22 == 1 && + pM->_23 == 0 && + pM->_24 == 0 && + pM->_31 == 0 && + pM->_32 == 0 && + pM->_33 == 1 && + pM->_34 == 0 && + pM->_41 == 0 && + pM->_42 == 0 && + pM->_43 == 0 && + pM->_44 == 1) ? TRUE:FALSE; + +} +#endif + +D3DXMATRIX *WINAPI D3DXMatrixMultiplyTranspose( + D3DXMATRIX* pOut, + const D3DXMATRIX* pM1, + const D3DXMATRIX* pM2 +){ + /* pOut= T(M1*M2), justdo a matrix mulication but with ab's on the out put swaped for ba's.*/ + FIXME("stub\n"); + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixMultiply( + D3DXMATRIX *pOut, + CONST D3DXMATRIX *pM1, + CONST D3DXMATRIX *pM2 +){ + + + + + pOut->_11 = pM1->_11 * pM2->_11 + pM1->_12 * pM2->_21 + pM1->_13 * pM2->_31 + pM1->_14 * pM2->_41; + pOut->_12 = pM1->_11 * pM2->_12 + pM1->_12 * pM2->_22 + pM1->_13 * pM2->_32 + pM1->_14 * pM2->_42; + pOut->_13 = pM1->_11 * pM2->_13 + pM1->_12 * pM2->_23 + pM1->_13 * pM2->_33 + pM1->_14 * pM2->_43; + pOut->_14 = pM1->_11 * pM2->_14 + pM1->_12 * pM2->_24 + pM1->_13 * pM2->_34 + pM1->_14 * pM2->_44; + + pOut->_21 = pM1->_21 * pM2->_11 + pM1->_22 * pM2->_21 + pM1->_23 * pM2->_31 + pM1->_24 * pM2->_41; + pOut->_22 = pM1->_21 * pM2->_12 + pM1->_22 * pM2->_22 + pM1->_23 * pM2->_32 + pM1->_24 * pM2->_42; + pOut->_23 = pM1->_21 * pM2->_13 + pM1->_22 * pM2->_23 + pM1->_23 * pM2->_33 + pM1->_24 * pM2->_43; + pOut->_24 = pM1->_21 * pM2->_14 + pM1->_22 * pM2->_24 + pM1->_23 * pM2->_34 + pM1->_24 * pM2->_44; + + pOut->_31 = pM1->_31 * pM2->_11 + pM1->_32 * pM2->_21 + pM1->_33 * pM2->_31 + pM1->_34 * pM2->_41; + pOut->_32 = pM1->_31 * pM2->_12 + pM1->_32 * pM2->_22 + pM1->_33 * pM2->_32 + pM1->_34 * pM2->_42; + pOut->_33 = pM1->_31 * pM2->_13 + pM1->_32 * pM2->_23 + pM1->_33 * pM2->_33 + pM1->_34 * pM2->_43; + pOut->_34 = pM1->_31 * pM2->_14 + pM1->_32 * pM2->_24 + pM1->_33 * pM2->_34 + pM1->_34 * pM2->_44; + + pOut->_41 = pM1->_41 * pM2->_11 + pM1->_42 * pM2->_21 + pM1->_43 * pM2->_31 + pM1->_44 * pM2->_41; + pOut->_42 = pM1->_41 * pM2->_12 + pM1->_42 * pM2->_22 + pM1->_43 * pM2->_32 + pM1->_44 * pM2->_42; + pOut->_43 = pM1->_41 * pM2->_13 + pM1->_42 * pM2->_23 + pM1->_43 * pM2->_33 + pM1->_44 * pM2->_43; + pOut->_44 = pM1->_41 * pM2->_14 + pM1->_42 * pM2->_24 + pM1->_43 * pM2->_34 + pM1->_44 * pM2->_44; + + return pOut; + +} + + + + +D3DXMATRIX *WINAPI D3DXMatrixRotationX( + D3DXMATRIX *pOut, + FLOAT Angle +){ +/*I hope the handedness is correct, MSDN doesn't say*/ + + pOut->_11 = 1; + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14= 0; + + pOut->_21 = 0; + pOut->_22 = cos(Angle); + pOut->_23 = sin(Angle); + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = -sin(Angle); + pOut->_33 = cos(Angle); + pOut->_34= 0; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = 0; + pOut->_44= 1;/*is this 1*/ + + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixRotationY( + D3DXMATRIX *pOut, + FLOAT Angle +){ + + pOut->_11 = cos(Angle); + pOut->_12 = 0; + pOut->_13 = sin(Angle); + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = 1; + pOut->_23 = 0; + pOut->_24 = 0; + + + pOut->_31 = -sin(Angle); + pOut->_32 = 0; + pOut->_33 = cos(Angle); + pOut->_34 = 0; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = 0; + pOut->_44 = 1;/*is this 1*/ + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixRotationZ( + D3DXMATRIX *pOut, + FLOAT Angle +){ + /*MSDN doesn't tell me which way arond this is!!*/ + + FIXME("Matrix rotation z\n"); + pOut->_11 = cos(Angle); + pOut->_12 = sin(Angle); + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = -sin(Angle); + pOut->_22 = cos(Angle); + pOut->_23 = 0; + pOut->_24 = 0; + + + pOut->_31 = 0; + pOut->_32 = 0; + pOut->_33 = 1; + pOut->_34 = 0; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = 0; + pOut->_44 = 1;/*is this 1*/ + + return pOut; +} + + + + +/*timeGetTime*/ + +D3DXMATRIX *WINAPI D3DXMatrixScaling( + D3DXMATRIX *pOut, + FLOAT sx, + FLOAT sy, + FLOAT sz +){ + FIXME("Creating a scaling matrix\n"); + pOut->_11 = sx; + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = sy; + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 0; + pOut->_33 = sz; + pOut->_34 = 0; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = 0; + pOut->_44 = 1; + + return pOut; +} + + + +D3DXMATRIX *WINAPI D3DXMatrixShadow( + D3DXMATRIX *pOut, + CONST D3DXVECTOR4 *pLight, + CONST D3DXPLANE *pPlane +){ + FIXME("stub\n"); + + + /* + D3DXPLANE P = D3DXPlaneNormalize( &P, pPlane); + L = Light; + d = dot(P, L) + + P.a * L.x + d P.a * L.y P.a * L.z P.a * L.w + P.b * L.x P.b * L.y + d P.b * L.z P.b * L.w + P.c * L.x P.c * L.y P.c * L.z + d P.c * L.w + P.d * L.x P.d * L.y P.d * L.z P.d * L.w + d + */ + + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixTransformation( + D3DXMATRIX *pOut, + CONST D3DXVECTOR3 *pScalingCenter, + CONST D3DXQUATERNION *pScalingRotation, + CONST D3DXVECTOR3 *pScaling, + CONST D3DXVECTOR3 *pRotationCenter, + CONST D3DXQUATERNION *pRotation, + CONST D3DXVECTOR3 *pTranslation +){ + +/* +This function calculates the transformation matrix with the following formula, with matrix concatenation evaluated in left-to-right order: + + Mout = (Msc)-1 * (Msr)-1 * Ms * Msr * Msc * (Mrc)-1 * Mr * Mrc * Mt + + +where: + + + Mout = output matrix (pOut) + + + Msc = scaling center matrix (pScalingCenter) + + + Msr = scaling rotation matrix (pScalingRotation) + + + Ms = scaling matrix (pScaling) + + + Mrc = center of rotation matrix (pRotationCenter) + + + Mr = rotation matrix (pRotation) + + + Mt = translation matrix (pTranslation) +*/ + FIXME("stub\n"); + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixTransformation2D( + D3DXMATRIX *pOut, + CONST D3DXVECTOR2 *pScalingCenter, + FLOAT *pScalingRotation, + CONST D3DXVECTOR2 *pScaling, + CONST D3DXVECTOR2 *pRotationCenter, + FLOAT Rotation, + CONST D3DXVECTOR2 *pTranslation +){ +/* +This function calculates the transformation matrix with the following formula, with matrix concatenation evaluated in left-to-right order: + + Mout = (Msc)-1 * (Msr)-1 * Ms * Msr * Msc * (Mrc)-1 * Mr * Mrc * Mt + + +where: + + + Mout = output matrix (pOut) + + + Msc = scaling center matrix (pScalingCenter) + + + Msr = scaling rotation matrix (pScalingRotation) + + + Ms = scaling matrix (pScaling) + + + Mrc = center of rotation matrix (pRotationCenter) + + + Mr = rotation matrix (Rotation) + + + Mt = translation matrix (pTranslation) +*/ + FIXME("stub\n"); + return pOut; +} + + +D3DXMATRIX *WINAPI D3DXMatrixTranspose( + D3DXMATRIX *pOut, + CONST D3DXMATRIX *pM +){ + + pOut->_11 = pM->_11; + pOut->_12 = pM->_21; + pOut->_13 = pM->_31; + pOut->_14 = pM->_41; + + pOut->_21 = pM->_12; + pOut->_22 = pM->_22; + pOut->_23 = pM->_32; + pOut->_24 = pM->_42; + + pOut->_31 = pM->_13; + pOut->_32 = pM->_23; + pOut->_33 = pM->_33; + pOut->_34 = pM->_43; + + pOut->_41 = pM->_14; + pOut->_42 = pM->_24; + pOut->_43 = pM->_34; + pOut->_44 = pM->_44; + + return pOut; + +} + +/*Not in Microsoft library*/ +float D3DXPlaneLength(CONST D3DXPLANE *pP){ + return sqrt(pP->a * pP->a + pP->b * pP->b + pP->c * pP->c + pP->d * pP->d); +} + +D3DXPLANE *D3DXPlaneScale( + D3DXPLANE *pOut, + CONST D3DXPLANE *pP, + FLOAT s +){ + pOut->a = pP->a * s; + pOut->b = pP->b * s; + pOut->c = pP->c * s; + pOut->d = pP->d * s; + return pOut; +} + +D3DXPLANE *WINAPI D3DXPlaneNormalize( + D3DXPLANE *pOut, + CONST D3DXPLANE *pP +){ + /*|D3DXPLANE| */ + + float d = D3DXPlaneLength(pP); + if(d == 0 ){ + pOut->a = 0; + pOut->b = 0; + pOut->c = 0; + pOut->d = 0; + }else{ + return D3DXPlaneScale(pOut, pP, 1.0f/d); + } + return pOut; +} + +D3DXPLANE *WINAPI D3DXPlaneTransform( + D3DXPLANE *pOut, + CONST D3DXPLANE *pP, + CONST D3DXMATRIX *pM +){ +/* +D3DXPLANE planeNew; +D3DXPLANE plane(0,1,1,0); +D3DXPlaneNormalize(&plane, &plane); + +D3DXMATRIX matrix; +D3DXMatrixScaling(&matrix, 1.0f,2.0f,3.0f); +D3DXMatrixInverse(&matrix, NULL, &matrix); +D3DXMatrixTranspose(&matrix, &matrix); +D3DXPlaneTransform(&planeNew, &plane, &matrix); + + + +A plane is described by ax + by + cz + dw = 0. The first plane is created with (a,b,c,d) = (0,1,1,0), which is a plane described by y + z = 0. After scaling, the new plane contains (a,b,c,d) = (0, 0.353f, 0.235f, 0), which shows the new plane to be described by 0.353y + 0.235z = 0. + + +The parameter pM contains the inverse transpose of the transformation matrix. The inverse transpose is required by this method so that the normal vector of the transformed plane can be correctly transformed as well. +*/ + return pOut; +} + + +D3DXPLANE *WINAPI D3DXPlaneTransformArray( + D3DXPLANE *pOut, + UINT OutStride, + CONST D3DXPLANE* pP, + UINT PStride, + CONST D3DXMATRIX* pM, + UINT n +){ + /*http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c_Summer_04/directx/graphics/reference/d3dx/functions/math/d3dxmatrixshadow.asp*/ + return pOut; +} + + +D3DXQUATERNION *WINAPI D3DXQuaternionBaryCentric( + D3DXQUATERNION *pOut, + CONST D3DXQUATERNION *pQ1, + CONST D3DXQUATERNION *pQ2, + CONST D3DXQUATERNION *pQ3, + FLOAT f, + FLOAT g +){ +/*http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c_Summer_04/directx/graphics/reference/d3dx/functions/math/d3dxmatrixshadow.asp*/ + return pOut; +} + +D3DXQUATERNION *D3DXQuaternionConjugate( + D3DXQUATERNION *pOut, + CONST D3DXQUATERNION *pQ +){ + return pOut; +} + +FLOAT D3DXQuaternionDot( + CONST D3DXQUATERNION *pQ1, + CONST D3DXQUATERNION *pQ2 +){ + return 0.0f; +} + + + + +D3DXCOLOR *D3DXColorAdd( + D3DXCOLOR *pOut, + CONST D3DXCOLOR *pC1, + CONST D3DXCOLOR *pC2 +){ + /*I think they mean this!*/ + pOut->r = (pC1->r + pC2->r) * 0.5f; + pOut->g = (pC1->g + pC2->g) * 0.5f; + pOut->b = (pC1->b + pC2->b) * 0.5f; + return pOut; + +} + + +D3DXCOLOR *WINAPI D3DXColorAdjustContrast( + D3DXCOLOR *pOut, + const D3DXCOLOR *pC, + FLOAT c +){ + + pOut->r = 0.5f + c * (pC->r - 0.5f); + pOut->g = 0.5f + c * (pC->g - 0.5f); + pOut->b = 0.5f + c * (pC->b - 0.5f); + pOut->a = pC->a; + return pOut; +} +/*** Based upon MSDN, based on the NTSC standard described in ITU-R Recommendation BT.709***/ +#define NOSAT(pC) (pC->r * 0.2125f + pC->g * 0.7154f + pC->b * 0.0721f) + +D3DXCOLOR *WINAPI D3DXColorAdjustSaturation( + D3DXCOLOR *pOut, + const D3DXCOLOR *pC, + FLOAT s +){ + + float grey = NOSAT(pC); + pOut->r = grey + s * (pC->r - grey); + pOut->g = grey + s * (pC->g - grey); + pOut->b = grey + s * (pC->b - grey); + pOut->a = pC->a; + return pOut; +} + + +/*Linear interplot*/ +D3DXCOLOR *D3DXColorLerp( + D3DXCOLOR *pOut, + CONST D3DXCOLOR *pC1, + CONST D3DXCOLOR *pC2, + FLOAT s +){ + + pOut->r = pC1->r + s * (pC2->r - pC1->r); + pOut->g = pC1->g + s * (pC2->g - pC1->g); + pOut->b = pC1->b + s * (pC2->b - pC1->b); + pOut->a = pC1->a + s * (pC2->a - pC1->a); + return pOut; +} + +D3DXCOLOR *D3DXColorModulate( + D3DXCOLOR *pOut, + CONST D3DXCOLOR *pC1, + CONST D3DXCOLOR *pC2 +){ + + pOut->r = pC1->r * pC2->r; + pOut->g = pC1->g * pC2->g; + pOut->b = pC1->b * pC2->b; + pOut->a = pC1->a * pC2->a; + return pOut; +} + +D3DXCOLOR *D3DXColorNegative( + D3DXCOLOR *pOut, + CONST D3DXCOLOR *pC +){ + + pOut->r = 1.0f - pC->r; + pOut->g = 1.0f - pC->g; + pOut->b = 1.0f - pC->b; + pOut->a = pC->a; + + return pOut; +} + + +D3DXCOLOR *D3DXColorScale( + D3DXCOLOR *pOut, + CONST D3DXCOLOR *pC, + FLOAT s +){ + pOut->r = pC->r * s; + pOut->g = pC->g * s; + pOut->b = pC->b * s; + pOut->a = pC->a * s; + return pOut; +} + + +D3DXCOLOR *D3DXColorSubtract( + D3DXCOLOR *pOut, + CONST D3DXCOLOR *pC1, + CONST D3DXCOLOR *pC2 +){ + /*I think they mean |r1 - r2| who knows*/ + pOut->r = (pC1->r - pC2->r); + pOut->g = (pC1->g - pC2->g); + pOut->b = (pC1->b - pC2->b); + pOut->a = (pC1->a - pC2->a); + + if(pOut->r < 0 ) pOut->r = -pOut->r; + if(pOut->g < 0 ) pOut->g = -pOut->g; + if(pOut->b < 0 ) pOut->b = -pOut->b; + if(pOut->a < 0 ) pOut->a = -pOut->a; + + return pOut; + +} + +#if 0 +HRESULT WINAPI D3DXCreateMatrixStack( + DWORD Flags, + LPD3DXMATRIXSTACK *ppStack +){ + FIXME("stub\n"); + return D3D_OK; +} +#endif + + + +FLOAT *WINAPI D3DXFloat16To32Array( + FLOAT *pOut, + const D3DXFLOAT16 *pIn, + UINT n +){ +/*MSDN is kind and doesn't want to tell us what a float16 is (I expect it's a fixed 8.8 not a float!)*/ + #if 0 + int i; + for(i=0;iValue)*; + } + #endif + return pOut; +} + +D3DXFLOAT16 *WINAPI D3DXFloat32To16Array( + D3DXFLOAT16* pOut, + CONST FLOAT* pIn, + UINT n +){ + #if 0 + int i; + for(i=0;iValue = (WORD)pIn[i]; + } + #endif + return pOut; +} + + +FLOAT WINAPI D3DXFresnelTerm( + FLOAT CosTheta, + FLOAT RefractionIndex +){ +/* +To find the Fresnel term (F): + + +If A is angle of incidence and B is the angle of refraction, then + +F = 0.5 * [tan2(A - B) / tan2(A + B) + sin2(A - B) / sin2(A + B)] + = 0.5 * sin2(A - B) / sin2(A + B) * [cos2(A + B) / cos2(A - B) + 1] + +Let r = sina(A) / sin(B) (the relative refractive index) +Let c = cos(A) +Let g = (r2 + c2 - 1)1/2 + + +Then, expanding using the trig identities and simplifying, you get: + +F = 0.5 * (g + c)2 / (g - c)2 * ([c(g + c) - 1]2 / [c(g - c) + 1]2 + 1) + + +*/ + FIXME("stub\n"); + return 0.0f; +} + + + +D3DXMATRIX *WINAPI D3DXMatrixLookAtLH( + D3DXMATRIX *pOut, + CONST D3DXVECTOR3 *pEye, + CONST D3DXVECTOR3 *pAt, + CONST D3DXVECTOR3 *pUp +){ + +/* +zaxis = normal(At - Eye) +xaxis = normal(cross(Up, zaxis)) +yaxis = cross(zaxis, xaxis) + + xaxis.x yaxis.x zaxis.x 0 + xaxis.y yaxis.y zaxis.y 0 + xaxis.z yaxis.z zaxis.z 0 +-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 1 +*/ + + D3DXVECTOR3 tmp; + D3DXVECTOR3 zaxis; + D3DXVECTOR3 xaxis; + D3DXVECTOR3 yaxis; + + D3DXVec3Normalize(&zaxis,D3DXVec3Subtract(&tmp, pAt, pEye)); + D3DXVec3Normalize(&xaxis,D3DXVec3Cross(&tmp, pUp, &zaxis)); + D3DXVec3Cross(&yaxis, &zaxis, &xaxis); + + pOut->_11 = xaxis.x; + pOut->_12 = yaxis.x; + pOut->_13 = zaxis.x; + pOut->_14 = 0; + + pOut->_21 = xaxis.y; + pOut->_22 = yaxis.y; + pOut->_23 = zaxis.y; + pOut->_24 = 0; + + + pOut->_31 = xaxis.z; + pOut->_32 = yaxis.z; + pOut->_33 = zaxis.z; + pOut->_34 = 0; + + pOut->_41 = -D3DXVec3Dot(&xaxis, pEye); + pOut->_42 = -D3DXVec3Dot(&yaxis, pEye); + pOut->_43 = -D3DXVec3Dot(&zaxis, pEye); + pOut->_44 = 1; + + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixLookAtRH( + D3DXMATRIX *pOut, + CONST D3DXVECTOR3 *pEye, + CONST D3DXVECTOR3 *pAt, + CONST D3DXVECTOR3 *pUp +){ + +/* +zaxis = normal(Eye - At) +xaxis = normal(cross(Up, zaxis)) +yaxis = cross(zaxis, xaxis) + + xaxis.x yaxis.x zaxis.x 0 + xaxis.y yaxis.y zaxis.y 0 + xaxis.z yaxis.z zaxis.z 0 +-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 1 +*/ + + + D3DXVECTOR3 tmp; + D3DXVECTOR3 zaxis; + D3DXVECTOR3 xaxis; + D3DXVECTOR3 yaxis; + + D3DXVec3Normalize(&zaxis,D3DXVec3Subtract(&tmp, pEye, pAt)); + D3DXVec3Normalize(&xaxis,D3DXVec3Cross(&tmp, pUp, &zaxis)); + D3DXVec3Cross(&yaxis, &zaxis, &xaxis); + + pOut->_11 = xaxis.x; + pOut->_12 = yaxis.x; + pOut->_13 = zaxis.x; + pOut->_14 = 0; + + pOut->_21 = xaxis.y; + pOut->_22 = yaxis.y; + pOut->_23 = zaxis.y; + pOut->_24 = 0; + + + pOut->_31 = xaxis.z; + pOut->_32 = yaxis.z; + pOut->_33 = zaxis.z; + pOut->_34 = 0; + + pOut->_41 = -D3DXVec3Dot(&xaxis, pEye); + pOut->_42 = -D3DXVec3Dot(&yaxis, pEye); + pOut->_43 = -D3DXVec3Dot(&zaxis, pEye); + pOut->_44 = 1; + + FIXME("stub\n"); + return pOut; +} + + + + +FLOAT D3DXPlaneDot( + CONST D3DXPLANE *pP, + CONST D3DXVECTOR4 *pV +){ + return pP->a * pV->x + + pP->b * pV->y + + pP->c * pV->z + + pP->d * pV->w; + +} + + +FLOAT D3DXPlaneDotCoord( + CONST D3DXPLANE *pP, + CONST D3DXVECTOR3 *pV +){ + return pP->a * pV->x + + pP->b * pV->y + + pP->c * pV->z + + pP->d; +} + +FLOAT D3DXPlaneDotNormal( + CONST D3DXPLANE *pP, + CONST D3DXVECTOR3 *pV +){ + return pP->a * pV->x + + pP->b * pV->y + + pP->c * pV->z; +} + + +D3DXPLANE *WINAPI D3DXPlaneFromPointNormal( + D3DXPLANE *pOut, + CONST D3DXVECTOR3 *pPoint, + CONST D3DXVECTOR3 *pNormal +){ + return pOut; +} + +D3DXPLANE *WINAPI D3DXPlaneFromPoints( + D3DXPLANE *pOut, + CONST D3DXVECTOR3 *pV1, + CONST D3DXVECTOR3 *pV2, + CONST D3DXVECTOR3 *pV3 +){ + return pOut; +} + +D3DXVECTOR3 *WINAPI D3DXPlaneIntersectLine( + D3DXVECTOR3 *pOut, + CONST D3DXPLANE *pP, + CONST D3DXVECTOR3 *pV1, + CONST D3DXVECTOR3 *pV2 +){ + return pOut; +} + + + +D3DXMATRIX *WINAPI D3DXMatrixReflect( + D3DXMATRIX *pOut, + CONST D3DXPLANE *pPlane +){ + D3DXPLANE ptmp; + D3DXPlaneNormalize(&ptmp,pPlane); + + pOut->_11 = -2 * ptmp.a * ptmp.a + 1; + pOut->_12 = -2 * ptmp.b * ptmp.a; + pOut->_13 = -2 * ptmp.c * ptmp.a; + pOut->_14 = 0; + + pOut->_21 = -2 * ptmp.a * ptmp.b; + pOut->_22 = -2 * ptmp.b * ptmp.b + 1; + pOut->_23 = -2 * ptmp.c * ptmp.b; + pOut->_24 = 0; + + pOut->_31 = -2 * ptmp.a * ptmp.c; + pOut->_32 = -2 * ptmp.b * ptmp.c; + pOut->_33 = -2 * ptmp.b * ptmp.c; + pOut->_34 = 0; + + pOut->_41 = -2 * ptmp.b * ptmp.c; + pOut->_42 = -2 * ptmp.b * ptmp.d; + pOut->_43 = -2 * ptmp.c * ptmp.d; + pOut->_44 = 1; + + return pOut; + +} + +D3DXMATRIX *WINAPI D3DXMatrixRotationAxis( + D3DXMATRIX *pOut, + CONST D3DXVECTOR3 *pV, + FLOAT Angle +){ +FIXME("stub\n"); +return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixRotationQuaternion( + D3DXMATRIX *pOut, + CONST D3DXQUATERNION *pQ +){ + FIXME("stub\n"); + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixRotationYawPitchRoll( + D3DXMATRIX *pOut, + FLOAT Yaw, + FLOAT Pitch, + FLOAT Roll +){ + + D3DXMATRIX rotz; + D3DXMATRIX roty; + D3DXMATRIX rotx; + D3DXMATRIX mTmp; + + D3DXMatrixRotationZ(&rotz,Roll); + D3DXMatrixRotationX(&rotx,Pitch); + D3DXMatrixRotationY(&roty,Yaw); + D3DXMatrixMultiply(&mTmp,&rotz,&rotx); + return D3DXMatrixMultiply(pOut,&mTmp,&roty); + +} + + +D3DXMATRIX *WINAPI D3DXMatrixInverse( + D3DXMATRIX *pOut, + FLOAT *pDeterminant, + CONST D3DXMATRIX *pM +){ +#if 0 + + pM->_11 = pM->_23*pM->_34*pM->_42 - pM->_24*pM->_33*pM->_42 + pM->_24*pM->_32*pM->_43 - pM->_22*pM->_34*pM->_43 - pM->_23*pM->_32*pM->_44 + pM->_22*pM->_33*pM->_44; + pM->_12 = pM->_14*pM->_33*pM->_42 - pM->_13*pM->_34*pM->_42 - pM->_14*pM->_32*pM->_43 + pM->_12*pM->_34*pM->_43 + pM->_13*pM->_32*pM->_44 - pM->_12*pM->_33*pM->_44; + pM->_13 = pM->_13*pM->_24*pM->_42 - pM->_14*pM->_23*pM->_42 + pM->_14*pM->_22*pM->_43 - pM->_12*pM->_24*pM->_43 - pM->_13*pM->_22*pM->_44 + pM->_12*pM->_23*pM->_44; + pM->_14 = pM->_14*pM->_23*pM->_32 - pM->_13*pM->_24*pM->_32 - pM->_14*pM->_22*pM->_33 + pM->_12*pM->_24*pM->_33 + pM->_13*pM->_22*pM->_34 - pM->_12*pM->_23*pM->_34; + pM->_21 = pM->_24*pM->_33*pM->_41 - pM->_23*pM->_34*pM->_41 - pM->_24*pM->_31*pM->_43 + pM->_21*pM->_34*pM->_43 + pM->_23*pM->_31*pM->_44 - pM->_21*pM->_33*pM->_44; + pM->_22 = pM->_13*pM->_34*pM->_41 - pM->_14*pM->_33*pM->_41 + pM->_14*pM->_31*pM->_43 - pM->_11*pM->_34*pM->_43 - pM->_13*pM->_31*pM->_44 + pM->_11*pM->_33*pM->_44; + pM->_23 = pM->_14*pM->_23*pM->_41 - pM->_13*pM->_24*pM->_41 - pM->_14*pM->_21*pM->_43 + pM->_11*pM->_24*pM->_43 + pM->_13*pM->_21*pM->_44 - pM->_11*pM->_23*pM->_44; + pM->_24 = pM->_13*pM->_24*pM->_31 - pM->_14*pM->_23*pM->_31 + pM->_14*pM->_21*pM->_33 - pM->_11*pM->_24*pM->_33 - pM->_13*pM->_21*pM->_34 + pM->_11*pM->_23*pM->_34; + pM->_31 = pM->_22*pM->_34*pM->_41 - pM->_24*pM->_32*pM->_41 + pM->_24*pM->_31*pM->_42 - pM->_21*pM->_34*pM->_42 - pM->_22*pM->_31*pM->_44 + pM->_21*pM->_32*pM->_44; + pM->_32 = pM->_14*pM->_32*pM->_41 - pM->_12*pM->_34*pM->_41 - pM->_14*pM->_31*pM->_42 + pM->_11*pM->_34*pM->_42 + pM->_12*pM->_31*pM->_44 - pM->_11*pM->_32*pM->_44; + pM->_33 = pM->_12*pM->_24*pM->_41 - pM->_14*pM->_22*pM->_41 + pM->_14*pM->_21*pM->_42 - pM->_11*pM->_24*pM->_42 - pM->_12*pM->_21*pM->_44 + pM->_11*pM->_22*pM->_44; + pM->_34 = pM->_14*pM->_22*pM->_31 - pM->_12*pM->_24*pM->_31 - pM->_14*pM->_21*pM->_32 + pM->_11*pM->_24*pM->_32 + pM->_12*pM->_21*pM->_34 - pM->_11*pM->_22*pM->_34; + pM->_41 = pM->_23*pM->_32*pM->_41 - pM->_22*pM->_33*pM->_41 - pM->_23*pM->_31*pM->_42 + pM->_21*pM->_33*pM->_42 + pM->_22*pM->_31*pM->_43 - pM->_21*pM->_32*pM->_43; + pM->_42 = pM->_12*pM->_33*pM->_41 - pM->_13*pM->_32*pM->_41 + pM->_13*pM->_31*pM->_42 - pM->_11*pM->_33*pM->_42 - pM->_12*pM->_31*pM->_43 + pM->_11*pM->_32*pM->_43; + pM->_43 = pM->_13*pM->_22*pM->_41 - pM->_12*pM->_23*pM->_41 - pM->_13*pM->_21*pM->_42 + pM->_11*pM->_23*pM->_42 + pM->_12*pM->_21*pM->_43 - pM->_11*pM->_22*pM->_43; + pM->_44 = pM->_12*pM->_23*pM->_31 - pM->_13*pM->_22*pM->_31 + pM->_13*pM->_21*pM->_32 - pM->_11*pM->_23*pM->_32 - pM->_12*pM->_21*pM->_33 + pM->_11*pM->_22*pM->_33; + + scale(1/m1.determinant()); +#endif + FIXME("stub\n"); + return pOut; + +} + + + +D3DXMATRIX *WINAPI D3DXMatrixTranslation( + D3DXMATRIX *pOut, + FLOAT x, + FLOAT y, + FLOAT z +){ + +/*I think it's something like this?*/ + pOut->_11 = 1; + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = 1; + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 0; + pOut->_33 = 1; + pOut->_34 = 0; + + pOut->_41 = x; + pOut->_42 = y; + pOut->_43 = z; + pOut->_44 = 1; + + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixOrthoLH( + D3DXMATRIX *pOut, + FLOAT w, + FLOAT h, + FLOAT zn, + FLOAT zf +){ + +/*I'm not texting for a div0 at the moment because MSDN doesn't tell me what I should do (if anything!) + +if(zn == zf){ +} + +*/ + + pOut->_11 = 2/w; + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = 2/h; + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 0; + pOut->_33 = 1/(zf-zn); + pOut->_34 = 0; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = zn/(zn-zf); + pOut->_44 = 1; + + return pOut; +} + + +D3DXMATRIX *WINAPI D3DXMatrixOrthoRH( + D3DXMATRIX *pOut, + FLOAT w, + FLOAT h, + FLOAT zn, + FLOAT zf +){ +/*I'm not texting for a div0 at the moment because MSDN doesn't tell me what I should do (if anything!) + +if(zn == zf){ +} + +*/ + pOut->_11 = 2/w; + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = 2/h; + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 0; + pOut->_33 = 1/(zn-zf); + pOut->_34 = 0; + + pOut->_41 = 0; + pOut->_42 = 0; + pOut->_43 = zn/(zn-zf); + pOut->_44 = 1; + + return pOut; +} + +D3DXMATRIX *WINAPI D3DXMatrixOrthoOffCenterLH( + D3DXMATRIX *pOut, + FLOAT l, + FLOAT r, + FLOAT b, + FLOAT t, + FLOAT zn, + FLOAT zf +){ +/* MSDN doesn't say what to do with a div/0 +if(zf == zn){ +} +*/ + pOut->_11 = 2.0 / (r - 1.0); + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = 2.0 / (t - b); + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 0; + pOut->_33 = 1.0 / (zf - zf); + pOut->_34 = 0; + + pOut->_41 = (1.0 + r) / (1.0 - r); + pOut->_42 = (t + b) / (b - t); + pOut->_43 = zn / (zn - zf); + pOut->_44 = 1; + + return pOut; +} + + +D3DXMATRIX *WINAPI D3DXMatrixOrthoOffCenterRH( + D3DXMATRIX *pOut, + FLOAT l, + FLOAT r, + FLOAT b, + FLOAT t, + FLOAT zn, + FLOAT zf +){ +/* MSDN doesn't say what to do with a div/0 +if(zf == zn){ +} +*/ + pOut->_11 = 2.0 / (r - 1.0); + pOut->_12 = 0; + pOut->_13 = 0; + pOut->_14 = 0; + + pOut->_21 = 0; + pOut->_22 = 2.0 / (t - b); + pOut->_23 = 0; + pOut->_24 = 0; + + pOut->_31 = 0; + pOut->_32 = 0; + pOut->_33 = 1.0 / (zn - zf); + pOut->_34 = 0; + + pOut->_41 = (1.0 + r) / (1.0 - r); + pOut->_42 = (t + b) / (b - t); + pOut->_43 = zn / (zn - zf); + pOut->_44 = 1; + + return pOut; +} + + + + + +/*I think this normalized on the magnitude, but I'm not sure!*/ +D3DXVECTOR3 *WINAPI D3DXVec3Normalize( + D3DXVECTOR3 *pOut, + CONST D3DXVECTOR3 *pV +){ + float d = D3DXVec3Length(pV); + if(d == 0 ){ + pOut->x = 0; + pOut->y = 0; + pOut->z = 0; + }else{ + return D3DXVec3Scale(pOut, pV, 1.0f/d); + } + return pOut; +} + + +float D3DXVec3Length(CONST D3DXVECTOR3 *pV){ + return sqrt(pV->x * pV->y + pV->x * pV->x + pV->z * pV->z); +} + + +float D3DXVec3LengthSq(CONST D3DXVECTOR3 *pV){ + return pV->x * pV->y + pV->x * pV->x + pV->z * pV->z; +} + +float D3DXVec2Length(CONST D3DXVECTOR2 *pV){ + return sqrt(pV->x * pV->y + pV->x * pV->x); +} + + +float D3DXVec2LengthSq(CONST D3DXVECTOR2 *pV){ + return pV->x * pV->y + pV->x * pV->x; +} + +float D3DXVec4Length(CONST D3DXVECTOR4 *pV){ + return sqrt(pV->x * pV->y + pV->x * pV->x + pV->z * pV->z + pV->w * pV->w); +} + + +float D3DXVec4LengthSq(CONST D3DXVECTOR4 *pV){ + return pV->x * pV->y + pV->x * pV->x + pV->z * pV->z + pV->w * pV->w; +} + + + +D3DXVECTOR2 *D3DXVec2Scale( + D3DXVECTOR2 *pOut, + CONST D3DXVECTOR2 *pV, + FLOAT s +){ + + pOut->x = pV->x * s; + pOut->y = pV->y * s; + + return pOut; +} + + +D3DXVECTOR3 *D3DXVec3Scale( + D3DXVECTOR3 *pOut, + CONST D3DXVECTOR3 *pV, + FLOAT s +){ + + pOut->x = pV->x * s; + pOut->y = pV->y * s; + pOut->z = pV->z * s; + + return pOut; +} + + + +D3DXVECTOR4 *D3DXVec4Scale( + D3DXVECTOR4 *pOut, + CONST D3DXVECTOR4 *pV, + FLOAT s +){ + + pOut->x = pV->x * s; + pOut->y = pV->y * s; + pOut->z = pV->z * s; + pOut->w = pV->w * s; + + return pOut; +} + + +D3DXVECTOR2 *D3DXVec2Add( + D3DXVECTOR2 *pOut, + CONST D3DXVECTOR2 *pV1, + CONST D3DXVECTOR2 *pV2 +){ + + pOut->x = pV1->x + pV2->x; + pOut->y = pV1->y + pV2->y; + return pOut; +} + + +D3DXVECTOR3 *D3DXVec3Add( + D3DXVECTOR3 *pOut, + CONST D3DXVECTOR3 *pV1, + CONST D3DXVECTOR3 *pV2 +){ + + pOut->x = pV1->x + pV2->x; + pOut->y = pV1->y + pV2->y; + pOut->z = pV1->z + pV2->z; + return pOut; +} + + +D3DXVECTOR4 *D3DXVec4Add( + D3DXVECTOR4 *pOut, + CONST D3DXVECTOR4 *pV1, + CONST D3DXVECTOR4 *pV2 +){ + + pOut->x = pV1->x + pV2->x; + pOut->y = pV1->y + pV2->y; + pOut->z = pV1->z + pV2->z; + pOut->w = pV1->w + pV2->w; + return pOut; +} + + +D3DXVECTOR3 *D3DXVec3Cross( + D3DXVECTOR3 *pOut, + CONST D3DXVECTOR3 *pV1, + CONST D3DXVECTOR3 *pV2 +){ + /* MSDN says not MATRIX[3,3] = v[3,1]a * v[3,1]b */ + pOut->x = pV1->y * pV2->z - pV1->z * pV2->y; + pOut->y = pV1->z * pV2->x - pV1->x * pV2->z; + pOut->z = pV1->x * pV2->y - pV1->y * pV2->x; + return pOut; +} + + +D3DXVECTOR4 *WINAPI D3DXVec4Cross( + D3DXVECTOR4 *pOut, + CONST D3DXVECTOR4 *pV1, + CONST D3DXVECTOR4 *pV2, + CONST D3DXVECTOR4 *pV3 +){ +/*MSDN doesn't give any clues to what they mean by this 'cross' product*/ +/* +| X Y Z T | +| Ux Uy Uz Ut | +| Vx Vy Vz Vt | +| Wx Wy Wz Wt | + + pOut->_1 = + pOut->_2 = + pOut->_3 = + pOut->_4 = + */ + + FIXME("stub\n"); + return pOut; +} + + + +/*http://mathworld.wolfram.com/DotProduct.html*/ +FLOAT D3DXVec2Dot( + CONST D3DXVECTOR2 *pV1, + CONST D3DXVECTOR2 *pV2 +){ + return pV1->x * pV2->x + pV1->y * pV2->y; +} + +FLOAT D3DXVec3Dot( + CONST D3DXVECTOR3 *pV1, + CONST D3DXVECTOR3 *pV2 +){ + return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z; +} + + +FLOAT D3DXVec4Dot( + CONST D3DXVECTOR4 *pV1, + CONST D3DXVECTOR4 *pV2 +){ + return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z + pV1->w * pV2->w; +} + + + +D3DXVECTOR2 *D3DXVec2Subtract( + D3DXVECTOR2 *pOut, + CONST D3DXVECTOR2 *pV1, + CONST D3DXVECTOR2 *pV2 +){ + pOut->x = pV1->x - pV2->x; + pOut->y = pV1->y - pV2->y; + return pOut; +} + + +D3DXVECTOR3 *D3DXVec3Subtract( + D3DXVECTOR3 *pOut, + CONST D3DXVECTOR3 *pV1, + CONST D3DXVECTOR3 *pV2 +){ + + pOut->x = pV1->x - pV2->x; + pOut->y = pV1->y - pV2->y; + pOut->z = pV1->z - pV2->z; + return pOut; +} + + +D3DXVECTOR4 *D3DXVec4Subtract( + D3DXVECTOR4 *pOut, + CONST D3DXVECTOR4 *pV1, + CONST D3DXVECTOR4 *pV2 +){ + + pOut->x = pV1->x - pV2->x; + pOut->y = pV1->y - pV2->y; + pOut->z = pV1->z - pV2->z; + pOut->w = pV1->w - pV2->w; + return pOut; +} diff -urN wine.20050419/dlls/d3dx9/d3dx9core_private.h wine.20050419.dx9/dlls/d3dx9/d3dx9core_private.h --- wine.20050419/dlls/d3dx9/d3dx9core_private.h 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3dx9/d3dx9core_private.h 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,97 @@ +/* + * Direct3D X 8 private include file + * + * Copyright 2002 Raphael Junqueira + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_D3DX8CORE_PRIVATE_H +#define __WINE_D3DX8CORE_PRIVATE_H + +#include + +#include "windef.h" +#include "winbase.h" +#include "d3dx9core.h" + +/* Interfaces */ +typedef struct ID3DXBufferImpl ID3DXBufferImpl; +typedef struct ID3DXFontImpl ID3DXFontImpl; + +/* ----------- */ +/* ID3DXBuffer */ +/* ----------- */ + +/***************************************************************************** + * Predeclare the interface implementation structures + */ +extern ID3DXBufferVtbl D3DXBuffer_Vtbl; + + +/***************************************************************************** + * ID3DXBufferImpl implementation structure + */ +struct ID3DXBufferImpl +{ + /* IUnknown fields */ + ID3DXBufferVtbl *lpVtbl; + DWORD ref; + + /* ID3DXBuffer fields */ + DWORD *buffer; + DWORD bufferSize; +}; + +/* IUnknown: */ +extern HRESULT WINAPI ID3DXBufferImpl_QueryInterface(LPD3DXBUFFER iface, REFIID refiid, LPVOID *obj); +extern ULONG WINAPI ID3DXBufferImpl_AddRef(LPD3DXBUFFER iface); +extern ULONG WINAPI ID3DXBufferImpl_Release(LPD3DXBUFFER iface); + +/* ID3DXBuffer: */ +extern LPVOID WINAPI ID3DXBufferImpl_GetBufferPointer(LPD3DXBUFFER iface); +extern DWORD WINAPI ID3DXBufferImpl_GetBufferSize(LPD3DXBUFFER iface); + +/* --------- */ +/* ID3DXFont */ +/* --------- */ + +/***************************************************************************** + * Predeclare the interface implementation structures + */ +extern ID3DXFontVtbl D3DXFont_Vtbl; + +/***************************************************************************** + * ID3DXFontImpl implementation structure + */ +struct ID3DXFontImpl +{ + /* IUnknown fields */ + ID3DXFontVtbl *lpVtbl; + DWORD ref; + + /* ID3DXFont fields */ + LPDIRECT3DDEVICE9 device; +}; + +/* IUnknown: */ +extern HRESULT WINAPI ID3DXFontImpl_QueryInterface(LPD3DXFONT iface, REFIID refiid, LPVOID *obj); +extern ULONG WINAPI ID3DXFontImpl_AddRef(LPD3DXFONT iface); +extern ULONG WINAPI ID3DXFontImpl_Release(LPD3DXFONT iface); + +/* ID3DXFont: */ +/*extern INT WINAPI ID3DXFontImpl_DrawTextA(LPCSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color); */ + +#endif /*__WINE_D3DX8CORE_PRIVATE_H */ diff -urN wine.20050419/dlls/d3dx9/d3dxbuffer.c wine.20050419.dx9/dlls/d3dx9/d3dxbuffer.c --- wine.20050419/dlls/d3dx9/d3dxbuffer.c 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3dx9/d3dxbuffer.c 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,87 @@ +/* + * ID3DXBuffer implementation + * + * Copyright 2002 Raphael Junqueira + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wingdi.h" +#include "wine/debug.h" + +#include "d3d9.h" +#include "d3dx9core_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d); + +/* ID3DXBuffer IUnknown parts follow: */ +HRESULT WINAPI ID3DXBufferImpl_QueryInterface(LPD3DXBUFFER iface, REFIID riid, LPVOID* ppobj) { + ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface; + + if (IsEqualGUID(riid, &IID_IUnknown) + || IsEqualGUID(riid, &IID_ID3DXBuffer)) { + ID3DXBufferImpl_AddRef(iface); + *ppobj = This; + return D3D_OK; + } + + WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj); + return E_NOINTERFACE; +} + +ULONG WINAPI ID3DXBufferImpl_AddRef(LPD3DXBUFFER iface) { + ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface; + TRACE("(%p) : AddRef from %ld\n", This, This->ref); + return ++(This->ref); +} + +ULONG WINAPI ID3DXBufferImpl_Release(LPD3DXBUFFER iface) { + ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface; + ULONG ref = --This->ref; + TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref); + if (ref == 0) { + HeapFree(GetProcessHeap(), 0, This->buffer); + HeapFree(GetProcessHeap(), 0, This); + } + return ref; +} + +/* ID3DXBuffer Interface follow: */ +LPVOID WINAPI ID3DXBufferImpl_GetBufferPointer(LPD3DXBUFFER iface) { + ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface; + return This->buffer; +} + +DWORD WINAPI ID3DXBufferImpl_GetBufferSize(LPD3DXBUFFER iface) { + ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface; + return This->bufferSize; +} + +ID3DXBufferVtbl D3DXBuffer_Vtbl = +{ + ID3DXBufferImpl_QueryInterface, + ID3DXBufferImpl_AddRef, + ID3DXBufferImpl_Release, + ID3DXBufferImpl_GetBufferPointer, + ID3DXBufferImpl_GetBufferSize +}; diff -urN wine.20050419/dlls/d3dx9/font.c wine.20050419.dx9/dlls/d3dx9/font.c --- wine.20050419/dlls/d3dx9/font.c 1969-12-31 17:00:00.000000000 -0700 +++ wine.20050419.dx9/dlls/d3dx9/font.c 2005-04-20 01:52:56.000000000 -0600 @@ -0,0 +1,152 @@ +/* + * ID3DXfont implementation + * + * Copyright 2005 Oliver Stieber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wingdi.h" +#include "wine/debug.h" + +#include "d3d9.h" +#include "d3dx9core_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d); + +/* ID3DXBuffer IUnknown parts follow: */ +HRESULT WINAPI ID3DXFontImpl_QueryInterface(LPD3DXFONT iface, REFIID riid, LPVOID* ppobj) { + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + + if (IsEqualGUID(riid, &IID_IUnknown) + || IsEqualGUID(riid, &IID_ID3DXBuffer)) { + ID3DXFontImpl_AddRef(iface); + *ppobj = This; + return D3D_OK; + } + + WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj); + return E_NOINTERFACE; +} + +ULONG WINAPI ID3DXFontImpl_AddRef(LPD3DXFONT iface) { + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + TRACE("(%p) : AddRef from %ld\n", This, This->ref); + return ++(This->ref); +} + +ULONG WINAPI ID3DXFontImpl_Release(LPD3DXFONT iface) { + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + ULONG ref = --This->ref; + TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref); + if (ref == 0) { + /*TODO: relese the device if we have one*/ + if(This->device != NULL){ + IDirect3DDevice9_Release(This->device); + } + HeapFree(GetProcessHeap(), 0, This); + } + return ref; +} + + + +/* ID3DXFont Interface follow: */ + + +HRESULT WINAPI ID3DXFontImpl_GetDevice(LPD3DXFONT iface, LPDIRECT3DDEVICE9* ppDevice){ + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + TRACE("(%p) : rturning %p \n", This, This->device); + *ppDevice = This->device; + IDirect3DDevice9_AddRef(*ppDevice); + return S_OK; +} + +HRESULT WINAPI ID3DXFontImpl_GetLogFont(LPD3DXFONT iface, PLOGFONTA pLogFont){ + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + FIXME("(%p) : stub\n", This); + return D3D_OK; +} + +HRESULT WINAPI ID3DXFontImpl_Begin(LPD3DXFONT iface){ + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + FIXME("(%p) : stub\n", This); + return D3D_OK; +} + +INT WINAPI ID3DXFontImpl_DrawTextA(LPD3DXFONT iface, LPCSTR pString, INT Count, + LPRECT pRect, DWORD Format, D3DCOLOR Color){ + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + /*IWineD3D needs to have a writeText function that just wraps up the openGl text functions*/ + FIXME("(%p) : stub\n", This); + return D3D_OK; +} + +INT WINAPI ID3DXFontImpl_DrawTextW(LPD3DXFONT iface, LPCWSTR pString, INT Count, + LPRECT pRect, DWORD Format, D3DCOLOR Color){ + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + /*IWineD3D needs to have a writeText function that just wraps up the openGl text functions*/ + FIXME("(%p) : stub\n", This); + return D3D_OK; +} + + + +HRESULT WINAPI ID3DXFontImpl_End(LPD3DXFONT iface){ + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + FIXME("(%p) : stub\n", This); + return D3D_OK; +} + + +HRESULT WINAPI ID3DXFontImpl_OnLostDevice(LPD3DXFONT iface){ + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + FIXME("(%p) : stub\n", This); + return S_OK; +} + +HRESULT WINAPI ID3DXFontImpl_OnResetDevice(LPD3DXFONT iface){ + ID3DXFontImpl *This = (ID3DXFontImpl *)iface; + FIXME("(%p) : stub\n", This); + return S_OK; +} + + + + + +ID3DXFontVtbl D3DXFont_Vtbl = +{ + ID3DXFontImpl_QueryInterface, + ID3DXFontImpl_AddRef, + ID3DXFontImpl_Release, + ID3DXFontImpl_GetDevice, + ID3DXFontImpl_GetLogFont, + ID3DXFontImpl_Begin, + ID3DXFontImpl_DrawTextA, + ID3DXFontImpl_DrawTextW, + ID3DXFontImpl_End, + ID3DXFontImpl_OnLostDevice, + ID3DXFontImpl_OnResetDevice + +}; diff -urN wine.20050419/dlls/ddraw/ddraw/user.c wine.20050419.dx9/dlls/ddraw/ddraw/user.c --- wine.20050419/dlls/ddraw/ddraw/user.c 2005-03-07 04:01:10.000000000 -0700 +++ wine.20050419.dx9/dlls/ddraw/ddraw/user.c 2005-04-20 06:35:28.000000000 -0600 @@ -162,8 +162,8 @@ This->caps.dwCKeyCaps |= CKEY_CAPS; This->caps.dwFXCaps |= FX_CAPS; This->caps.dwPalCaps |= DDPCAPS_8BIT | DDPCAPS_PRIMARYSURFACE; - This->caps.dwVidMemTotal = 16*1024*1024; - This->caps.dwVidMemFree = 16*1024*1024; + This->caps.dwVidMemTotal = 96*1024*1024; + This->caps.dwVidMemFree = 80*1024*1024; This->caps.dwSVBCaps |= BLIT_CAPS; This->caps.dwSVBCKeyCaps |= CKEY_CAPS; This->caps.dwSVBFXCaps |= FX_CAPS; diff -urN wine.20050419/dlls/wined3d/Makefile.in wine.20050419.dx9/dlls/wined3d/Makefile.in --- wine.20050419/dlls/wined3d/Makefile.in 2005-03-03 06:57:15.000000000 -0700 +++ wine.20050419.dx9/dlls/wined3d/Makefile.in 2005-04-20 01:52:56.000000000 -0600 @@ -5,7 +5,7 @@ MODULE = wined3d.dll IMPORTS = user32 gdi32 advapi32 kernel32 EXTRAINCL = @X_CFLAGS@ -EXTRALIBS = -ldxguid -luuid @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ @OPENGL_LIBS@ +EXTRALIBS = -luuid @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ @OPENGL_LIBS@ C_SRCS = \ basetexture.c \ @@ -14,10 +14,12 @@ directx.c \ drawprim.c \ indexbuffer.c \ + pixelshader.c \ query.c \ resource.c \ stateblock.c \ surface.c \ + swapchain.c \ texture.c \ utils.c \ vertexbuffer.c \ diff -urN wine.20050419/dlls/wined3d/cubetexture.c wine.20050419.dx9/dlls/wined3d/cubetexture.c --- wine.20050419/dlls/wined3d/cubetexture.c 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/wined3d/cubetexture.c 2005-04-20 05:17:56.000000000 -0600 @@ -75,7 +75,7 @@ TRACE("(%p) : Releasing from %ld\n", This, This->resource.ref); ref = InterlockedDecrement(&This->resource.ref); if (ref == 0) { - int i,j; + int i,j; for (i = 0; i < This->baseTexture.levels; i++) { for (j = 0; j < 6; j++) { if (This->surfaces[j][i] != NULL) { @@ -84,7 +84,12 @@ } } } - IWineD3DBaseTextureImpl_CleanUp((IWineD3DBaseTexture *) iface); + if(This->baseTexture.textureName != 0){ + ENTER_GL(); + TRACE("Deleting texture %d\n", This->baseTexture.textureName); + glDeleteTextures(1, &This->baseTexture.textureName); + LEAVE_GL(); + } HeapFree(GetProcessHeap(), 0, This); } else { IUnknown_Release(This->resource.parent); /* Released the reference to the d3dx object */ @@ -127,18 +132,32 @@ TRACE("(%p) : About to load texture: dirtified(%d)\n", This, This->baseTexture.dirty); IWineD3DCubeTexture_BindTexture(iface); - - ENTER_GL(); - /* If were dirty then reload the surfaces */ - if(This->baseTexture.dirty != FALSE) { - for (i = 0; i < This->baseTexture.levels; i++) { - for (j = 0; j < 6; j++) - IWineD3DSurface_LoadTexture((IWineD3DSurface *) This->surfaces[j][i], cube_targets[j], i); + #if 0 /* TODO: context manager support */ + IWineD3DContextManager_PushState(This->contextManager, GL_TEXTURE_CUBE_MAP_ARB, ENABLED, NOW /* make sure the state is applied now */); + #else + glEnable(GL_TEXTURE_CUBE_MAP_ARB); + #endif + /* TODO: remove the use of (IWineD3DSurfaceImpl *) + * (put the texturename in the cubetexture!) + */ + for (i = 0; i < This->baseTexture.levels; i++) { + if (i == 0 && This->baseTexture.textureName != 0 && This->baseTexture.dirty == FALSE) { + + glBindTexture(GLTEXTURECUBEMAP, This->baseTexture.textureName); + TRACE("Texture %p given name %d\n", This, This->baseTexture.textureName); + if (This->baseTexture.textureName == 0) { + glGenTextures(1, &This->baseTexture.textureName); + TRACE("Texture %p given name %d\n", This, This->baseTexture.textureName); + glBindTexture(GLTEXTURECUBEMAP, This->baseTexture.textureName); + } } /* No longer dirty */ This->baseTexture.dirty = FALSE; } LEAVE_GL(); + #if 0 /* TODO: context manager support */ + IWineD3DContextManager_PopState(This->contextManager, GL_TEXTURE_CUBE_MAP_ARB, DISABLED, DELAYED); + #endif return ; } @@ -304,3 +323,4 @@ IWineD3DCubeTextureImpl_UnlockRect, IWineD3DCubeTextureImpl_AddDirtyRect }; + diff -urN wine.20050419/dlls/wined3d/device.c wine.20050419.dx9/dlls/wined3d/device.c --- wine.20050419/dlls/wined3d/device.c 2005-03-29 12:01:00.000000000 -0700 +++ wine.20050419.dx9/dlls/wined3d/device.c 2005-04-20 05:31:50.000000000 -0600 @@ -21,14 +21,46 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include "config.h" #include "wined3d_private.h" +/* TODO: repalce with iface usage! NOTE: this macro is used by other macros such as GL_SUPPORT */ +#if 0 +#define GLINFO_LOCATION (IWineD3D_GetGlInfo(This->wineD3D)) +#else +#define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info +#endif WINE_DEFAULT_DEBUG_CHANNEL(d3d); -WINE_DECLARE_DEBUG_CHANNEL(d3d_caps); -WINE_DECLARE_DEBUG_CHANNEL(d3d_fps); WINE_DECLARE_DEBUG_CHANNEL(d3d_shader); -#define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info +WINE_DECLARE_DEBUG_CHANNEL(d3d_surface); +WINE_DECLARE_DEBUG_CHANNEL(d3d_timings); + +/* x11drv GDI escapes */ +#define X11DRV_ESCAPE 6789 +enum x11drv_escape_codes +{ + X11DRV_GET_DISPLAY, /* get X11 display for a DC */ + X11DRV_GET_DRAWABLE, /* get current drawable for a DC */ + X11DRV_GET_FONT, /* get current X font for a DC */ +}; + +/* retrieve the X display to use on a given DC */ +inline static Display *get_display( HDC hdc ) +{ + Display *display; + enum x11drv_escape_codes escape = X11DRV_GET_DISPLAY; + + if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape, + sizeof(display), (LPSTR)&display )) display = NULL; + return display; +} + + +/* Memory tracking and object counting */ + int emmulated_textureram = 256*1024*1024; + + /* helper macros */ #define D3DMEMCHECK(object, ppResult) if(NULL == object){ *ppResult = NULL; WARN("Out of memory\n"); return D3DERR_OUTOFVIDEOMEMORY;} @@ -80,7 +112,7 @@ float colRGBA[] = {0.0, 0.0, 0.0, 0.0}; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - /* Light settings are affected by the model view in OpenGL, the View transform in direct3d*/ + /* Light settings are affected by the model view in OpenGL, the View transform in direct3d */ glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadMatrixf((float *) &This->stateBlock->transforms[D3DTS_VIEW].u.m[0][0]); @@ -170,7 +202,7 @@ BOOL changeTexture = TRUE; TRACE("-----------------------> Updating the texture at stage %ld to have new texture state information\n", Stage); - for (i = 1; i < HIGHEST_TEXTURE_STATE; i++) { + for (i = 1; i <= HIGHEST_TEXTURE_STATE; i++) { BOOL skip = FALSE; @@ -186,21 +218,21 @@ skip = TRUE; break; - /* Performance: If the texture states only impact settings for the texture unit + /* Performance: If the texture states only impact settings for the texture unit (compared to the texture object) then there is no need to reapply them. The - only time they need applying is the first time, since we cheat and put the - values into the stateblock without applying. + only time they need applying is the first time, since we cheat and put the + values into the stateblock without applying. Per-texture unit: texture function (eg. combine), ops and args - texture env color - texture generation settings + texture env color + texture generation settings Note: Due to some special conditions there may be a need to do particular ones of these, which is what the Flags allows */ - case D3DTSS_COLOROP: + case D3DTSS_COLOROP: case D3DTSS_TEXCOORDINDEX: if (!(Flags == REAPPLY_ALL)) skip=TRUE; break; - case D3DTSS_ALPHAOP: + case D3DTSS_ALPHAOP: if (!(Flags & REAPPLY_ALPHAOP)) skip=TRUE; break; @@ -225,6 +257,9 @@ } } + for (i = 1; i <= HIGHEST_SAMPLER_STATE;i++) { + IWineD3DDevice_SetSamplerState(iface, Stage, i, This->stateBlock->samplerState[Stage][i]); + } /* Note the D3DRS value applies to all textures, but GL has one * per texture, so apply it now ready to be used! */ @@ -232,26 +267,23 @@ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]); checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);"); - TRACE("-----------------------> Updated the texture at stage %ld to have new texture state information\n", Stage); + TRACE("-----------------------> Updated the texture at stage %ld to have new texture state information\n", Stage); } /********************************************************** * IUnknown parts follows **********************************************************/ - -HRESULT WINAPI IWineD3DDeviceImpl_QueryInterface(IWineD3DDevice *iface,REFIID riid,LPVOID *ppobj) +HRESULT WINAPI IWineD3DDeviceImpl_QueryInterface(IWineD3DDevice *iface, REFIID riid, LPVOID *ppobj) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; /* FIXME: This needs to extend an IWineD3DBaseObject */ - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj); - if (IsEqualGUID(riid, &IID_IUnknown) + if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IWineD3DDevice)) { IUnknown_AddRef(iface); *ppobj = This; return D3D_OK; } - return E_NOINTERFACE; } @@ -263,21 +295,72 @@ return refCount; } + ULONG WINAPI IWineD3DDeviceImpl_Release(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - TRACE("(%p) : Releasing from %ld\n", This, refCount + 1); - + ULONG refCount; + TRACE("(%p) : Releasing from %ld\n", This, This->ref); + refCount = InterlockedDecrement(&This->ref); if (!refCount) { - /* TODO: Clean up all the surfaces and textures! */ - /* FIXME: Create targets and state blocks in d3d8 */ - if (((IWineD3DImpl *)This->wineD3D)->dxVersion > 8) { /*We don't create a state block in d3d8 yet*/ + /* Clean up all the surfaces and textures! */ + /* FIXME: Create targets and stablocks in d3d8 */ + /* TODO: repalce impl usage with IWineD3D_GetVersion */ + if (((IWineD3DImpl *)This->wineD3D)->dxVersion > 8) { /* We don't create a state block in d3d8 yet */ /* NOTE: You must release the parent if the objects was created via a callback + * Some of thease objects are going to callback to the device and day that they have been relesed. + * I'm not sure what the best way to prevent a deadlock is, either tell the objets not to callback, + * tell the callback function not to do anything (this is better since it's internal to the device object) + * try to make the functions 100% atomic so that it doesn't matter (this is the best solution but trickier, and we'd also need more critical sections), because we should be using itterators on the collections so long as the itterators can cope we're ok? ** ***************************/ - IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->stateBlock); + /* Release all of the swapchains, except the implicite swapchain */ + int i; + IUnknown* stencilBufferParent; + IUnknown* swapChainParent; + + /* NOTE: Don't release swapchain 0 here, it's 'special' */ + for(i = 1; i < This->numberOfSwapChains; i++){ + /* TODO: don't access swapchains[x] directly! */ + IWineD3DSwapChain_Release(This->swapchains[i]); + } + + /* Release the buffers (with sanity checks)*/ + if(This->stencilBufferTarget != NULL && (IWineD3DSurface_Release(This->stencilBufferTarget) >0)){ + if(This->depthStencilBuffer != This->stencilBufferTarget) + FIXME("(%p) Something's still holding the depthStencilBuffer\n",This); + } + + if(IWineD3DSurface_Release(This->renderTarget) >0){ + /* This check is a bit silly, itshould be in swapchain_release FIXME("(%p) Something's still holding the renderTarget\n",This); */ + } + + IWineD3DSurface_GetParent(This->depthStencilBuffer, &stencilBufferParent); + IUnknown_Release(stencilBufferParent); /* once for the get parent */ + if(IUnknown_Release(stencilBufferParent) >0){ /* the second time for when it was created */ + FIXME("(%p) Something's still holding the depthStencilBuffer\n",This); + } + + /* Release the update stateblock */ + if(IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->updateStateBlock) > 0){ + if(This->updateStateBlock != This->stateBlock) + FIXME("(%p) Something's still holding the Update stateblock\n",This); + } + + /* Release the stateblock */ + if(IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->stateBlock) > 0){ + FIXME("(%p) Something's still holding the Update stateblock\n",This); + } + + /* Swapchain 0 is special because it's created in startup with a hanging parent, so we have to release it's parent now */ + /* TODO: don't access swapchains[x] directly!, check that there are no-more swapchains left for this device! */ + IWineD3DSwapChain_GetParent(This->swapchains[0], &swapChainParent); + IUnknown_Release(swapChainParent); /* once for the get parent */ + if(IUnknown_Release(swapChainParent) > 0){ /* the second time for when it was created */ + FIXME("(%p) Something's still holding the implicite swapchain\n",This); + } + } IWineD3D_Release(This->wineD3D); + TRACE("freed device %p \n",This); HeapFree(GetProcessHeap(), 0, This); } return refCount; @@ -293,14 +376,14 @@ return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *iface, UINT Size, DWORD Usage, +HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *iface, UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool, IWineD3DVertexBuffer** ppVertexBuffer, HANDLE *sharedHandle, IUnknown *parent) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVertexBufferImpl *object; WINED3DFORMAT Format = WINED3DFMT_VERTEXDATA; /* Dummy format for now */ D3DCREATERESOURCEOBJECTINSTANCE(object, VertexBuffer, D3DRTYPE_VERTEXBUFFER) - + object->resource.size = Size; object->resource.allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->resource.size); object->FVF = FVF; @@ -311,20 +394,20 @@ return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_CreateIndexBuffer(IWineD3DDevice *iface, UINT Length, DWORD Usage, +HRESULT WINAPI IWineD3DDeviceImpl_CreateIndexBuffer(IWineD3DDevice *iface, UINT Length, DWORD Usage, WINED3DFORMAT Format, D3DPOOL Pool, IWineD3DIndexBuffer** ppIndexBuffer, HANDLE *sharedHandle, IUnknown *parent) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DIndexBufferImpl *object; TRACE("(%p) Creating index buffer\n", This); - + /* Allocate the storage for the device */ D3DCREATERESOURCEOBJECTINSTANCE(object,IndexBuffer,D3DRTYPE_INDEXBUFFER) - + object->resource.size = Length; object->resource.allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,object->resource.size); - TRACE("(%p) : Len=%d, Use=%lx, Format=(%u,%s), Pool=%d - Memory@%p, Iface@%p\n", This, Length, Usage, Format, + TRACE("(%p) : Len=%d, Use=%lx, Format=(%u,%s), Pool=%d - Memory@%p, Iface@%p\n", This, Length, Usage, Format, debug_d3dformat(Format), Pool, object, object->resource.allocatedMemory); *ppIndexBuffer = (IWineD3DIndexBuffer *) object; @@ -332,52 +415,142 @@ } HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface, D3DSTATEBLOCKTYPE Type, IWineD3DStateBlock** ppStateBlock, IUnknown *parent) { - + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DStateBlockImpl *object; + unsigned int i; + unsigned int j; D3DCREATEOBJECTINSTANCE(object, StateBlock) - object->blockType = Type; + object->blockType = Type; /* Special case - Used during initialization to produce a placeholder stateblock so other functions called can update a state block */ - if (Type == (D3DSTATEBLOCKTYPE) 0) { + if (Type == (D3DSTATEBLOCKTYPE)0) { /* Don't bother increasing the reference count otherwise a device will never - be freed due to circular dependencies */ + be freed due to circular dependencies */ return D3D_OK; } - /* Otherwise, might as well set the whole state block to the appropriate values */ - IWineD3DDevice_AddRef(iface); - memcpy(object, This->stateBlock, sizeof(IWineD3DStateBlockImpl)); - FIXME("unfinished - needs to set up changed and set attributes\n"); - return D3D_OK; + /* Otherwise, might as well set the whole state block to the appropriate values */ + /* don't do this it will overight ref count &co too!? */ + if( This->stateBlock != NULL){ + memcpy(object, This->stateBlock, sizeof(IWineD3DStateBlockImpl)); + } else { + memset(object->streamFreq, 1, sizeof(object->streamFreq)); + } + + /* Reset the ref and type after kluging it */ + object->wineD3DDevice = This; + object->ref = 1; + object->blockType = Type; + + TRACE("Updating changed flags appropriate for type %d\n", Type); + + if (Type == D3DSBT_ALL) { + TRACE("ALL => Pretend everything has changed\n"); + memset(&object->changed, TRUE, sizeof(This->stateBlock->changed)); + } else if (Type == D3DSBT_PIXELSTATE) { + + memset(&object->changed, FALSE, sizeof(This->stateBlock->changed)); + /* TODO: Pixel Shader Constants */ + object->changed.pixelShader = TRUE; + for (i = 0; i < NUM_SAVEDPIXELSTATES_R; i++) { + object->changed.renderState[SavedPixelStates_R[i]] = TRUE; + } + for (j = 0; j < GL_LIMITS(textures); i++) { + for (i = 0; i < NUM_SAVEDPIXELSTATES_T; i++) { + object->changed.textureState[j][SavedPixelStates_T[i]] = TRUE; + } + } + FIXME("Setting sampler block changes states\n"); + for (j = 0 ; j < 16; j++){ + for (i =0; i < NUM_SAVEDPIXELSTATES_S;i++){ + + object->changed.samplerState[j][SavedPixelStates_S[i]] = TRUE; + } + } + } else if (Type == D3DSBT_VERTEXSTATE) { + + memset(&object->changed, FALSE, sizeof(This->stateBlock->changed)); + + /* TODO: Vertex Shader Constants */ + object->changed.vertexShader = TRUE; + for (i = 0; i < NUM_SAVEDVERTEXSTATES_R; i++) { + object->changed.renderState[SavedVertexStates_R[i]] = TRUE; + } + for (j = 0; j < GL_LIMITS(textures); i++) { + for (i = 0; i < NUM_SAVEDVERTEXSTATES_T; i++) { + object->changed.textureState[j][SavedVertexStates_T[i]] = TRUE; + } + } + FIXME("Setting sampler block changes states\n"); + for (j = 0 ; j < 16; j++){ + for (i =0; i < NUM_SAVEDVERTEXSTATES_S;i++){ + object->changed.samplerState[j][SavedVertexStates_S[i]] = TRUE; + } + } + + /* Duplicate light chain */ + { + PLIGHTINFOEL *src = NULL; + PLIGHTINFOEL *dst = NULL; + PLIGHTINFOEL *newEl = NULL; + src = This->stateBlock->lights; + object->lights = NULL; + + + while (src) { + newEl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PLIGHTINFOEL)); + if (newEl == NULL) return D3DERR_OUTOFVIDEOMEMORY; + memcpy(newEl, src, sizeof(PLIGHTINFOEL)); + newEl->prev = dst; + newEl->changed = TRUE; + newEl->enabledChanged = TRUE; + if (dst == NULL) { + object->lights = newEl; + } else { + dst->next = newEl; + } + dst = newEl; + src = src->next; + } + + } + + } else { + FIXME("Unrecognized state block type %d\n", Type); } + TRACE("(%p) returning token (ptr to stateblock) of %p\n", This, object); + return D3D_OK; +} /* ************************************ MSDN: [in] Render targets are not lockable unless the application specifies TRUE for Lockable. Note that lockable render targets reduce performance on some graphics hardware. Discard - [in] Set this flag to TRUE to enable z-buffer discarding, and FALSE otherwise. + [in] Set this flag to TRUE to enable z-buffer discarding, and FALSE otherwise. If this flag is set, the contents of the depth stencil buffer will be invalid after calling either IDirect3DDevice9::Present or IDirect3DDevice9::SetDepthStencilSurface with a different depth surface. ******************************** */ - -HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UINT Width, UINT Height, WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IWineD3DSurface **ppSurface,D3DRESOURCETYPE Type, DWORD Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample ,DWORD MultisampleQuality, HANDLE* pSharedHandle, IUnknown *parent) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DSurfaceImpl *object; /*NOTE: impl ref allowed since this is a create function */ - unsigned int pow2Width, pow2Height; +HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UINT Width, UINT Height, WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IWineD3DSurface **ppSurface,D3DRESOURCETYPE Type, DWORD Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample ,DWORD MultisampleQuality, HANDLE* pSharedHandle, IUnknown *parent) { + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DSurfaceImpl *object; /* NOTE: impl ref allowed since this is a create function */ + unsigned int pow2Width = Width; + unsigned int pow2Height = Height; + unsigned int pow2Size = 1; + int surfacecount; TRACE("(%p) Create surface\n",This); - - /** FIXME: Check ranges on the inputs are valid + + /** FIXME: Check ranges on the inputs are valid * MSDN * MultisampleQuality * [in] Quality level. The valid range is between zero and one less than the level - * returned by pQualityLevels used by IDirect3D9::CheckDeviceMultiSampleType. + * returned by pQualityLevels used by IDirect3D9::CheckDeviceMultiSampleType. * Passing a larger value returns the error D3DERR_INVALIDCALL. The MultisampleQuality * values of paired render targets, depth stencil surfaces, and the MultiSample type * must all match. @@ -386,7 +559,7 @@ /** * TODO: Discard MSDN - * [in] Set this flag to TRUE to enable z-buffer discarding, and FALSE otherwise. + * [in] Set this flag to TRUE to enable z-buffer discarding, and FALSE otherwise. * * If this flag is set, the contents of the depth stencil buffer will be * invalid after calling either IDirect3DDevice9::Present or * IDirect3DDevice9::SetDepthStencilSurface @@ -394,44 +567,54 @@ * *This flag has the same behavior as the constant, D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL, in D3DPRESENTFLAG. ***************************/ - - if(MultisampleQuality < 0) { - FIXME("Invalid multisample level %ld \n", MultisampleQuality); + + if(MultisampleQuality < 0) { + FIXME("Invalid multisample level %ld \n", MultisampleQuality); return D3DERR_INVALIDCALL; /* TODO: Check that this is the case! */ } - + if(MultisampleQuality > 0){ - FIXME("MultisampleQuality set to %ld, bstituting 0 \n" , MultisampleQuality); + FIXME("MultisampleQuality set to %ld, bstituting 0 \n" , MultisampleQuality); MultisampleQuality=0; } /* Non-power2 support */ + /* Find the neriest pow2 match */ + for(pow2Size = 1 ; pow2Size < Width ; pow2Size<<=1); + pow2Width = pow2Size; - /* Find the nearest pow2 match */ - pow2Width = pow2Height = 1; - while (pow2Width < Width) pow2Width <<= 1; - while (pow2Height < Height) pow2Height <<= 1; + for(pow2Size = 1 ; pow2Size < Height ; pow2Size<<=1); + pow2Height = pow2Size; - /* TODO: support for non-power 2 textures */ if(pow2Width > Width || pow2Height > Height){ /** TODO: add support for non power two compressed textures (OpenGL provices support for * non-power-two textures gratis) **/ - return D3DERR_NOTAVAILABLE; + if(Format == WINED3DFMT_DXT1 || Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 + || Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5){ + + FIXME("(%p) Compressed non-power-two textures are not supported w(%d) h(%d) \n", + This, Width, Height); + return D3DERR_NOTAVAILABLE; + } } - + /** TODO: Check against the maximum texture sizes supported by the video card **/ - + D3DCREATERESOURCEOBJECTINSTANCE(object,Surface,D3DRTYPE_SURFACE) object->container = (IUnknown*) This; - + object->currentDesc.Width = Width; object->currentDesc.Height = Height; object->currentDesc.Level = Level; object->currentDesc.MultiSampleType = MultiSample; object->currentDesc.MultiSampleQuality = MultisampleQuality; + object->pow2Width = pow2Width; + object->pow2Height = pow2Height; + object->nonpow2 = (pow2Width != Width || pow2Height != Height) ? TRUE : FALSE; object->discard = Discard; + object->activeLock = FALSE; object->bytesPerPixel = D3DFmtGetBpp(This, Format); - + /** DXTn mipmaps use the same number of 'levels' down to eg. 8x1, but since * it is based around 4x4 pixel blocks it requires padding, so allocate enough * space! @@ -439,26 +622,32 @@ if (Format == WINED3DFMT_DXT1) { /* DXT1 is half byte per pixel */ object->resource.size = ((max(Width,4) * object->bytesPerPixel) * max(Height,4)) / 2; - + } else if (Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 || Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5) { object->resource.size = ((max(Width,4) * object->bytesPerPixel) * max(Height,4)); } else { object->resource.size = (Width * object->bytesPerPixel) * Height; + object->pow2Size = (pow2Width * object->bytesPerPixel) * pow2Height; } - + + /** FIXME: add support for real non-power-two if it's provided by the video card **/ + /** TODO: change this into a texture transform matrix so that it's processed in hardware **/ + /* Precalculated scaling for 'faked' non power of two texture coords */ + object->pow2scalingFactorX = (((float)Width) / ((float)pow2Width)); + object->pow2scalingFactorY = (((float)Height) / ((float)pow2Height)); + TRACE(" xf(%f) yf(%f) \n", object->pow2scalingFactorX, object->pow2scalingFactorY); + TRACE("Pool %d %d %d %d",Pool, D3DPOOL_DEFAULT, D3DPOOL_MANAGED, D3DPOOL_SYSTEMMEM); -#if 0 - /* TODO: Check that we have enough video ram left */ - if(Pool == D3DPOOL_DEFAULT && IWineD3DDevice_GetAvailableTextureMem(iface) <= object->currentDesc.Size){ + /* Check that we have enough video ram left */ + if(Pool == D3DPOOL_DEFAULT && IWineD3DDevice_GetAvailableTextureMem(iface) <= object->resource.size){ TRACE("Out of 'bogus' video memory\n"); HeapFree(GetProcessHeap(),0,object); *ppSurface = NULL; return D3DERR_OUTOFVIDEOMEMORY; } -#endif - + /** Quick lockable sanity check TODO: remove this after surfaces, usage and locablility have been debugged properly * this function is too deap to need to care about things like this. * Levels need to be checked too, and possibly Type wince they all affect what can be done. @@ -477,17 +666,17 @@ if(Usage == D3DUSAGE_DYNAMIC) FIXME("Create surface called with a pool of MANAGED and a \ Usage of DYNAMIC which are mutually exclusive, not doing \ anything just telling you.\n"); - break; - case D3DPOOL_DEFAULT: /*TODO: Create offscreen plain can cause this check to fail..., find out if it should */ + break; + case D3DPOOL_DEFAULT: /* TODO: Create offscreen plain can cause this check to fail..., find out if it should */ if(!(Usage & D3DUSAGE_DYNAMIC) && !(Usage & D3DUSAGE_RENDERTARGET) && !(Usage && D3DUSAGE_DEPTHSTENCIL ) && Lockable == TRUE) FIXME("Creating a surface with a POOL of DEFAULT with Locable true, that doesn't specify DYNAMIC usage.\n"); break; - default: + default: FIXME("(%p) Unknown pool %d\n", This, Pool); break; }; - + if (Usage & D3DUSAGE_RENDERTARGET && Pool != D3DPOOL_DEFAULT){ FIXME("Trying to create a render target that isn't in the default pool\n"); } @@ -495,19 +684,46 @@ object->locked = FALSE; object->lockable = (WINED3DFMT_D16_LOCKABLE == Format) ? TRUE : Lockable; - /* TODO: memory management */ + + /* Textures in the default pool only get allocated system ram if and when they are locked. */ + if(Pool == D3DPOOL_DEFAULT){ + object->resource.allocatedMemory = NULL; + /* Should we pre-load the surface now? */ + globalChangeGlRam(object->resource.size); + }else{ object->resource.allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,object->resource.size); if(object->resource.allocatedMemory == NULL ) { - FIXME("Out of memory!\n"); - HeapFree(GetProcessHeap(),0,object); - *ppSurface = NULL; - return D3DERR_OUTOFVIDEOMEMORY; - } + FIXME("Out of memory!\n"); + HeapFree(GetProcessHeap(),0,object); + *ppSurface = NULL; + return D3DERR_OUTOFVIDEOMEMORY; + } IWineD3DSurface_CleanDirtyRect(*ppSurface); - TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) lockable(%d) surf@%p, surfmem@%p, %d bytes\n", - This, Width, Height, Format, debug_d3dformat(Format), + } + + + /** TODO: change this to use the Devices resource store. **/ + surfacecount = globalStoreSurface((IWineD3DSurface *)object); + +#ifdef USE_CONTEXT_MANAGER +/* TODO: OpenGL context manager +(this should happen in preload not here, a context manager could overload the vtable though */ + if(Usage & D3DUSAGE_RENDERTARGET){ + /** render targets are special + * because they can be render targets! + * so forward the object onto the context manager to see if it wants do anything special + * I think this only applies when the texture is loaded, not here + ************************************************/ + + IContextManager_CreateRenderTarget(This->contextManager, object); + } +#endif + + IWineD3DSurface_CleanDirtyRect(*ppSurface); + TRACE("(%p) : number %d w(%d) h(%d) pow2w(%d) pow2h(%d) fmt(%d,%s) lockable(%d) surf@%p, surfmem@%p, %d bytes\n", + This, surfacecount, Width, Height, pow2Width, pow2Height, Format, debug_d3dformat(Format), (WINED3DFMT_D16_LOCKABLE == Format), *ppSurface, object->resource.allocatedMemory, object->resource.size); return D3D_OK; @@ -516,22 +732,25 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreateTexture(IWineD3DDevice *iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, WINED3DFORMAT Format, D3DPOOL Pool, IWineD3DTexture** ppTexture, HANDLE* pSharedHandle, IUnknown *parent, - D3DCB_CREATESURFACEFN D3DCB_CreateSurface) { + D3DCB_CREATESURFACETFN D3DCB_CreateSurface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DTextureImpl *object; + IWineD3DTextureImpl *object; + DWORD startTime = 0; unsigned int i; + int texturecount; UINT tmpW; UINT tmpH; HRESULT hr; - TRACE("(%p), Width(%d) Height(%d) Levels(%d) Usage(%ld) .... \n", This, Width, Height, Levels, Usage); + if (TRACE_ON(d3d_timings)) + startTime = GetTickCount(); /* Use windows calls for this */ D3DCREATERESOURCEOBJECTINSTANCE(object, Texture, D3DRTYPE_TEXTURE); D3DINITILIZEBASETEXTURE(object->baseTexture); object->width = Width; object->height = Height; - + object->resource.pool = Pool; /* Calculate levels for mip mapping */ if (Levels == 0) { TRACE("calculating levels %d\n", object->baseTexture.levels); @@ -545,11 +764,11 @@ } TRACE("Calculated levels = %d\n", object->baseTexture.levels); } - + /* Generate all the surfaces */ tmpW = Width; tmpH = Height; - for (i = 0; i < object->baseTexture.levels; i++) + for (i = 0; i < object->baseTexture.levels; i++) { /* use the callback to create the texture surface */ hr = D3DCB_CreateSurface(This->parent, tmpW, tmpH, Format, Usage, Pool, i, &object->surfaces[i],NULL); @@ -566,42 +785,45 @@ *ppTexture = NULL; return hr; } - + IWineD3DSurface_SetContainer(object->surfaces[i], (IUnknown *)object); TRACE("Created surface level %d @ %p\n", i, object->surfaces[i]); /* calculate the next mipmap level */ tmpW = max(1, tmpW >> 1); tmpH = max(1, tmpH >> 1); } - - TRACE("(%p) : Created texture %p\n", This, object); + texturecount = globalStoreTexture((IWineD3DBaseTexture *)object); + TRACE("(%p) : Created texture %d %p\n", This, texturecount, object); + if (TRACE_ON(d3d_timings)) + TRACE_(d3d_timings)("(%p) starttime %ld, total time %ld\n", This, startTime , GetTickCount() -startTime); return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *iface, - UINT Width, UINT Height, UINT Depth, - UINT Levels, DWORD Usage, +HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *iface, + UINT Width, UINT Height, UINT Depth, + UINT Levels, DWORD Usage, WINED3DFORMAT Format, D3DPOOL Pool, IWineD3DVolumeTexture** ppVolumeTexture, HANDLE* pSharedHandle, IUnknown *parent, D3DCB_CREATEVOLUMEFN D3DCB_CreateVolume) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DVolumeTextureImpl *object; + IWineD3DVolumeTextureImpl *object; /** NOTE: impl ref allowed since this is a create function **/ unsigned int i; + int texturecount; UINT tmpW; UINT tmpH; UINT tmpD; D3DCREATERESOURCEOBJECTINSTANCE(object, VolumeTexture, D3DRTYPE_VOLUMETEXTURE); D3DINITILIZEBASETEXTURE(object->baseTexture); - + TRACE("(%p) : W(%d) H(%d) D(%d), Lvl(%d) Usage(%ld), Fmt(%u,%s), Pool(%s)\n", This, Width, Height, Depth, Levels, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool)); object->width = Width; object->height = Height; object->depth = Depth; + object->resource.pool = Pool; /* Calculate levels for mip mapping */ if (Levels == 0) { @@ -623,10 +845,10 @@ tmpH = Height; tmpD = Depth; - for (i = 0; i < object->baseTexture.levels; i++) + for (i = 0; i < object->baseTexture.levels; i++) { /* Create the volume */ - D3DCB_CreateVolume(This->parent, Width, Height, Depth, Format, Pool, Usage, + D3DCB_CreateVolume(This->parent, Width, Height, Depth, Format, Pool, Usage, (IWineD3DVolume **)&object->volumes[i], pSharedHandle); IWineD3DVolume_SetContainer(object->volumes[i], (IUnknown *)object); @@ -636,13 +858,14 @@ } *ppVolumeTexture = (IWineD3DVolumeTexture *) object; - TRACE("(%p) : Created volume texture %p\n", This, object); + texturecount = globalStoreTexture((IWineD3DBaseTexture *)object); + TRACE("(%p) : Created volume texture %d %p\n", This, texturecount, object); return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface, - UINT Width, UINT Height, UINT Depth, - DWORD Usage, +HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface, + UINT Width, UINT Height, UINT Depth, + DWORD Usage, WINED3DFORMAT Format, D3DPOOL Pool, IWineD3DVolume** ppVolume, HANDLE* pSharedHandle, IUnknown *parent) { @@ -670,16 +893,18 @@ return IWineD3DVolume_CleanDirtyBox((IWineD3DVolume *) object); } -HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, UINT EdgeLength, - UINT Levels, DWORD Usage, + +HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, UINT EdgeLength, + UINT Levels, DWORD Usage, WINED3DFORMAT Format, D3DPOOL Pool, IWineD3DCubeTexture** ppCubeTexture, HANDLE* pSharedHandle, IUnknown *parent, - D3DCB_CREATESURFACEFN D3DCB_CreateSurface) { + D3DCB_CREATESURFACETFN D3DCB_CreateSurface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DCubeTextureImpl *object; /** NOTE: impl ref allowed since this is a create function **/ unsigned int i,j; + int texturecount; UINT tmpW; HRESULT hr; @@ -687,8 +912,9 @@ D3DINITILIZEBASETEXTURE(object->baseTexture); TRACE("(%p) Create Cube Texture \n", This); - + object->edgeLength = EdgeLength; + object->resource.pool = Pool; /* Calculate levels for mip mapping */ if (Levels == 0) { @@ -707,10 +933,10 @@ /* Create the 6 faces */ for (j = 0; j < 6; j++) { - + hr=D3DCB_CreateSurface(This->parent, tmpW, tmpW, Format, Usage, Pool, i /* Level */, &object->surfaces[j][i],pSharedHandle); - + if(hr!= D3D_OK){ /* clean up */ int k; @@ -735,14 +961,16 @@ tmpW = max(1, tmpW >> 1); } - TRACE("(%p) : Created Cube Texture %p\n", This, object); + /** TODO: repalce globalStoreTexture with a device **/ + texturecount = globalStoreTexture((IWineD3DBaseTexture *)object); *ppCubeTexture = (IWineD3DCubeTexture *) object; + TRACE("(%p) : Created Cube Texture %d %p\n", This, texturecount, object); return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, WINED3DQUERYTYPE Type, IWineD3DQuery **ppQuery, IUnknown* parent){ +HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, WINED3DQUERYTYPE Type, IWineD3DQuery** ppQuery, IUnknown* parent){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DQueryImpl *object; /*NOTE: impl ref allowed since this is a create function */ + IWineD3DQueryImpl *object; /* NOTE: impl ref allowed since this is a create function */ if(NULL == ppQuery){ /* Just a check to see if we support this type of query */ @@ -766,7 +994,7 @@ hr = D3D_OK; break; default: - FIXME("(%p) Unhandled query type %d\n",This , Type); + FIXME("(%p) Unhandled query type %d\n",This , Type); } FIXME("(%p) : Stub request for query type %d returned %ld\n", This, Type, hr); return hr; @@ -780,103 +1008,474 @@ } /* example at http://www.fairyengine.com/articles/dxmultiviews.htm */ -HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* iface, WINED3DPRESENT_PARAMETERS* pPresentationParameters, void** ppSwapChain, +HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevice* iface, WINED3DPRESENT_PARAMETERS* pPresentationParameters, IWineD3DSwapChain** ppSwapChain, IUnknown* parent, D3DCB_CREATERENDERTARGETFN D3DCB_CreateRenderTarget, D3DCB_CREATEDEPTHSTENCILSURFACEFN D3DCB_CreateDepthStencil){ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - *ppSwapChain = NULL; - FIXME("(%p) : Stub\n",This); + + HWND whichHWND; + HDC hDc; + IWineD3DSwapChainImpl *object; /** NOTE: impl ref allowed since this is a create function **/ + int num; + XVisualInfo template; + GLXContext oldContext; + Drawable oldDrawable; + DWORD startTime = 0; + + if (TRACE_ON(d3d_timings)) + startTime = GetTickCount(); /* Use windows calls for this */ + + + TRACE("(%p) : Created Aditional Swap Chain\n", This); + + /** FIXME: Test under windows to find out what the life cycle of a swap chain is, + * does a device hold a reference to a swap chain giving them a lifetime of the device + * or does the swap chain notify the device of it'd destruction. + *******************************/ + + D3DCREATEOBJECTINSTANCE(object, SwapChain) + + /* Initialize other useful values */ + object->presentParms.BackBufferCount = 1; /* TODO:? support for gl_aux buffers */ + + /********************* + * Lookup the window Handle and the relating X window handel + ********************/ + + /* Setup hwnd we are using, plus which display this equates to */ + whichHWND = *(pPresentationParameters->hDeviceWindow); + if(!whichHWND){ + whichHWND = This->createParms.hFocusWindow; + } + + object->win_handle = whichHWND; + + object->win = (Window)GetPropA( whichHWND, "__wine_x11_whole_window" ); + hDc = GetDC(whichHWND); + object->display = get_display(hDc); + ReleaseDC(whichHWND, hDc); + TRACE("Using a dispaly of %p %p \n", object->display, hDc); + + /** + * Create an opengl context for the display visuial + * NOTE: the visual is chosen as the window is created and the glcontext cannot + * use different properties after that point in time. FIXME: How to handle when requested format + * doesn't match actual visual? Cannot choose one here - code removed as it ONLY works if the one + * it chooses is identical to the one already being used! + **********************************/ + + /** FIXME: Handle stencil appropriately via EnableAutoDepthStencil / AutoDepthStencilFormat **/ + ENTER_GL(); + + /* Create a new context for this swapchain */ + + template.visualid = (VisualID)GetPropA(GetDesktopWindow(), "__wine_x11_visual_id"); + object->visInfo = XGetVisualInfo(object->display, VisualIDMask, &template, &num); + if (NULL == object->visInfo) { + ERR("cannot really get XVisual\n"); + LEAVE_GL(); + return D3DERR_NOTAVAILABLE; + } +#ifdef USE_CONTEXT_MANAGER + + /** TODO: use a context mamager **/ +#endif + + /* The first time around we create the context that is shared with all other swapchians and render targets */ + if(This->numberOfSwapChains == 0) { + object->glCtx = glXCreateContext(object->display, object->visInfo, NULL, GL_TRUE); + TRACE("Creating implicite context for vis %p, hwnd %p\n", object->display, object->visInfo); + }else{ + IWineD3DSwapChain *implSwapChain; + TRACE("Creating context for vis %p, hwnd %p\n", object->display, object->visInfo); + /* TODO: don't use Impl structures outside of create functions! (a context manager will replace the ->glCtx) */ + IWineD3DDevice_GetSwapChain(iface, 0 ,&implSwapChain); + object->glCtx = glXCreateContext(object->display, object->visInfo, ((IWineD3DSwapChainImpl *)implSwapChain)->glCtx, GL_TRUE); + IWineD3DSwapChain_Release(implSwapChain); + } + if (NULL == object->glCtx) { + ERR("cannot create glxContext\n"); + LEAVE_GL(); + return D3DERR_NOTAVAILABLE; + } + + LEAVE_GL(); + if (object->glCtx == NULL) { + ERR("Error in context creation !\n"); + return D3DERR_INVALIDCALL; + } else { + TRACE("Context created (HWND=%p, glContext=%p, Window=%ld, VisInfo=%p)\n", + whichHWND, object->glCtx, object->win, object->visInfo); + } + + /********************* + * Windowed / Fullscreen + *******************/ + + /** + * TODO: MSDNsays that we are only allowed one fullscreen swapchain per device, + * so we should really check to see if their is a fullscreen swapchain already + * I think Windows and X have differnt ideas about fullscreen, does a single head count as full screen? + **************************************/ + + if (!*(pPresentationParameters->Windowed)) { + + DEVMODEW devmode; + HDC hdc; + int bpp = 0; + + /* Get info on the current display setup */ + hdc = CreateDCA("DISPLAY", NULL, NULL, NULL); + bpp = GetDeviceCaps(hdc, BITSPIXEL); + DeleteDC(hdc); + + /* Change the display settings */ + memset(&devmode, 0, sizeof(DEVMODEW)); + devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmBitsPerPel = (bpp >= 24) ? 32 : bpp; /* Stupid XVidMode cannot change bpp */ + devmode.dmPelsWidth = *(pPresentationParameters->BackBufferWidth); + devmode.dmPelsHeight = *(pPresentationParameters->BackBufferHeight); + MultiByteToWideChar(CP_ACP, 0, "Gamers CG", -1, devmode.dmDeviceName, CCHDEVICENAME); + ChangeDisplaySettingsExW(devmode.dmDeviceName, &devmode, object->win_handle, CDS_FULLSCREEN, NULL); + + /* Make popup window */ + SetWindowLongA(whichHWND, GWL_STYLE, WS_POPUP); + SetWindowPos(object->win_handle, HWND_TOP, 0, 0, + *(pPresentationParameters->BackBufferWidth), + *(pPresentationParameters->BackBufferHeight), SWP_SHOWWINDOW | SWP_FRAMECHANGED); + + + } + + + /** MSDN: If Windowed is TRUE and either of the BackBufferWidth/Height values is zero, + * then the corresponding dimension of the client area of the hDeviceWindow + * (or the focus window, if hDeviceWindow is NULL) is taken. + **********************/ + + if (*(pPresentationParameters->Windowed) && + ((*(pPresentationParameters->BackBufferWidth) == 0) || + (*(pPresentationParameters->BackBufferHeight) == 0))) { + + RECT Rect; + GetClientRect(whichHWND, &Rect); + + if (*(pPresentationParameters->BackBufferWidth) == 0) { + *(pPresentationParameters->BackBufferWidth) = Rect.right; + TRACE("Updating width to %d\n", *(pPresentationParameters->BackBufferWidth)); + } + if (*(pPresentationParameters->BackBufferHeight) == 0) { + *(pPresentationParameters->BackBufferHeight) = Rect.bottom; + TRACE("Updating height to %d\n", *(pPresentationParameters->BackBufferHeight)); + } + } + + /********************* + * finish off parameter initilazation + *******************/ + + /* Put the correct figures in the presentation parameters */ + TRACE("Coppying accross presentaion paraneters\n"); + object->presentParms.BackBufferWidth = *(pPresentationParameters->BackBufferWidth); + object->presentParms.BackBufferHeight = *(pPresentationParameters->BackBufferHeight); + object->presentParms.BackBufferFormat = *(pPresentationParameters->BackBufferFormat); + object->presentParms.BackBufferCount = *(pPresentationParameters->BackBufferCount); + object->presentParms.MultiSampleType = *(pPresentationParameters->MultiSampleType); + object->presentParms.MultiSampleQuality = *(pPresentationParameters->MultiSampleQuality); + object->presentParms.SwapEffect = *(pPresentationParameters->SwapEffect); + object->presentParms.hDeviceWindow = *(pPresentationParameters->hDeviceWindow); + object->presentParms.Windowed = *(pPresentationParameters->Windowed); + object->presentParms.EnableAutoDepthStencil = *(pPresentationParameters->EnableAutoDepthStencil); + object->presentParms.AutoDepthStencilFormat = *(pPresentationParameters->AutoDepthStencilFormat); + object->presentParms.Flags = *(pPresentationParameters->Flags); + object->presentParms.FullScreen_RefreshRateInHz = *(pPresentationParameters->FullScreen_RefreshRateInHz); + object->presentParms.PresentationInterval = *(pPresentationParameters->PresentationInterval); + + + + /********************* + * Create the back, frontand stencil buffers + *******************/ + TRACE("calling rendertarget CB\n"); + D3DCB_CreateRenderTarget((IUnknown *) This->parent, + object->presentParms.BackBufferWidth, + object->presentParms.BackBufferHeight, + object->presentParms.BackBufferFormat, + object->presentParms.MultiSampleType, + object->presentParms.MultiSampleQuality, + TRUE /* Lockable */, + &object->frontBuffer, + NULL /* pShared (always null)*/); + IWineD3DSurface_SetContainer(object->frontBuffer, (IUnknown *)object); + TRACE("calling rendertarget CB\n"); + D3DCB_CreateRenderTarget((IUnknown *) This->parent, + object->presentParms.BackBufferWidth, + object->presentParms.BackBufferHeight, + object->presentParms.BackBufferFormat, + object->presentParms.MultiSampleType, + object->presentParms.MultiSampleQuality, + TRUE /* Lockable */, + &object->backBuffer, + NULL /* pShared (always null)*/); + IWineD3DSurface_SetContainer(object->backBuffer, (IUnknown *)object); + + /* Under directX swapchains share the depth stencil, so only create one depth-stencil */ + if (pPresentationParameters->EnableAutoDepthStencil) { + TRACE("Creating depth stencil buffer\n"); + if(This->depthStencilBuffer == NULL ){ + D3DCB_CreateDepthStencil((IUnknown *) This->parent, + object->presentParms.BackBufferWidth, + object->presentParms.BackBufferHeight, + object->presentParms.AutoDepthStencilFormat, + object->presentParms.MultiSampleType, + object->presentParms.MultiSampleQuality, + FALSE /* FIXME: Discard */, + &This->depthStencilBuffer, + NULL /* pShared (always null)*/ ); + IWineD3DSurface_SetContainer(This->depthStencilBuffer, (IUnknown *)iface); + } + + /** TODO: A check on width, height and multisample types + *(since the zbuffer must be at least as large as the render target and have the same multisample parameters) + ****************************/ + object->wantsDepthStencilBuffer = TRUE; + } else { + object->wantsDepthStencilBuffer = FALSE; + } + + TRACE("FrontBuf @ %p, BackBuf @ %p, DepthStencil %d\n",object->frontBuffer, object->backBuffer, object->wantsDepthStencilBuffer); + + + /********************* + * init the default renderTarget management + *******************/ + object->drawable = object->win; + object->render_ctx = object->glCtx; + + + /********************* + * Setup some defaults and clear down the buffers + *******************/ + ENTER_GL(); + /** save current context and drawable **/ + oldContext = glXGetCurrentContext(); + oldDrawable = glXGetCurrentDrawable(); + + + if (glXMakeCurrent(object->display, object->win, object->glCtx) == False) { + ERR("Error in setting current context (display %p context %p drawable %ld)!\n", object->display, object->glCtx, object->win); + } + checkGLcall("glXMakeCurrent"); + + + /* Clear the screen */ + glClearColor(0.0, 0.0, 0.0, 0.0); + checkGLcall("glClearColor"); + glClearIndex(0); + glClearDepth(1); + glClearStencil(0); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + checkGLcall("glClear"); + + glColor3f(1.0, 1.0, 1.0); + checkGLcall("glColor3f"); + + glEnable(GL_LIGHTING); + checkGLcall("glEnable"); + + glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); + checkGLcall("glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);"); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT); + checkGLcall("glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);"); + + glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); + checkGLcall("glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);"); + + /* switch back to the original context (unless it was zero)*/ + if(This->numberOfSwapChains != 0){ + /** TODO: restore the context and drawable **/ + glXMakeCurrent(object->display, oldDrawable, oldContext); + } + LEAVE_GL(); + + /* TODO: move this off into a linked list implementation! (add swapchain, remove swapchain or something along those lines) */ +#if 0 + IListOperator *listOperator; + IListStore_CreateListOperator(This->swapchainStore, &listOperator); + IListOperator_Append(listOperator, (void *)object); + IListOperator_Release(listOperator); +#endif + + This->swapchains[This->numberOfSwapChains++] = (IWineD3DSwapChain *)object; + if (TRACE_ON(d3d_timings)) + TRACE_(d3d_timings)("(%p) starttime %ld , total time %ld\n", This, startTime , GetTickCount() -startTime); + + TRACE("Set swapchain to %p\n", object); return D3D_OK; + } /** NOTE: These are ahead of the other getters and setters to save using a forward declartion **/ UINT WINAPI IWineD3DDeviceImpl_GetNumberOfSwapChains(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - FIXME("(%p) : Stub\n",This); - return 1; + + +#if 0 /** TODO: move over to using stores and linked lists. **/ + unsigned int numberOfSwapChains = 0; + IListOperator *listOperator; + IListStore_CreateListOperator(This->swapChainStore, &listOperator); + numberOfSwapChains = IListOperator_count(listOperator); + IListOperator_Release(listOperator); + + TRACE("(%p) returning %d\n", This, numberOfSwapChains); + return numberOfSwapChains; +#endif + + + TRACE("(%p) returning %d\n", This, This->numberOfSwapChains); + return This->numberOfSwapChains; } -HRESULT WINAPI IWineD3DDeviceImpl_GetSwapChain(IWineD3DDevice *iface, UINT iSwapChain, void** pSwapChain) { +HRESULT WINAPI IWineD3DDeviceImpl_GetSwapChain(IWineD3DDevice *iface, UINT iSwapChain, IWineD3DSwapChain** pSwapChain) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - FIXME("(%p) : Stub\n",This); + TRACE("(%p) : swapchain %d \n", This, iSwapChain); + if(iSwapChain > IWineD3DDeviceImpl_GetNumberOfSwapChains(iface) || iSwapChain<0){ + *pSwapChain = NULL; + return D3DERR_INVALIDCALL; + }else{ + /** TODO: move off to a linkesList implementation **/ + *pSwapChain = This->swapchains[iSwapChain]; + } +#if 0 /* TODO: move over to using stores and linked lists. */ + IListOperator *listOperator; + IListStore_CreateListOperator(This->swapChainStore, &listOperator); + hr = IListOperator_get(listOperator, iSwapChain, (void **)pSwapChain); + IListOperator_Release(listOperator); + if(hr != D3D_OK){ + *pSwapChain = NULL; + return D3DERR_INVALIDCALL; + } +#endif + + IWineD3DSwapChain_AddRef(*pSwapChain); + TRACE("(%p) returning %p\n", This, *pSwapChain); return D3D_OK; } + HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRESENT_PARAMETERS* pPresentationParameters){ - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - FIXME("(%p) : Stub\n",This); + /** ******************************************************** + * From dx9_lost_device.... + * + * Reset will fail unless the application releases all + * resources that are allocated in D3DPOOL_DEFAULT, including + * those created by the IDirect3DDevice9::CreateRenderTarget + * and IDirect3DDevice9::CreateDepthStencilSurface methods. + * *****************************************************/ + + /** TODO: Move all the globalStore into the device object + * Check that all objects with a usage of D3DPOOL_DEFAULT have been released + * perform a reset using the new presentationParameters + **/ + +#if 0 + IListOperator *listOpertor = NULL; + IListStore_CreateListOperator(This->textureStore, &listOpertor); + IWIneD3DBaseTextureImpl *texture; + while(texture = (IWIneD3DBaseTextureImpl *)IListOperator_Next(listOpertor)){ + if(texture->resource.pool == D3DPOOL_DEFAULT){ + WARN("Application tried called reset, without first destroying all D3DPOOL_DEFAULT textures\n"); + IListOperator_Release(listOpertor); + return D3DERR_INVALIDCALL; + } + + } + IListOperator_Release(listOpertor); + + IListStore_CreateListOperator(This->surfaceStore, &listOpertor); + IWIneD3DSurfaceImpl *texture; + while(surface = (IWIneD3DSurfaceImpl *)IListOperator_Next(listOpertor)){ + if(surface->resource.pool == D3DPOOL_DEFAULT){ + WARN("Application tried called reset, without first destroying all D3DPOOL_DEFAULT surfaces\n"); + IListOperator_Release(listOpertor); + return D3DERR_INVALIDCALL; + } + + } + IListOperator_Release(listOpertor); + + /* TODO: check vertexBuffers (swapchains?) etc... */ +#endif return D3D_OK; - + } /***** * Vertex Declaration *****/ + /* TODO: Get ridd of thease and put the functions in the IWineD3DVertexDeclaration interface */ -#if 1 extern HRESULT IWineD3DVertexDeclarationImpl_ParseDeclaration8(IWineD3DDeviceImpl * This, const DWORD* pDecl, IWineD3DVertexDeclarationImpl * object); extern HRESULT IWineD3DVertexDeclarationImpl_ParseDeclaration9(IWineD3DDeviceImpl * This, const D3DVERTEXELEMENT9* pDecl, IWineD3DVertexDeclarationImpl * object); - -HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration(IWineD3DDevice* iface, CONST VOID* pDeclaration, IWineD3DVertexDeclaration** ppVertexDeclaration, IUnknown *parent) { +HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration8(IWineD3DDevice* iface, const DWORD* pDeclaration, IWineD3DVertexDeclaration** ppVertexDeclaration, IUnknown *parent){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DVertexDeclarationImpl *object = NULL; + IWineD3DVertexDeclarationImpl *object = NULL; /* NOTE: impl allowed, this is a create */ HRESULT hr = D3D_OK; - - TRACE("(%p) : directXVersion=%u, pFunction=%p, ppDecl=%p\n", This, ((IWineD3DImpl *)This->wineD3D)->dxVersion, pDeclaration, ppVertexDeclaration); + /* TODO: replace impl usage with a call to Version */ + TRACE("(%p) : directXVersion=%u, pFunction=%p, ppDecl=%p\n", This, ((IWineD3DImpl *)This->wineD3D)->dxVersion, pDeclaration, ppVertexDeclaration); D3DCREATEOBJECTINSTANCE(object, VertexDeclaration) object->allFVF = 0; - - if (8 == ((IWineD3DImpl *)This->wineD3D)->dxVersion) { - /** @TODO */ - hr = IWineD3DVertexDeclarationImpl_ParseDeclaration8(This, (const DWORD*) pDeclaration, object); - } else { - hr = IWineD3DVertexDeclarationImpl_ParseDeclaration9(This, (const D3DVERTEXELEMENT9*) pDeclaration, object); - } + /* TODO: get ridd of the impl usage, we should only be using interfaces */ + hr = IWineD3DVertexDeclarationImpl_ParseDeclaration8(This, pDeclaration, object); return hr; } - -#else -HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration8(IWineD3DDevice* iface, const DWORD* pDeclaration, IWineD3DVertexDeclaration** ppVertexDeclaration, IUnknown *parent){ +HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration9(IWineD3DDevice* iface, const D3DVERTEXELEMENT9* pDeclaration, IWineD3DVertexDeclaration** ppVertexDeclaration, IUnknown *parent){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVertexDeclarationImpl *object = NULL; /* NOTE: impl allowed, this is a create */ HRESULT hr = D3D_OK; - /* TODO: replace impl usage with a call to Version*/ - TRACE("(%p) : directXVersion=%u, pFunction=%p, ppDecl=%p\n", This, ((IWineD3DImpl *)This->wineD3D)->dxVersion, pDeclaration, ppVertexDeclaration); + /* TODO: replace impl usage with a call to Version */ + TRACE("(%p) : directXVersion=%u, pFunction=%p, ppDecl=%p\n", This, ((IWineD3DImpl *)This->wineD3D)->dxVersion, pDeclaration, ppVertexDeclaration); D3DCREATEOBJECTINSTANCE(object, VertexDeclaration) object->allFVF = 0; /* TODO: get ridd of the impl usage, we should only be using interfaces */ - hr = IWineD3DVertexDeclarationImpl_ParseDeclaration8(This, pDeclaration, object); - + hr = IWineD3DVertexDeclarationImpl_ParseDeclaration9(This, pDeclaration, object); + return hr; } -HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration9(IWineD3DDevice* iface, const D3DVERTEXELEMENT9* pDeclaration, IWineD3DVertexDeclaration** ppVertexDeclaration, IUnknown *parent){ +/** TODO: repalce with IWineD3DDeviceImpl_CreateVertexDeclaration8 and IWineD3DDeviceImpl_CreateVertexDeclaration9 to avoid the use of a void * (see above!) **/ +HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration(IWineD3DDevice* iface, CONST VOID* pDeclaration, IWineD3DVertexDeclaration** ppVertexDeclaration, IUnknown *parent) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVertexDeclarationImpl *object = NULL; /* NOTE: impl allowed, this is a create */ HRESULT hr = D3D_OK; - /* TODO: replace impl usage with a call to Version*/ - TRACE("(%p) : directXVersion=%u, pFunction=%p, ppDecl=%p\n", This, ((IWineD3DImpl *)This->wineD3D)->dxVersion, pDeclaration, ppVertexDeclaration); + /* TODO: replace impl usage with a call to Version */ + TRACE("(%p) : directXVersion=%u, pFunction=%p, ppDecl=%p\n", This, ((IWineD3DImpl *)This->wineD3D)->dxVersion, pDeclaration, ppVertexDeclaration); D3DCREATEOBJECTINSTANCE(object, VertexDeclaration) object->allFVF = 0; - /* TODO: get ridd of the impl usage, we should only be using interfaces */ - hr = IWineD3DVertexDeclarationImpl_ParseDeclaration9(This, pDeclaration, object); - + + if (8 == ((IWineD3DImpl *)This->wineD3D)->dxVersion) { + /** @TODO */ + hr = IWineD3DVertexDeclarationImpl_ParseDeclaration8(This, (const DWORD*) pDeclaration, object); + } else { + hr = IWineD3DVertexDeclarationImpl_ParseDeclaration9(This, (const D3DVERTEXELEMENT9*) pDeclaration, object); + } + return hr; } -#endif /* http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/programmingguide/programmable/vertexshaders/vscreate.asp */ HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice* iface, CONST DWORD* pFunction, IWineD3DVertexShader** ppVertexShader, IUnknown *parent){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DVertexShaderImpl *object; /* NOTE: impl usage is ok, this is a create */ - D3DCREATEOBJECTINSTANCE(object, VertexShader) + IWineD3DVertexShaderImpl *object; /* NOTE: impl allowed, this is a create */ + D3DCREATEOBJECTINSTANCE(object, VertexShader) object->function = pFunction; FIXME("(%p) : STUB: Created Vertex shader %p\n", This, ppVertexShader); return D3D_OK; @@ -885,26 +1484,40 @@ HRESULT WINAPI IWineD3DDeviceImpl_CreatePixelShader(IWineD3DDevice* iface, CONST DWORD* pFunction, IWineD3DPixelShader** ppPixelShader, IUnknown *parent){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - FIXME("(%p) : Stub\n", This); + IWineD3DPixelShaderImpl *object; /* NOTE: impl allowed, this is a create */ + D3DCREATEOBJECTINSTANCE(object, PixelShader) + object->function = pFunction; + FIXME("(%p) : STUB: Created Pixel shader %p\n", This, ppPixelShader); return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_GetDirect3D(IWineD3DDevice* iface, IWineD3D** ppD3D){ +HRESULT WINAPI IWineD3DDeviceImpl_GetDirect3D(IWineD3DDevice* iface, IWineD3D** ppD3D){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; *ppD3D= This->wineD3D; TRACE("(%p) : wineD3D returning %p\n", This, *ppD3D); IWineD3D_AddRef(*ppD3D); return D3D_OK; - + } - + UINT WINAPI IWineD3DDeviceImpl_GetAvailableTextureMem(IWineD3DDevice *iface) { + /** NOTE: There's a probably a hack-around for this one by putting as many pbuffers, VBO's (or whatever) + * Into the video ram as possible and seeing how many fit + * you can also get the correct initial value from via X and ATI's driver + *******************/ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - FIXME("Stub :(%p) returning 64Mib\n", This); - return 64*1024*1024; + static BOOL showfixmes = TRUE; + if(showfixmes){ + FIXME("(%p) : stub, emulating %dMib for now, returning %dMib\n", This, (emmulated_textureram/(1024*1024)), + ((emmulated_textureram - wineD3DGlobalStatistics->glsurfaceram) / (1024*1024))); + showfixmes = FALSE; + } + TRACE("(%p) : emulating %dMib for now, returning %dMib\n", This, (emmulated_textureram/(1024*1024)), + ((emmulated_textureram - wineD3DGlobalStatistics->glsurfaceram) / (1024*1024))); + /* videomemory is simulated videomemory + AGP memory left */ + return (emmulated_textureram - wineD3DGlobalStatistics->glsurfaceram); } - /***** * Get / Set FVF *****/ @@ -916,9 +1529,17 @@ This->updateStateBlock->changed.fvf = TRUE; This->updateStateBlock->set.fvf = TRUE; + /* clear down the vertex declaration + NOTE: Axis and Allies doesn't work properly otherwise + (may be a stateblock problem though!) + */ + + IWineD3DDevice_SetVertexDeclaration(iface, NULL); + TRACE("(%p) : FVF Shader FVF set to %lx\n", This, fvf); - - /* No difference if recording or not */ + if(This->isRecordingState) { + return D3D_OK; + } return D3D_OK; } HRESULT WINAPI IWineD3DDeviceImpl_GetFVF(IWineD3DDevice *iface, DWORD *pfvf) { @@ -935,14 +1556,41 @@ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVertexBuffer *oldSrc; - oldSrc = This->stateBlock->stream_source[StreamNumber]; + /**TODO: instance and index data, see + http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/programmingguide/advancedtopics/DrawingMultipleInstances.asp + and + http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/d3d/interfaces/idirect3ddevice9/SetStreamSourceFreq.asp + **************/ + + /* D3d9 only, but shouldn't hurt d3d8 */ + UINT streamFlags; + + streamFlags = StreamNumber &(D3DSTREAMSOURCE_INDEXEDDATA | D3DSTREAMSOURCE_INSTANCEDATA); + if(streamFlags){ + if(streamFlags & D3DSTREAMSOURCE_INDEXEDDATA){ + FIXME("stream index data not supported\n"); + } + if(streamFlags & D3DSTREAMSOURCE_INDEXEDDATA){ + FIXME("stream instance data not supported\n"); + } + } + + StreamNumber&= ~(D3DSTREAMSOURCE_INDEXEDDATA | D3DSTREAMSOURCE_INSTANCEDATA); + + if(StreamNumber >= MAX_STREAMS){ + ERR("Stream out of rance %d\n", StreamNumber); + return D3DERR_INVALIDCALL; + } + + oldSrc = This->stateBlock->streamSource[StreamNumber]; TRACE("(%p) : StreamNo: %d, OldStream (%p), NewStream (%p), NewStride %d\n", This, StreamNumber, oldSrc, pStreamData, Stride); - This->updateStateBlock->changed.stream_source[StreamNumber] = TRUE; - This->updateStateBlock->set.stream_source[StreamNumber] = TRUE; - This->updateStateBlock->stream_stride[StreamNumber] = Stride; - This->updateStateBlock->stream_source[StreamNumber] = pStreamData; - This->updateStateBlock->stream_offset[StreamNumber] = OffsetInBytes; + This->updateStateBlock->changed.streamSource[StreamNumber] = TRUE; + This->updateStateBlock->set.streamSource[StreamNumber] = TRUE; + This->updateStateBlock->streamStride[StreamNumber] = Stride; + This->updateStateBlock->streamSource[StreamNumber] = pStreamData; + This->updateStateBlock->streamOffset[StreamNumber] = OffsetInBytes; + This->updateStateBlock->streamFlags[StreamNumber] = streamFlags; /* Handle recording of state blocks */ if (This->isRecordingState) { @@ -951,48 +1599,102 @@ } /* Not recording... */ + /* Need to do a getParent and pass the reffs up */ + /* MSDN says ..... When an application no longer holds a references to this interface, the interface will automatically be freed. + which suggests that we shouldn't be ref counting? and do need a _release on the stream source to reset the stream source + so for now, just count internally */ +#if 0 /* TODO: move over to using ResourceReleased */ + /* do nothing we're using ResourceReleased instead */ +#else if (oldSrc != NULL) IWineD3DVertexBuffer_Release(oldSrc); if (pStreamData != NULL) IWineD3DVertexBuffer_AddRef(pStreamData); - +#endif return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_GetStreamSource(IWineD3DDevice *iface, UINT StreamNumber,IWineD3DVertexBuffer** pStream, UINT *pOffset, UINT* pStride) { +HRESULT WINAPI IWineD3DDeviceImpl_GetStreamSource(IWineD3DDevice *iface, UINT StreamNumber, + IWineD3DVertexBuffer** pStream, UINT *pOffset, UINT* pStride) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + UINT streamFlags; + + TRACE("(%p) : StreamNo: %d, Stream (%p), Stride %d\n", This, StreamNumber, + This->stateBlock->streamSource[StreamNumber], This->stateBlock->streamStride[StreamNumber]); + + + streamFlags = StreamNumber &(D3DSTREAMSOURCE_INDEXEDDATA | D3DSTREAMSOURCE_INSTANCEDATA); + if(streamFlags){ + if(streamFlags & D3DSTREAMSOURCE_INDEXEDDATA){ + FIXME("stream index data not supported\n"); + } + if(streamFlags & D3DSTREAMSOURCE_INDEXEDDATA){ + FIXME("stream instance data not supported\n"); + } + } + + StreamNumber&= ~(D3DSTREAMSOURCE_INDEXEDDATA | D3DSTREAMSOURCE_INSTANCEDATA); + + if(StreamNumber >= MAX_STREAMS){ + ERR("Stream out of rance %d\n", StreamNumber); + return D3DERR_INVALIDCALL; + } + *pStream = This->stateBlock->streamSource[StreamNumber]; + *pStride = This->stateBlock->streamStride[StreamNumber]; + *pOffset = This->stateBlock->streamOffset[StreamNumber]; + if(*pStream == NULL){ + FIXME("Attempting to get an empty stream %d\n", StreamNumber); + return D3DERR_INVALIDCALL; + } - TRACE("(%p) : StreamNo: %d, Stream (%p), Stride %d\n", This, StreamNumber, This->stateBlock->stream_source[StreamNumber], This->stateBlock->stream_stride[StreamNumber]); - *pStream = This->stateBlock->stream_source[StreamNumber]; - *pStride = This->stateBlock->stream_stride[StreamNumber]; - *pOffset = This->stateBlock->stream_offset[StreamNumber]; - if (*pStream != NULL) IWineD3DVertexBuffer_AddRef(*pStream); /* We have created a new reference to the VB */ + IWineD3DVertexBuffer_AddRef(*pStream); /* We have created a new reference to the VB */ return D3D_OK; } -/*Should be quite easy, just an extension of vertexdata + +/* Should be quite easy, just an extension of vertexdata ref... http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c_Summer_04/directx/graphics/programmingguide/advancedtopics/DrawingMultipleInstances.asp The divider is a bit odd though -VertexOffset = StartVertex / Divider * StreamStride + +VertexOffset = StartVertex / Divider * StreamStride + VertexIndex / Divider * StreamStride + StreamOffset */ HRESULT WINAPI IWineD3DDeviceImpl_SetStreamSourceFreq(IWineD3DDevice *iface, UINT StreamNumber, UINT Divider){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - FIXME("(%p) : stub\n", This); + + TRACE("(%p) StreamNumber(%d), Divider(%d)\n", This, StreamNumber, Divider); + This->updateStateBlock->streamFlags[StreamNumber] = Divider & (D3DSTREAMSOURCE_INSTANCEDATA | D3DSTREAMSOURCE_INDEXEDDATA ); + This->updateStateBlock->changed.streamFreq[StreamNumber] = TRUE; + This->updateStateBlock->set.streamFreq[StreamNumber] = TRUE; + This->updateStateBlock->streamFreq[StreamNumber] = Divider & 0x7FFFFF; + if(This->updateStateBlock->streamFlags[StreamNumber] || This->updateStateBlock->streamFreq[StreamNumber] != 1){ + FIXME("Stream indexing not fully supported\n"); + } return D3D_OK; - + } HRESULT WINAPI IWineD3DDeviceImpl_GetStreamSourceFreq(IWineD3DDevice *iface, UINT StreamNumber, UINT* Divider){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - FIXME("(%p) : stub\n", This); + + TRACE("(%p) StreamNumber(%d), Divider(%p)\n", This, StreamNumber, Divider); + *Divider = This->updateStateBlock->streamFreq[StreamNumber] | This->updateStateBlock->streamFlags[StreamNumber]; + TRACE("(%p) : returning %d\n", This, *Divider); return D3D_OK; - + } +/* Should be quite easy, just an extension of vertexdata +ref... +http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c_Summer_04/directx/graphics/programmingguide/advancedtopics/DrawingMultipleInstances.asp + +The divider is a bit odd though + +VertexOffset = StartVertex / Divider * StreamStride + + VertexIndex / Divider * StreamStride + StreamOffset + +*/ + /***** * Get / Set & Multipy Transform *****/ @@ -1011,14 +1713,17 @@ return D3D_OK; } - /* + /** * If the new matrix is the same as the current one, * we cut off any further processing. this seems to be a reasonable * optimization because as was noticed, some apps (warcraft3 for example) * tend towards setting the same matrix repeatedly for some reason. * * From here on we assume that the new matrix is different, wherever it matters. - */ + ******************/ + dumpMatrixTRACE(lpmatrix); + + if (!memcmp(&This->stateBlock->transforms[d3dts].u.m[0][0], lpmatrix, sizeof(D3DMATRIX))) { TRACE("The app is setting the same matrix over again\n"); return D3D_OK; @@ -1026,13 +1731,13 @@ conv_mat(lpmatrix, &This->stateBlock->transforms[d3dts].u.m[0][0]); } - /* - ScreenCoord = ProjectionMat * ViewMat * WorldMat * ObjectCoord - where ViewMat = Camera space, WorldMat = world space. - - In OpenGL, camera and world space is combined into GL_MODELVIEW - matrix. The Projection matrix stay projection matrix. - */ + /** + * ScreenCoord = ProjectionMat * ViewMat * WorldMat * ObjectCoord + * where ViewMat = Camera space, WorldMat = world space. + * + * In OpenGL, camera and world space is combined into GL_MODELVIEW + * matrix. The Projection matrix stay projection matrix. + *****************************/ /* Capture the times we can just ignore the change for now */ if (d3dts == D3DTS_WORLDMATRIX(0)) { @@ -1043,13 +1748,16 @@ This->proj_valid = FALSE; return D3D_OK; - } else if (d3dts >= D3DTS_WORLDMATRIX(1) && d3dts <= D3DTS_WORLDMATRIX(255)) { + } else if (d3dts >= D3DTS_WORLDMATRIX(1) && d3dts <= D3DTS_WORLDMATRIX(3)) { + This->proj_valid = FALSE; + return D3D_OK; + } else if (d3dts >= D3DTS_WORLDMATRIX(3) && d3dts <= D3DTS_WORLDMATRIX(255)) { /* Indexed Vertex Blending Matrices 256 -> 511 */ /* Use arb_vertex_blend or NV_VERTEX_WEIGHTING? */ - FIXME("D3DTS_WORLDMATRIX(1..255) not handled\n"); + FIXME("D3DTS_WORLDMATRIX(3..255) not handled\n"); return D3D_OK; - } - + } + /* Now we really are going to have to change a matrix */ ENTER_GL(); @@ -1057,19 +1765,20 @@ if (d3dts < GL_LIMITS(textures)) { int tex = d3dts - D3DTS_TEXTURE0; GLACTIVETEXTURE(tex); - set_texture_matrix((float *)lpmatrix, + FIXME("Texture matrix transform adn't applied yet\n"); + set_texture_matrix((float *)lpmatrix, This->updateStateBlock->textureState[tex][D3DTSS_TEXTURETRANSFORMFLAGS]); } } else if (d3dts == D3DTS_VIEW) { /* handle the VIEW matrice */ unsigned int k; - /* If we are changing the View matrix, reset the light and clipping planes to the new view + /** If we are changing the View matrix, reset the light and clipping planes to the new view * NOTE: We have to reset the positions even if the light/plane is not currently - * enabled, since the call to enable it will not reset the position. + * enabled, since the call to enable it will not reset the position. * NOTE2: Apparently texture transforms do NOT need reapplying - */ - + ***********************/ + PLIGHTINFOEL *lightChain = NULL; This->modelview_valid = FALSE; This->view_ident = !memcmp(lpmatrix, identity, 16*sizeof(float)); @@ -1106,6 +1815,7 @@ return D3D_OK; } + HRESULT WINAPI IWineD3DDeviceImpl_GetTransform(IWineD3DDevice *iface, D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p) : for Transform State %d\n", This, State); @@ -1117,11 +1827,11 @@ D3DMATRIX *mat = NULL; D3DMATRIX temp; - /* Note: Using 'updateStateBlock' rather than 'stateblock' in the code + /** Note: Using 'updateStateBlock' rather than 'stateblock' in the code * below means it will be recorded in a state block change, but it - * works regardless where it is recorded. + * works regardless where it is recorded. * If this is found to be wrong, change to StateBlock. - */ + *************************/ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p) : For state %u\n", This, State); @@ -1133,25 +1843,41 @@ } /* Copied from ddraw code: */ - temp.u.s._11 = (mat->u.s._11 * pMatrix->u.s._11) + (mat->u.s._21 * pMatrix->u.s._12) + (mat->u.s._31 * pMatrix->u.s._13) + (mat->u.s._41 * pMatrix->u.s._14); - temp.u.s._21 = (mat->u.s._11 * pMatrix->u.s._21) + (mat->u.s._21 * pMatrix->u.s._22) + (mat->u.s._31 * pMatrix->u.s._23) + (mat->u.s._41 * pMatrix->u.s._24); - temp.u.s._31 = (mat->u.s._11 * pMatrix->u.s._31) + (mat->u.s._21 * pMatrix->u.s._32) + (mat->u.s._31 * pMatrix->u.s._33) + (mat->u.s._41 * pMatrix->u.s._34); - temp.u.s._41 = (mat->u.s._11 * pMatrix->u.s._41) + (mat->u.s._21 * pMatrix->u.s._42) + (mat->u.s._31 * pMatrix->u.s._43) + (mat->u.s._41 * pMatrix->u.s._44); - - temp.u.s._12 = (mat->u.s._12 * pMatrix->u.s._11) + (mat->u.s._22 * pMatrix->u.s._12) + (mat->u.s._32 * pMatrix->u.s._13) + (mat->u.s._42 * pMatrix->u.s._14); - temp.u.s._22 = (mat->u.s._12 * pMatrix->u.s._21) + (mat->u.s._22 * pMatrix->u.s._22) + (mat->u.s._32 * pMatrix->u.s._23) + (mat->u.s._42 * pMatrix->u.s._24); - temp.u.s._32 = (mat->u.s._12 * pMatrix->u.s._31) + (mat->u.s._22 * pMatrix->u.s._32) + (mat->u.s._32 * pMatrix->u.s._33) + (mat->u.s._42 * pMatrix->u.s._34); - temp.u.s._42 = (mat->u.s._12 * pMatrix->u.s._41) + (mat->u.s._22 * pMatrix->u.s._42) + (mat->u.s._32 * pMatrix->u.s._43) + (mat->u.s._42 * pMatrix->u.s._44); - - temp.u.s._13 = (mat->u.s._13 * pMatrix->u.s._11) + (mat->u.s._23 * pMatrix->u.s._12) + (mat->u.s._33 * pMatrix->u.s._13) + (mat->u.s._43 * pMatrix->u.s._14); - temp.u.s._23 = (mat->u.s._13 * pMatrix->u.s._21) + (mat->u.s._23 * pMatrix->u.s._22) + (mat->u.s._33 * pMatrix->u.s._23) + (mat->u.s._43 * pMatrix->u.s._24); - temp.u.s._33 = (mat->u.s._13 * pMatrix->u.s._31) + (mat->u.s._23 * pMatrix->u.s._32) + (mat->u.s._33 * pMatrix->u.s._33) + (mat->u.s._43 * pMatrix->u.s._34); - temp.u.s._43 = (mat->u.s._13 * pMatrix->u.s._41) + (mat->u.s._23 * pMatrix->u.s._42) + (mat->u.s._33 * pMatrix->u.s._43) + (mat->u.s._43 * pMatrix->u.s._44); - - temp.u.s._14 = (mat->u.s._14 * pMatrix->u.s._11) + (mat->u.s._24 * pMatrix->u.s._12) + (mat->u.s._34 * pMatrix->u.s._13) + (mat->u.s._44 * pMatrix->u.s._14); - temp.u.s._24 = (mat->u.s._14 * pMatrix->u.s._21) + (mat->u.s._24 * pMatrix->u.s._22) + (mat->u.s._34 * pMatrix->u.s._23) + (mat->u.s._44 * pMatrix->u.s._24); - temp.u.s._34 = (mat->u.s._14 * pMatrix->u.s._31) + (mat->u.s._24 * pMatrix->u.s._32) + (mat->u.s._34 * pMatrix->u.s._33) + (mat->u.s._44 * pMatrix->u.s._34); - temp.u.s._44 = (mat->u.s._14 * pMatrix->u.s._41) + (mat->u.s._24 * pMatrix->u.s._42) + (mat->u.s._34 * pMatrix->u.s._43) + (mat->u.s._44 * pMatrix->u.s._44); + temp.u.s._11 = (mat->u.s._11 * pMatrix->u.s._11) + (mat->u.s._21 * pMatrix->u.s._12) + + (mat->u.s._31 * pMatrix->u.s._13) + (mat->u.s._41 * pMatrix->u.s._14); + temp.u.s._21 = (mat->u.s._11 * pMatrix->u.s._21) + (mat->u.s._21 * pMatrix->u.s._22) + + (mat->u.s._31 * pMatrix->u.s._23) + (mat->u.s._41 * pMatrix->u.s._24); + temp.u.s._31 = (mat->u.s._11 * pMatrix->u.s._31) + (mat->u.s._21 * pMatrix->u.s._32) + + (mat->u.s._31 * pMatrix->u.s._33) + (mat->u.s._41 * pMatrix->u.s._34); + temp.u.s._41 = (mat->u.s._11 * pMatrix->u.s._41) + (mat->u.s._21 * pMatrix->u.s._42) + + (mat->u.s._31 * pMatrix->u.s._43) + (mat->u.s._41 * pMatrix->u.s._44); + + temp.u.s._12 = (mat->u.s._12 * pMatrix->u.s._11) + (mat->u.s._22 * pMatrix->u.s._12) + + (mat->u.s._32 * pMatrix->u.s._13) + (mat->u.s._42 * pMatrix->u.s._14); + temp.u.s._22 = (mat->u.s._12 * pMatrix->u.s._21) + (mat->u.s._22 * pMatrix->u.s._22) + + (mat->u.s._32 * pMatrix->u.s._23) + (mat->u.s._42 * pMatrix->u.s._24); + temp.u.s._32 = (mat->u.s._12 * pMatrix->u.s._31) + (mat->u.s._22 * pMatrix->u.s._32) + + (mat->u.s._32 * pMatrix->u.s._33) + (mat->u.s._42 * pMatrix->u.s._34); + temp.u.s._42 = (mat->u.s._12 * pMatrix->u.s._41) + (mat->u.s._22 * pMatrix->u.s._42) + + (mat->u.s._32 * pMatrix->u.s._43) + (mat->u.s._42 * pMatrix->u.s._44); + + temp.u.s._13 = (mat->u.s._13 * pMatrix->u.s._11) + (mat->u.s._23 * pMatrix->u.s._12) + + (mat->u.s._33 * pMatrix->u.s._13) + (mat->u.s._43 * pMatrix->u.s._14); + temp.u.s._23 = (mat->u.s._13 * pMatrix->u.s._21) + (mat->u.s._23 * pMatrix->u.s._22) + + (mat->u.s._33 * pMatrix->u.s._23) + (mat->u.s._43 * pMatrix->u.s._24); + temp.u.s._33 = (mat->u.s._13 * pMatrix->u.s._31) + (mat->u.s._23 * pMatrix->u.s._32) + + (mat->u.s._33 * pMatrix->u.s._33) + (mat->u.s._43 * pMatrix->u.s._34); + temp.u.s._43 = (mat->u.s._13 * pMatrix->u.s._41) + (mat->u.s._23 * pMatrix->u.s._42) + + (mat->u.s._33 * pMatrix->u.s._43) + (mat->u.s._43 * pMatrix->u.s._44); + + temp.u.s._14 = (mat->u.s._14 * pMatrix->u.s._11) + (mat->u.s._24 * pMatrix->u.s._12) + + (mat->u.s._34 * pMatrix->u.s._13) + (mat->u.s._44 * pMatrix->u.s._14); + temp.u.s._24 = (mat->u.s._14 * pMatrix->u.s._21) + (mat->u.s._24 * pMatrix->u.s._22) + + (mat->u.s._34 * pMatrix->u.s._23) + (mat->u.s._44 * pMatrix->u.s._24); + temp.u.s._34 = (mat->u.s._14 * pMatrix->u.s._31) + (mat->u.s._24 * pMatrix->u.s._32) + + (mat->u.s._34 * pMatrix->u.s._33) + (mat->u.s._44 * pMatrix->u.s._34); + temp.u.s._44 = (mat->u.s._14 * pMatrix->u.s._41) + (mat->u.s._24 * pMatrix->u.s._42) + + (mat->u.s._34 * pMatrix->u.s._43) + (mat->u.s._44 * pMatrix->u.s._44); /* Apply change via set transform - will reapply to eg. lights this way */ IWineD3DDeviceImpl_SetTransform(iface, State, &temp); @@ -1162,12 +1888,12 @@ * Get / Set Light * WARNING: This code relies on the fact that D3DLIGHT8 == D3DLIGHT9 *****/ -/* Note lights are real special cases. Although the device caps state only eg. 8 are supported, - you can reference any indexes you want as long as that number max are enabled at any - one point in time! Therefore since the indexes can be anything, we need a linked list of them. - However, this causes stateblock problems. When capturing the state block, I duplicate the list, - but when recording, just build a chain pretty much of commands to be replayed. */ - +/** Note lights are real special cases. Although the device caps state only eg. 8 are supported, +* you can reference any indexes you want as long as that number max are enabled at any +* one point in time! Therefore since the indexes can be anything, we need a linked list of them. +* However, this causes stateblock problems. When capturing the state block, I duplicate the list, +* but when recording, just build a chain pretty much of commands to be replayed. + *****************/ HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD Index, CONST WINED3DLIGHT* pLight) { float rho; PLIGHTINFOEL *object, *temp; @@ -1177,7 +1903,7 @@ /* If recording state block, just add to end of lights chain */ if (This->isRecordingState) { - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PLIGHTINFOEL)); + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,sizeof(PLIGHTINFOEL)); if (NULL == object) { return D3DERR_OUTOFVIDEOMEMORY; } @@ -1213,7 +1939,7 @@ object->OriginalIndex = Index; object->glIndex = -1; - /* Add it to the front of list with the idea that lights will be changed as needed + /* Add it to the front of list with the idea that lights will be changed as needed BUT after any lights currently assigned GL indexes */ insertAt = This->stateBlock->lights; prevPos = NULL; @@ -1285,13 +2011,13 @@ object->lightDirn[2] = pLight->Direction.z; object->lightDirn[3] = 1.0; - /* + /** * opengl-ish and d3d-ish spot lights use too different models for the * light "intensity" as a function of the angle towards the main light direction, * so we only can approximate very roughly. * however spot lights are rather rarely used in games (if ever used at all). * furthermore if still used, probably nobody pays attention to such details. - */ + ********************************/ if (pLight->Falloff == 0) { rho = 6.28f; } else { @@ -1301,7 +2027,7 @@ object->exponent = -0.3/log(cos(rho/2)); object->cutoff = pLight->Phi*90/M_PI; - /* FIXME: Range */ + /** FIXME: Range **/ break; default: @@ -1317,9 +2043,9 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetLight(IWineD3DDevice *iface, DWORD Index, WINED3DLIGHT* pLight) { PLIGHTINFOEL *lightInfo = NULL; - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p) : Idx(%ld), pLight(%p)\n", This, Index, pLight); - + /* Locate the light in the live lights */ lightInfo = This->stateBlock->lights; while (lightInfo != NULL && lightInfo->OriginalIndex != Index) lightInfo = lightInfo->next; @@ -1334,7 +2060,7 @@ } /***** - * Get / Set Light Enable + * Get / Set Light Enable * (Note for consistency, renamed d3dx function by adding the 'set' prefix) *****/ HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, DWORD Index, BOOL Enable) { @@ -1371,35 +2097,36 @@ /* Special case - enabling an undefined light creates one with a strict set of parms! */ if (lightInfo == NULL) { D3DLIGHT9 lightParms; - /* Warning - untested code :-) Prob safe to change fixme to a trace but - wait until someone confirms it seems to work! */ - TRACE("Light enabled requested but light not defined, so defining one!\n"); - lightParms.Type = D3DLIGHT_DIRECTIONAL; - lightParms.Diffuse.r = 1.0; - lightParms.Diffuse.g = 1.0; - lightParms.Diffuse.b = 1.0; - lightParms.Diffuse.a = 0.0; - lightParms.Specular.r = 0.0; - lightParms.Specular.g = 0.0; - lightParms.Specular.b = 0.0; - lightParms.Specular.a = 0.0; - lightParms.Ambient.r = 0.0; - lightParms.Ambient.g = 0.0; - lightParms.Ambient.b = 0.0; - lightParms.Ambient.a = 0.0; - lightParms.Position.x = 0.0; - lightParms.Position.y = 0.0; - lightParms.Position.z = 0.0; - lightParms.Direction.x = 0.0; - lightParms.Direction.y = 0.0; - lightParms.Direction.z = 1.0; - lightParms.Range = 0.0; - lightParms.Falloff = 0.0; + /** WARNING: - untested code :-) Prob safe to change fixme to a trace but + * wait until someone confirms it seems to work! + ***********************/ + FIXME("Light enabled requested but light not defined, so defining one!\n"); + lightParms.Type = D3DLIGHT_DIRECTIONAL; + lightParms.Diffuse.r = 1.0; + lightParms.Diffuse.g = 1.0; + lightParms.Diffuse.b = 1.0; + lightParms.Diffuse.a = 0.0; + lightParms.Specular.r = 0.0; + lightParms.Specular.g = 0.0; + lightParms.Specular.b = 0.0; + lightParms.Specular.a = 0.0; + lightParms.Ambient.r = 0.0; + lightParms.Ambient.g = 0.0; + lightParms.Ambient.b = 0.0; + lightParms.Ambient.a = 0.0; + lightParms.Position.x = 0.0; + lightParms.Position.y = 0.0; + lightParms.Position.z = 0.0; + lightParms.Direction.x = 0.0; + lightParms.Direction.y = 0.0; + lightParms.Direction.z = 1.0; + lightParms.Range = 0.0; + lightParms.Falloff = 0.0; lightParms.Attenuation0 = 0.0; lightParms.Attenuation1 = 0.0; lightParms.Attenuation2 = 0.0; - lightParms.Theta = 0.0; - lightParms.Phi = 0.0; + lightParms.Theta = 0.0; + lightParms.Phi = 0.0; IWineD3DDeviceImpl_SetLight(iface, Index, &lightParms); /* Search for it again! Should be fairly quick as near head of list */ @@ -1521,7 +2248,7 @@ gl lights, setup a new light */ } else if (pos->glIndex == -1) { - /* We reached the end of the allocated gl lights, so already + /* We reached the end of the allocated gl lights, so already know the index of the next one! */ glIndex = Index; lightInfo->glIndex = glIndex; @@ -1557,7 +2284,7 @@ glEnable(GL_LIGHT0 + glIndex); checkGLcall("glEnable GL_LIGHT0 new setup"); LEAVE_GL(); - + } } } @@ -1567,9 +2294,9 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetLightEnable(IWineD3DDevice *iface, DWORD Index,BOOL* pEnable) { PLIGHTINFOEL *lightInfo = NULL; - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p) : for idx(%ld)\n", This, Index); - + /* Locate the light in the live lights */ lightInfo = This->stateBlock->lights; while (lightInfo != NULL && lightInfo->OriginalIndex != Index) lightInfo = lightInfo->next; @@ -1617,10 +2344,10 @@ glPushMatrix(); glLoadMatrixf((float *) &This->stateBlock->transforms[D3DTS_VIEW].u.m[0][0]); - TRACE("Clipplane [%f,%f,%f,%f]\n", - This->updateStateBlock->clipplane[Index][0], + TRACE("Clipplane [%f,%f,%f,%f]\n", + This->updateStateBlock->clipplane[Index][0], This->updateStateBlock->clipplane[Index][1], - This->updateStateBlock->clipplane[Index][2], + This->updateStateBlock->clipplane[Index][2], This->updateStateBlock->clipplane[Index][3]); glClipPlane(GL_CLIP_PLANE0 + Index, This->updateStateBlock->clipplane[Index]); checkGLcall("glClipPlane"); @@ -1665,7 +2392,7 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetClipStatus(IWineD3DDevice *iface, WINED3DCLIPSTATUS* pClipStatus) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - FIXME("(%p) : stub\n", This); + FIXME("(%p) : stub\n", This); if (NULL == pClipStatus) { return D3DERR_INVALIDCALL; } @@ -1692,12 +2419,15 @@ } ENTER_GL(); - TRACE("(%p) : Diffuse (%f,%f,%f,%f)\n", This, pMaterial->Diffuse.r, pMaterial->Diffuse.g, pMaterial->Diffuse.b, pMaterial->Diffuse.a); - TRACE("(%p) : Ambient (%f,%f,%f,%f)\n", This, pMaterial->Ambient.r, pMaterial->Ambient.g, pMaterial->Ambient.b, pMaterial->Ambient.a); - TRACE("(%p) : Specular (%f,%f,%f,%f)\n", This, pMaterial->Specular.r, pMaterial->Specular.g, pMaterial->Specular.b, pMaterial->Specular.a); - TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g, pMaterial->Emissive.b, pMaterial->Emissive.a); + TRACE("(%p) : Diffuse (%f,%f,%f,%f)\n", This, pMaterial->Diffuse.r, pMaterial->Diffuse.g, + pMaterial->Diffuse.b, pMaterial->Diffuse.a); + TRACE("(%p) : Ambient (%f,%f,%f,%f)\n", This, pMaterial->Ambient.r, pMaterial->Ambient.g, + pMaterial->Ambient.b, pMaterial->Ambient.a); + TRACE("(%p) : Specular (%f,%f,%f,%f)\n", This, pMaterial->Specular.r, pMaterial->Specular.g, + pMaterial->Specular.b, pMaterial->Specular.a); + TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g, + pMaterial->Emissive.b, pMaterial->Emissive.a); TRACE("(%p) : Power (%f)\n", This, pMaterial->Power); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*) &This->updateStateBlock->material.Ambient); checkGLcall("glMaterialfv"); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*) &This->updateStateBlock->material.Diffuse); @@ -1716,7 +2446,6 @@ checkGLcall("glMaterialfv"); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, This->updateStateBlock->material.Power); checkGLcall("glMaterialf"); - LEAVE_GL(); return D3D_OK; } @@ -1724,10 +2453,14 @@ HRESULT WINAPI IWineD3DDeviceImpl_GetMaterial(IWineD3DDevice *iface, WINED3DMATERIAL* pMaterial) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; memcpy(pMaterial, &This->updateStateBlock->material, sizeof (WINED3DMATERIAL)); - TRACE("(%p) : Diffuse (%f,%f,%f,%f)\n", This, pMaterial->Diffuse.r, pMaterial->Diffuse.g, pMaterial->Diffuse.b, pMaterial->Diffuse.a); - TRACE("(%p) : Ambient (%f,%f,%f,%f)\n", This, pMaterial->Ambient.r, pMaterial->Ambient.g, pMaterial->Ambient.b, pMaterial->Ambient.a); - TRACE("(%p) : Specular (%f,%f,%f,%f)\n", This, pMaterial->Specular.r, pMaterial->Specular.g, pMaterial->Specular.b, pMaterial->Specular.a); - TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g, pMaterial->Emissive.b, pMaterial->Emissive.a); + TRACE("(%p) : Diffuse (%f,%f,%f,%f)\n", This, pMaterial->Diffuse.r, pMaterial->Diffuse.g, + pMaterial->Diffuse.b, pMaterial->Diffuse.a); + TRACE("(%p) : Ambient (%f,%f,%f,%f)\n", This, pMaterial->Ambient.r, pMaterial->Ambient.g, + pMaterial->Ambient.b, pMaterial->Ambient.a); + TRACE("(%p) : Specular (%f,%f,%f,%f)\n", This, pMaterial->Specular.r, pMaterial->Specular.g, + pMaterial->Specular.b, pMaterial->Specular.a); + TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g, + pMaterial->Emissive.b, pMaterial->Emissive.a); TRACE("(%p) : Power (%f)\n", This, pMaterial->Power); return D3D_OK; } @@ -1735,7 +2468,7 @@ /***** * Get / Set Indices *****/ -HRESULT WINAPI IWineD3DDeviceImpl_SetIndices(IWineD3DDevice *iface, IWineD3DIndexBuffer* pIndexData, +HRESULT WINAPI IWineD3DDeviceImpl_SetIndices(IWineD3DDevice *iface, IWineD3DIndexBuffer* pIndexData, UINT BaseVertexIndex) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DIndexBuffer *oldIdxs; @@ -1753,7 +2486,7 @@ TRACE("Recording... not performing anything\n"); return D3D_OK; } - + /* We shouldn't be reff counting! */ if (oldIdxs) IWineD3DIndexBuffer_Release(oldIdxs); if (pIndexData) IWineD3DIndexBuffer_AddRef(This->stateBlock->pIndexData); return D3D_OK; @@ -1763,11 +2496,16 @@ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; *ppIndexData = This->stateBlock->pIndexData; - - /* up ref count on ppindexdata */ - if (*ppIndexData) IWineD3DIndexBuffer_AddRef(*ppIndexData); - *pBaseVertexIndex = This->stateBlock->baseVertexIndex; + /* up ref count on ppindexdata */ + if (*ppIndexData) { + IWineD3DIndexBuffer_AddRef(*ppIndexData); + *pBaseVertexIndex = This->stateBlock->baseVertexIndex; + TRACE("(%p) index data set to %p + %u\n", This, ppIndexData, This->stateBlock->baseVertexIndex); + }else{ + TRACE("(%p) No index data set\n", This); + } + TRACE("Returning %p %d \n",*ppIndexData, *pBaseVertexIndex); return D3D_OK; } @@ -1796,9 +2534,26 @@ glDepthRange(pViewport->MinZ, pViewport->MaxZ); checkGLcall("glDepthRange"); /* Note: GL requires lower left, DirectX supplies upper left */ - /* TODO: replace usage of renderTarget with context management */ - glViewport(pViewport->X, (((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height - (pViewport->Y + pViewport->Height)), - pViewport->Width, pViewport->Height); +#if 1 /** TODO: replace IWineD3DSurfaceImpl * with IWineD3DSurface_GetDesc(or maybe just get height), + NOTE: moving over to context mamagement will fix things here **/ + glViewport(pViewport->X, (((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height - (pViewport->Y + pViewport->Height)), + pViewport->Width, pViewport->Height); +#else /* NOTE: code below is a nasty hack to demostrate a fix for the problem in fr-030_candytron_final */ + IWineD3DSurfaceImpl * backBuffer = (IWineD3DSurfaceImpl *)((IWineD3DSwapChainImpl *)This->swapchains[0])->backBuffer; + /** NOTE: This is a nasty hack, when we switch from an 'oversized' offscreen render target (in this case 1024x1024) + *to the back buffer we get nasty clipping problems fr-030_candytron_final is an example of the problem, + *and I think it happenes in pirates too everything should be solved by introducing an opengl context manager + *that knows a lot more about what context/drawable we're in and how to handel odd context/drawable problems. + **/ + if(This->renderTarget == backBuffer){ + glViewport(pViewport->X, (This->renderTarget->currentDesc.Height - (pViewport->Y + 1024)), + 1024, 1024); + } else{ + glViewport(pViewport->X, (This->renderTarget->currentDesc.Height - (pViewport->Y + pViewport->Height)), + pViewport->Width, pViewport->Height); + } + +#endif checkGLcall("glViewport"); LEAVE_GL(); @@ -1821,15 +2576,28 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRenderState(IWineD3DDevice *iface, D3DRENDERSTATETYPE State, DWORD Value) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - DWORD OldValue = This->stateBlock->renderState[State]; - + DWORD OldValue; /* Simple way of referring to either a DWORD or a 4 byte float */ union { DWORD d; float f; } tmpvalue; - + + union { + DWORD d; + float f; + } tmpvalue2; + TRACE("(%p)->state = %s(%d), value = %ld\n", This, debug_d3drenderstate(State), State, Value); + if(State > WINEHIGHEST_RENDER_STATE ) { + FIXME("(%p) State %s(%d) out of range\n", This, debug_d3drenderstate(State), State); + return D3DERR_INVALIDCALL; + } + + OldValue = This->stateBlock->renderState[State]; + TRACE("(%p)->state = %s(%d), value = %ld OldValue %ld %p\n", This, debug_d3drenderstate(State), State, + Value, OldValue, This->updateStateBlock); + This->updateStateBlock->changed.renderState[State] = TRUE; This->updateStateBlock->set.renderState[State] = TRUE; This->updateStateBlock->renderState[State] = Value; @@ -1887,7 +2655,7 @@ case WINED3DRS_CULLMODE : /* If we are culling "back faces with clockwise vertices" then - set front faces to be counter clockwise and enable culling + set front faces to be counter clockwise and enable culling of back faces */ switch ((D3DCULL) Value) { case D3DCULL_NONE: @@ -1910,7 +2678,7 @@ glEnable(GL_CULL_FACE); checkGLcall("glEnable GL_CULL_FACE"); if (This->renderUpsideDown) { - glFrontFace(GL_CCW); + glFrontFace(GL_CCW); checkGLcall("glFrontFace GL_CCW"); } else { glFrontFace(GL_CW); @@ -1997,7 +2765,7 @@ case WINED3DRS_ALPHABLENDENABLE : if (Value) { - glEnable(GL_BLEND); + glEnable(GL_BLEND); checkGLcall("glEnable GL_BLEND"); } else { glDisable(GL_BLEND); @@ -2096,7 +2864,7 @@ /* Ensure we only do the changed clip planes */ DWORD enable = 0xFFFFFFFF; DWORD disable = 0x00000000; - + /* If enabling / disabling all */ if (State == WINED3DRS_CLIPPING) { if (Value) { @@ -2110,14 +2878,14 @@ enable = Value & ~OldValue; disable = ~Value & OldValue; } - + if (enable & D3DCLIPPLANE0) { glEnable(GL_CLIP_PLANE0); checkGLcall("glEnable(clip plane 0)"); } if (enable & D3DCLIPPLANE1) { glEnable(GL_CLIP_PLANE1); checkGLcall("glEnable(clip plane 1)"); } if (enable & D3DCLIPPLANE2) { glEnable(GL_CLIP_PLANE2); checkGLcall("glEnable(clip plane 2)"); } if (enable & D3DCLIPPLANE3) { glEnable(GL_CLIP_PLANE3); checkGLcall("glEnable(clip plane 3)"); } if (enable & D3DCLIPPLANE4) { glEnable(GL_CLIP_PLANE4); checkGLcall("glEnable(clip plane 4)"); } if (enable & D3DCLIPPLANE5) { glEnable(GL_CLIP_PLANE5); checkGLcall("glEnable(clip plane 5)"); } - + if (disable & D3DCLIPPLANE0) { glDisable(GL_CLIP_PLANE0); checkGLcall("glDisable(clip plane 0)"); } if (disable & D3DCLIPPLANE1) { glDisable(GL_CLIP_PLANE1); checkGLcall("glDisable(clip plane 1)"); } if (disable & D3DCLIPPLANE2) { glDisable(GL_CLIP_PLANE2); checkGLcall("glDisable(clip plane 2)"); } @@ -2159,7 +2927,7 @@ { unsigned int i; - /* Note the texture color applies to all textures whereas + /* Note the texture color applies to all textures whereas GL_TEXTURE_ENV_COLOR applies to active only */ float col[4]; D3DCOLORTOGLFLOAT4(Value, col); @@ -2285,9 +3053,9 @@ case WINED3DRS_STENCILFAIL : { - GLenum fail ; - GLenum zpass ; - GLenum zfail ; + GLenum fail ; + GLenum zpass ; + GLenum zfail ; fail = StencilOp(Value); glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &zpass); @@ -2302,9 +3070,9 @@ break; case WINED3DRS_STENCILZFAIL : { - GLenum fail ; - GLenum zpass ; - GLenum zfail ; + GLenum fail ; + GLenum zpass ; + GLenum zfail ; glGetIntegerv(GL_STENCIL_FAIL, &fail); checkGLcall("glGetIntegerv(GL_STENCIL_FAIL, &fail);"); @@ -2319,9 +3087,9 @@ break; case WINED3DRS_STENCILPASS : { - GLenum fail ; - GLenum zpass ; - GLenum zfail ; + GLenum fail ; + GLenum zpass ; + GLenum zfail ; glGetIntegerv(GL_STENCIL_FAIL, &fail); checkGLcall("glGetIntegerv(GL_STENCIL_FAIL, &fail);"); @@ -2345,7 +3113,7 @@ case WINED3DRS_FOGENABLE : { - if (Value/* && This->stateBlock->renderState[WINED3DRS_FOGTABLEMODE] != D3DFOG_NONE*/) { + if (Value/* && This->stateBlock->renderState[WINED3DRS_FOGTABLEMODE] != D3DFOG_NONE */) { glEnable(GL_FOG); checkGLcall("glEnable GL_FOG"); } else { @@ -2376,13 +3144,13 @@ break; case WINED3DRS_FOGTABLEMODE : - { + { glHint(GL_FOG_HINT, GL_NICEST); switch (Value) { - case D3DFOG_NONE: /* I don't know what to do here */ checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break; - case D3DFOG_EXP: glFogi(GL_FOG_MODE, GL_EXP); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break; - case D3DFOG_EXP2: glFogi(GL_FOG_MODE, GL_EXP2); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2"); break; - case D3DFOG_LINEAR: glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR"); break; + case D3DFOG_NONE: /* I don't know what to do here */ checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break; + case D3DFOG_EXP: glFogi(GL_FOG_MODE, GL_EXP); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break; + case D3DFOG_EXP2: glFogi(GL_FOG_MODE, GL_EXP2); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2"); break; + case D3DFOG_LINEAR: glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR"); break; default: FIXME("Unsupported Value(%lu) for WINED3DRS_FOGTABLEMODE!\n", Value); } @@ -2393,13 +3161,13 @@ break; case WINED3DRS_FOGVERTEXMODE : - { + { glHint(GL_FOG_HINT, GL_FASTEST); switch (Value) { - case D3DFOG_NONE: /* I don't know what to do here */ checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break; - case D3DFOG_EXP: glFogi(GL_FOG_MODE, GL_EXP); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break; - case D3DFOG_EXP2: glFogi(GL_FOG_MODE, GL_EXP2); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2"); break; - case D3DFOG_LINEAR: glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR"); break; + case D3DFOG_NONE: /* I don't know what to do here */ checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break; + case D3DFOG_EXP: glFogi(GL_FOG_MODE, GL_EXP); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break; + case D3DFOG_EXP2: glFogi(GL_FOG_MODE, GL_EXP2); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2"); break; + case D3DFOG_LINEAR: glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR"); break; default: FIXME("Unsupported Value(%lu) for WINED3DRS_FOGTABLEMODE!\n", Value); } @@ -2452,7 +3220,7 @@ case WINED3DRS_INDEXEDVERTEXBLENDENABLE : { - TRACE("Indexed Vertex Blend Enable to %ul\n", (BOOL) Value); + TRACE("Stub: Indexed Vertex Blend Enable to %ul\n", (BOOL) Value); } break; @@ -2498,9 +3266,16 @@ if (This->tracking_color != DISABLED_TRACKING) This->tracking_color = NEEDS_DISABLE; } } - break; - - case WINED3DRS_LINEPATTERN : + break; + case WINED3DRS_SCISSORTESTENABLE: + if(Value !=0 ){/* ignore default of off */ + glDisable(GL_SCISSOR_TEST); + }else{ + glEnable(GL_SCISSOR_TEST); + } + /* All this stuff is D3D* only, so there needs to be a set of flags for WineD3D that's inclusive */ +#if 0 + case WINED3DRS_LINEPATTERN: { union { DWORD d; @@ -2521,13 +3296,17 @@ } } break; +#endif + case WINED3DRS_DEPTHBIAS : + case WINED3DRS_SLOPESCALEDEPTHBIAS : - case WINED3DRS_ZBIAS : - { - if (Value) { - tmpvalue.d = Value; - TRACE("ZBias value %f\n", tmpvalue.f); - glPolygonOffset(0, -tmpvalue.f); + tmpvalue.d = This->stateBlock->renderState[WINED3DRS_SLOPESCALEDEPTHBIAS]; + tmpvalue2.d = This->stateBlock->renderState[WINED3DRS_DEPTHBIAS]; + + { + if (tmpvalue.f) { + TRACE("DEPTHBIAS value %f %f\n",tmpvalue.f, tmpvalue2.f); + glPolygonOffset(-tmpvalue.f, -tmpvalue2.f); checkGLcall("glPolygonOffset(0, -Value)"); glEnable(GL_POLYGON_OFFSET_FILL); checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL);"); @@ -2558,12 +3337,15 @@ case WINED3DRS_POINTSIZE : tmpvalue.d = Value; - TRACE("Set point size to %f\n", tmpvalue.f); + /* FIXME: check that pointSize isn't outside glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize ); or -ve */ + VTRACE(("glPointSize: %f\n", tmpvalue.f)); glPointSize(tmpvalue.f); checkGLcall("glPointSize(...);"); break; case WINED3DRS_POINTSIZE_MIN : + /* TODO: Arb + GL_EXTCALL(glPointParameterfARB)( GL_POINT_SIZE_MIN_ARB, 1.0f );*/ if (GL_SUPPORT(EXT_POINT_PARAMETERS)) { tmpvalue.d = Value; GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MIN_EXT, tmpvalue.f); @@ -2574,6 +3356,10 @@ break; case WINED3DRS_POINTSIZE_MAX : + /* TODO: Arb + GL_EXTCALL(glPointParameterfARB)( GL_POINT_FADE_THRESHOLD_SIZE_ARB, 60.0f ); + GL_EXTCALL(glPointParameterfARB)( GL_POINT_SIZE_MAX_ARB, 60.0f ); + */ if (GL_SUPPORT(EXT_POINT_PARAMETERS)) { tmpvalue.d = Value; GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MAX_EXT, tmpvalue.f); @@ -2588,41 +3374,44 @@ case WINED3DRS_POINTSCALE_C : case WINED3DRS_POINTSCALEENABLE : { - /* If enabled, supply the parameters, otherwise fall back to defaults */ if (This->stateBlock->renderState[WINED3DRS_POINTSCALEENABLE]) { GLfloat att[3] = {1.0f, 0.0f, 0.0f}; - att[0] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_A]); - att[1] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_B]); - att[2] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_C]); + /* This scaling seems to be ok, the z's not correct though */ + att[0] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_A])/ This->stateBlock->viewport.Width; + att[1] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_B])/ This->stateBlock->viewport.Height; + att[2] = *((float*)&This->stateBlock->renderState[WINED3DRS_POINTSCALE_C]) * 2.0f / + (This->stateBlock->viewport.Width * This->stateBlock->viewport.Height); + if (GL_SUPPORT(EXT_POINT_PARAMETERS)) { - GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att); - checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...);"); + TRACE("glPointParameterfvARB %f %f %f\n",att[0],att[1],att[2]); + GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att); + checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...);"); } else { - TRACE("WINED3DRS_POINTSCALEENABLE not supported on this opengl\n"); + TRACE("WINED3DRS_POINTSCALEENABLE not supported on this opengl\n"); } } else { GLfloat att[3] = {1.0f, 0.0f, 0.0f}; if (GL_SUPPORT(EXT_POINT_PARAMETERS)) { - GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att); - checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...);"); + GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att); + checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...);"); } else { TRACE("WINED3DRS_POINTSCALEENABLE not supported, but not on either\n"); } } - break; } + break; case WINED3DRS_COLORWRITEENABLE : { - TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n", + TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n", Value & D3DCOLORWRITEENABLE_RED ? 1 : 0, Value & D3DCOLORWRITEENABLE_GREEN ? 1 : 0, Value & D3DCOLORWRITEENABLE_BLUE ? 1 : 0, - Value & D3DCOLORWRITEENABLE_ALPHA ? 1 : 0); - glColorMask(Value & D3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE, + Value & D3DCOLORWRITEENABLE_ALPHA ? 1 : 0); + glColorMask(Value & D3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE, Value & D3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE, - Value & D3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE, + Value & D3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE, Value & D3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE); checkGLcall("glColorMask(...)"); } @@ -2631,7 +3420,7 @@ case WINED3DRS_LOCALVIEWER : { GLint state = (Value) ? 1 : 0; - TRACE("Local Viewer Enable to %ul\n", (BOOL) Value); + TRACE("Local Viewer Enable to %ul\n", (BOOL) Value); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, state); } break; @@ -2639,9 +3428,9 @@ case WINED3DRS_LASTPIXEL : { if (Value) { - TRACE("Last Pixel Drawing Enabled\n"); + TRACE("Last Pixel Drawing Enabled\n"); } else { - FIXME("Last Pixel Drawing Disabled, not handled yet\n"); + TRACE("Last Pixel Drawing Disabled, not handled yet\n"); } } break; @@ -2649,22 +3438,67 @@ case WINED3DRS_SOFTWAREVERTEXPROCESSING : { if (Value) { - TRACE("Software Processing Enabled\n"); + TRACE("Software Processing Enabled\n"); } else { - TRACE("Software Processing Disabled\n"); + TRACE("Software Processing Disabled\n"); } } break; /** not supported */ - case WINED3DRS_ZVISIBLE : + case WINED3DRS_ZVISIBLE : + case WINED3DRS_EDGEANTIALIAS : { LEAVE_GL(); return D3DERR_INVALIDCALL; } - /* Unhandled yet...! */ - case WINED3DRS_EDGEANTIALIAS : + + case WINED3DRS_POINTSPRITEENABLE : + /* http://data.plok.be/ExNihilo/pages/Tutorialpointsprite.htm + http://oss.sgi.com/projects/ogl-sample/registry/ARB/point_sprite.txt + */ + /** TODO: + * if (GL_SUPPORT(GL_POINT_SPRITE_ARB)) { + **/ + if(Value != FALSE){ +#if 1 + /* Doesn't work with GL_POINT_SMOOTH on on my ATI 9600, but then ATI drivers are buggered! */ + glDisable(GL_POINT_SMOOTH); +#endif + + /* Centre the texture on the vertex */ + VTRACE("glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)\n"); + glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE); + + VTRACE("glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)\n"); + glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE); + checkGLcall("glTexEnvf(...)"); + VTRACE("glEnable( GL_POINT_SPRITE_ARB )\n"); + glEnable( GL_POINT_SPRITE_ARB ); + checkGLcall("glEnable(...)"); + }else{ + VTRACE("glDisable( GL_POINT_SPRITE_ARB )\n"); + glDisable( GL_POINT_SPRITE_ARB ); + checkGLcall("glEnable(...)"); + } + break; + case WINED3DRS_MULTISAMPLEANTIALIAS : + /* implementation at http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=46 + GL_ARB_MULTISAMPLE + */ + if(Value != 0){ + FIXME("(%p) multisample antialias not yet supported\n",This); + } + break; + case WINED3DRS_DEBUGMONITORTOKEN : + if(Value){ + This->debug=TRUE; + FIXME("(%p) Debug streams not yet supported\n",This); + }else{ + This->debug=FALSE; + } + break; case WINED3DRS_WRAP0 : case WINED3DRS_WRAP1 : case WINED3DRS_WRAP2 : @@ -2673,23 +3507,27 @@ case WINED3DRS_WRAP5 : case WINED3DRS_WRAP6 : case WINED3DRS_WRAP7 : - case WINED3DRS_POINTSPRITEENABLE : - case WINED3DRS_MULTISAMPLEANTIALIAS : + /** + http://www.cosc.brocku.ca/Offerings/3P98/course/lectures/texture/ + http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/programmingguide/FixedFunction/Textures/texturewrapping.asp + http://www.gamedev.net/reference/programming/features/rendererdll3/page2.asp + Descussion that ways to turn on WRAPing to solve an opengl conversion problem. + http://www.flipcode.org/cgi-bin/fcmsg.cgi?thread_show=10248 + */ + TRACE("(%p)->(%d,%ld) Texture wraping not yet supported\n",This, State, Value); + break; case WINED3DRS_MULTISAMPLEMASK : case WINED3DRS_PATCHEDGESTYLE : case WINED3DRS_PATCHSEGMENTS : - case WINED3DRS_DEBUGMONITORTOKEN : case WINED3DRS_POSITIONORDER : case WINED3DRS_NORMALORDER : - /*Put back later: FIXME("(%p)->(%d,%ld) not handled yet\n", This, State, Value); */ FIXME("(%p)->(%d,%ld) not handled yet\n", This, State, Value); break; default: - FIXME("(%p)->(%d,%ld) unrecognized\n", This, State, Value); + TRACE("(%p)->(%d,%ld) unrecognized\n", This, State, Value); } LEAVE_GL(); - return D3D_OK; } @@ -2700,130 +3538,435 @@ return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_SetSamplerState(IWineD3DDevice *iface, DWORD Sampler, WINED3DSAMPLERSTATETYPE Type, DWORD Value){ - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - FIXME("(%p) : stub\n", This); - return D3D_OK; -} - -HRESULT WINAPI IWineD3DDeviceImpl_GetSamplerState(IWineD3DDevice *iface, DWORD Sampler, WINED3DSAMPLERSTATETYPE Type, DWORD* Value){ +HRESULT WINAPI IWineD3DDeviceImpl_SetSamplerState(IWineD3DDevice *iface, DWORD Sampler, WINED3DSAMPLERSTATETYPE Type, DWORD Value){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - FIXME("(%p) : stub\n", This); - return D3D_OK; - -} - -HRESULT WINAPI IWineD3DDeviceImpl_SetScissorRect(IWineD3DDevice *iface, CONST RECT* pRect){ - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - ENTER_GL(); + /** + * SetSampler is designed to allow fore more than the standard upto 8 textures? + * and Geforce has stopped suporting more than 6 standards texture in openGL, + * So I have to use ARB for Gforce. (maybe if the sampler > 4 then use ARB?) + * + * http://developer.nvidia.com/object/General_FAQ.html#t6 + * + * There are two new settings for GForce + * the sampler one: + * GL_MAX_TEXTURE_IMAGE_UNITS_ARB + * and the texture one: + * GL_MAX_TEXTURE_COORDS_ARB. + * Ok GForce say it's ok to use glTexParameter/glGetTexParameter(...). + ******************/ + + /** FIXME: Somethis isn't working properly, textures states don't seem to be being applied, + * or there being cleared down oddly, or GLACTIVETEXTURE isn't working properly. + *****************/ + union { + float f; + DWORD d; + } tmpvalue; + GLint maxSamplers; - /** FIXME: Windows uses a top,left origin openGL uses a bottom Right? **/ - TRACE("(%p)Setting new Scissor Rect to %ld:%ld-%ld:%ld\n", This, pRect->left, pRect->top, pRect->right, pRect->bottom); - glScissor(pRect->left, pRect->top, pRect->right - pRect->left, pRect->bottom - pRect->top); - LEAVE_GL(); - return D3D_OK; -} - -HRESULT WINAPI IWineD3DDeviceImpl_GetScissorRect(IWineD3DDevice *iface, RECT* pRect){ - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - GLint scissorBox[4]; + TRACE("(%p) Sampler(%ld), Type(%d) Value(%ld)\n",This, Sampler ,Type, Value); - ENTER_GL(); - /** FIXME: Windows uses a top,left origin openGL uses a bottom Right? **/ - glGetIntegerv(GL_SCISSOR_BOX, scissorBox); - pRect->left = scissorBox[1]; - pRect->top = scissorBox[2]; - pRect->right = scissorBox[1] + scissorBox[3]; - pRect->bottom = scissorBox[2] + scissorBox[4]; - TRACE("(%p)Returning a Scissor Rect of %ld:%ld-%ld:%ld\n", This, pRect->left, pRect->top, pRect->right, pRect->bottom); - LEAVE_GL(); - return D3D_OK; -} +#if 0 + if supported GL_MAX_TEXTURE_IMAGE_UNITS_ARB + glenable(GL_ARB_fragment_program) +#endif + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB,&maxSamplers); -HRESULT WINAPI IWineD3DDeviceImpl_SetVertexDeclaration(IWineD3DDevice* iface, IWineD3DVertexDeclaration* pDecl) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - - TRACE("(%p) : pDecl=%p\n", This, pDecl); + if (Sampler < maxSamplers && GL_SUPPORT(ARB_MULTITEXTURE)) { + maxSamplers = GL_LIMITS(textures); + } else{ + maxSamplers = 1; + } - IWineD3DVertexDeclaration_AddRef(pDecl); - if (NULL != This->updateStateBlock->vertexDecl) { - IWineD3DVertexDeclaration_Release(This->updateStateBlock->vertexDecl); + if(Sampler > maxSamplers || Sampler < 0 || Type > HIGHEST_SAMPLER_STATE || Type < 0){ + FIXME("out of range %d %d sampler %ld type %u\n", maxSamplers, HIGHEST_SAMPLER_STATE, Sampler, Type); + return D3D_OK; } - This->updateStateBlock->vertexDecl = pDecl; - This->updateStateBlock->changed.vertexDecl = TRUE; - This->updateStateBlock->set.vertexDecl = TRUE; - return D3D_OK; -} -HRESULT WINAPI IWineD3DDeviceImpl_GetVertexDeclaration(IWineD3DDevice* iface, IWineD3DVertexDeclaration** ppDecl) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + This->updateStateBlock->changed.samplerState[Sampler][Type] = TRUE; + This->updateStateBlock->set.samplerState[Sampler][Type] = TRUE; - TRACE("(%p) : ppDecl=%p\n", This, ppDecl); - - *ppDecl = This->updateStateBlock->vertexDecl; - if (NULL != *ppDecl) IWineD3DVertexDeclaration_AddRef(*ppDecl); - return D3D_OK; -} +#if 0 /* We need to do something so that we only set stateblocks when they change + this may meed keeping 'another' stateblock that holds the 'real' state + (but shouldn't ->stateblock already do that? + */ -HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface, IWineD3DVertexShader* pShader){ - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + if(This->updateStateBlock->samplerState[Sampler][Type] == Value &&( Type == WINED3DSAMP_MINFILTER || Type == D3DSAMP_MIPFILTER)){ - static BOOL showFixmes = TRUE; - - This->updateStateBlock->vertexShader = pShader; - This->updateStateBlock->changed.vertexShader = TRUE; - This->updateStateBlock->set.vertexShader = TRUE; - - if(pShader == NULL){ - /* clear down the shader */ - TRACE("Clear down the shader\n"); - }else{ - if(showFixmes){ - FIXME("(%p) : stub pShader(%p)\n", This, pShader); - showFixmes = FALSE; - } + FIXME("(%p) no %d %d change of state %d \n",This, Sampler, Type, Value); + return D3D_OK; } +#endif + TRACE("Setting sampler %ld %d to %ld \n", Sampler, Type, Value); + This->updateStateBlock->samplerState[Sampler][Type] = Value; - return D3D_OK; - - /** FIXME: refernece counting? **/ - if (pShader == NULL) { /* only valid with non FVF shaders */ - TRACE_(d3d_shader)("(%p) : FVF Shader, pShader=%p\n", This, pShader); - This->updateStateBlock->vertexShader = NULL; - } else { - TRACE_(d3d_shader)("(%p) : Created shader, pShader=%p\n", This, pShader); - This->updateStateBlock->vertexShader = pShader; - } - - This->updateStateBlock->changed.vertexShader = TRUE; - This->updateStateBlock->set.vertexShader = TRUE; - /* Handle recording of state blocks */ if (This->isRecordingState) { - TRACE("Recording... not performing anything\n"); - return D3D_OK; + TRACE("Recording... not performing anything\n"); + return D3D_OK; } - /** - * TODO: merge HAL shaders context switching from prototype - */ - return D3D_OK; - + /* In addition, IDirect3DDevice9::SetSamplerState will now be used for filtering, tiling, + clamping, MIPLOD, etc. This will work for up to 16 samplers. + is this just GL_TEXTURE_2D or is it GL_TEXTURE_1D and GL_TEXTURE_3D as well? + */ + ENTER_GL(); + + VTRACE(("Activating appropriate texture state %ld\n", Sampler)); + if (GL_SUPPORT(ARB_MULTITEXTURE)) { + GLACTIVETEXTURE(Sampler); + } else if (Sampler > 0) { + FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n"); + } + + switch (Type) { + + case WINED3DSAMP_ADDRESSU : /* 1 */ + case WINED3DSAMP_ADDRESSV : /* 2 */ + case WINED3DSAMP_ADDRESSW : /* 3 */ + { + GLint wrapParm = GL_REPEAT; + switch (Value) { + case D3DTADDRESS_WRAP: wrapParm = GL_REPEAT; break; + case D3DTADDRESS_CLAMP: wrapParm = GL_CLAMP_TO_EDGE; break; + case D3DTADDRESS_BORDER: + { + if (GL_SUPPORT(ARB_TEXTURE_BORDER_CLAMP)) { + wrapParm = GL_CLAMP_TO_BORDER_ARB; + } else { + /* FIXME: Not right, but better */ + TRACE("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type); + wrapParm = GL_REPEAT; + } + } + break; + case D3DTADDRESS_MIRROR: + { + if (GL_SUPPORT(ARB_TEXTURE_MIRRORED_REPEAT)) { + wrapParm = GL_MIRRORED_REPEAT_ARB; + } else { + /* Unsupported in OpenGL pre-1.4 */ + TRACE("Unsupported D3DTADDRESS_MIRROR (needs GL_ARB_texture_mirrored_repeat) state %d\n", Type); + wrapParm = GL_REPEAT; + } + } + break; + case D3DTADDRESS_MIRRORONCE: + { + if (GL_SUPPORT(ATI_TEXTURE_MIRROR_ONCE)) { + wrapParm = GL_MIRROR_CLAMP_TO_EDGE_ATI; + } else { + TRACE("Unsupported D3DTADDRESS_MIRRORONCE (needs GL_ATI_texture_mirror_once) state %d\n", Type); + wrapParm = GL_REPEAT; + } + } + break; + + default: + /* This is for the whole context, not just the sampler, + so we should warn if two states are baing set for any given scene */ + if(Type!=0) + TRACE("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type); + wrapParm = GL_REPEAT; + } + switch (Type) { + case WINED3DSAMP_ADDRESSU: + TRACE("Setting WRAP_S for %ld to %d \n", Sampler, wrapParm); + glTexParameteri(This->stateBlock->textureDimensions[Sampler], GL_TEXTURE_WRAP_S, wrapParm); + checkGLcall("glTexParameteri(..., GL_TEXTURE_WRAP_S, wrapParm)"); + break; + case WINED3DSAMP_ADDRESSV: + TRACE("Setting WRAP_T for %ld to %d\n", Sampler, wrapParm); + glTexParameteri(This->stateBlock->textureDimensions[Sampler], GL_TEXTURE_WRAP_T, wrapParm); + checkGLcall("glTexParameteri(..., GL_TEXTURE_WRAP_T, wrapParm)"); + break; + + case WINED3DSAMP_ADDRESSW: + TRACE("Setting WRAP_R for %ld to %d\n", Sampler, wrapParm); + glTexParameteri(This->stateBlock->textureDimensions[Sampler], GL_TEXTURE_WRAP_R, wrapParm); + checkGLcall("glTexParameteri(..., GL_TEXTURE_WRAP_R, wrapParm)"); + break; + default: /* nop */ + break; /** stupic compilator */ + } + } + break; + + case WINED3DSAMP_BORDERCOLOR : /* 4 */ + { + float col[4]; + D3DCOLORTOGLFLOAT4(Value, col); + TRACE("Setting border color for %ld to %lx\n", Sampler, Value); + glTexParameterfv(This->stateBlock->textureDimensions[Sampler], GL_TEXTURE_BORDER_COLOR, &col[0]); + checkGLcall("glTexParameteri(..., GL_TEXTURE_BORDER_COLOR, ...)"); + } + break; + + case WINED3DSAMP_MAGFILTER : /* 5 */ + { + DWORD ValueMAG = This->stateBlock->samplerState[Sampler][WINED3DSAMP_MAGFILTER]; + GLint realVal = GL_NEAREST; + + if (ValueMAG == D3DTEXF_POINT) { + realVal = GL_NEAREST; + } else if (ValueMAG == D3DTEXF_LINEAR) { + realVal = GL_LINEAR; + } else if (ValueMAG == D3DTEXF_ANISOTROPIC) { + if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { + realVal = GL_LINEAR; + } else { + FIXME("Trying to use ANISOTROPIC_FILTERING for D3DTSS_MAGFILTER. But not supported by current OpenGL driver\n"); + realVal = GL_NEAREST; + } + } else { + FIXME("Unhandled D3DTSS_MAGFILTER value of %ld\n", ValueMAG); + realVal = GL_NEAREST; + } + TRACE("ValueMAG=%ld setting MAGFILTER to %x\n", ValueMAG, realVal); + glTexParameteri(This->stateBlock->textureDimensions[Sampler], GL_TEXTURE_MAG_FILTER, realVal); + checkGLcall("glTexParameter GL_TEXTURE_MAG_FILTER, ..."); + /** + * if we juste choose to use ANISOTROPIC filtering, refresh openGL state + */ + if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC) && D3DTEXF_ANISOTROPIC == ValueMAG) { + glTexParameteri(This->stateBlock->textureDimensions[Sampler], + GL_TEXTURE_MAX_ANISOTROPY_EXT, + This->stateBlock->samplerState[Sampler][WINED3DSAMP_MAXANISOTROPY]); + checkGLcall("glTexParameter GL_TEXTURE_MAX_ANISOTROPY_EXT, ..."); + } + } + break; + + case WINED3DSAMP_MINFILTER: /* 6 */ + case WINED3DSAMP_MIPFILTER: /* 7 */ + { + DWORD ValueMIN = This->stateBlock->samplerState[Sampler][WINED3DSAMP_MINFILTER]; + DWORD ValueMIP = This->stateBlock->samplerState[Sampler][WINED3DSAMP_MIPFILTER]; + GLint realVal = GL_LINEAR; + + if (ValueMIN == D3DTEXF_NONE) { + /* Doesn't really make sense - Windows just seems to disable + mipmapping when this occurs */ + FIXME("Odd - minfilter of none, just disabling mipmaps\n"); + realVal = GL_LINEAR; + } else if (ValueMIN == D3DTEXF_POINT) { + /* GL_NEAREST_* */ + if (ValueMIP == D3DTEXF_NONE) { + realVal = GL_NEAREST; + } else if (ValueMIP == D3DTEXF_POINT) { + realVal = GL_NEAREST_MIPMAP_NEAREST; + } else if (ValueMIP == D3DTEXF_LINEAR) { + realVal = GL_NEAREST_MIPMAP_LINEAR; + } else { + FIXME("Unhandled D3DTSS_MIPFILTER value of %ld\n", ValueMIP); + realVal = GL_NEAREST; + } + } else if (ValueMIN == D3DTEXF_LINEAR) { + /* GL_LINEAR_* */ + if (ValueMIP == D3DTEXF_NONE) { + realVal = GL_LINEAR; + } else if (ValueMIP == D3DTEXF_POINT) { + realVal = GL_LINEAR_MIPMAP_NEAREST; + } else if (ValueMIP == D3DTEXF_LINEAR) { + realVal = GL_LINEAR_MIPMAP_LINEAR; + } else { + FIXME("Unhandled D3DTSS_MIPFILTER value of %ld\n", ValueMIP); + realVal = GL_LINEAR; + } + } else if (ValueMIN == D3DTEXF_ANISOTROPIC) { + if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { + if (ValueMIP == D3DTEXF_NONE) { + realVal = GL_LINEAR_MIPMAP_LINEAR; + } else if (ValueMIP == D3DTEXF_POINT) { + realVal = GL_LINEAR_MIPMAP_NEAREST; + } else if (ValueMIP == D3DTEXF_LINEAR) { + realVal = GL_LINEAR_MIPMAP_LINEAR; + } else { + FIXME("Unhandled D3DTSS_MIPFILTER value of %ld\n", ValueMIP); + realVal = GL_LINEAR; + } + } else { + WARN("Trying to use ANISOTROPIC_FILTERING for D3DTSS_MINFILTER. But not supported by OpenGL driver\n"); + realVal = GL_LINEAR; + } + } else { + FIXME("Unhandled D3DTSS_MINFILTER value of %ld\n", ValueMIN); + realVal = GL_LINEAR_MIPMAP_LINEAR; + } + + TRACE("ValueMIN=%ld, ValueMIP=%ld, setting MINFILTER to %x\n", ValueMIN, ValueMIP, realVal); + glTexParameteri(This->stateBlock->textureDimensions[Sampler], GL_TEXTURE_MIN_FILTER, realVal); + checkGLcall("glTexParameter GL_TEXTURE_MIN_FILTER, ..."); + /** + * if we just choose to use ANISOTROPIC filtering, refresh openGL state + */ + if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC) && D3DTEXF_ANISOTROPIC == ValueMIN) { + glTexParameteri(This->stateBlock->textureDimensions[Sampler], GL_TEXTURE_MAX_ANISOTROPY_EXT, + This->stateBlock->samplerState[Sampler][WINED3DSAMP_MAXANISOTROPY]); + checkGLcall("glTexParameter GL_TEXTURE_MAX_ANISOTROPY_EXT, ..."); + } + } + break; + + case WINED3DSAMP_MIPMAPLODBIAS : /* 8 */ + { + if (GL_SUPPORT(EXT_TEXTURE_LOD_BIAS)) { + tmpvalue.d = Value; + glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, + GL_TEXTURE_LOD_BIAS_EXT, + tmpvalue.f); + checkGLcall("glTexEnvi GL_TEXTURE_LOD_BIAS_EXT ..."); + } + } + break; + + case WINED3DSAMP_MAXMIPLEVEL : /* 9 */ + { + /** + * Not really the same, but the more apprioprate than nothing + */ + glTexParameteri(This->stateBlock->textureDimensions[Sampler], + GL_TEXTURE_BASE_LEVEL, + This->stateBlock->samplerState[Sampler][WINED3DSAMP_MAXMIPLEVEL]); + checkGLcall("glTexParameteri GL_TEXTURE_BASE_LEVEL ..."); + } + break; + + case WINED3DSAMP_MAXANISOTROPY : /* 10 */ + { + if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { + glTexParameteri(This->stateBlock->textureDimensions[Sampler], + GL_TEXTURE_MAX_ANISOTROPY_EXT, + This->stateBlock->samplerState[Sampler][WINED3DSAMP_MAXANISOTROPY]); + checkGLcall("glTexParameteri GL_TEXTURE_MAX_ANISOTROPY_EXT ..."); + } + } + break; + case WINED3DSAMP_SRGBTEXTURE : /* 11 */ + /* Per texture gamma correction, default 0 */ + case WINED3DSAMP_ELEMENTINDEX : /* 12 */ + /* When a multi-element textures is used this indicates the element, (what's a multielement texture?) */ + case WINED3DSAMP_DMAPOFFSET : /* 13 */ + /* Value of a precompiled displacement map used by the tesselator, default 0 */ + default: + + TRACE("invalid sampler setting, Sampler=%ld, Type=%d, Value =%ld\n", Sampler, Type, Value); + }; + LEAVE_GL(); + return D3D_OK; + +} + +HRESULT WINAPI IWineD3DDeviceImpl_GetSamplerState(IWineD3DDevice *iface, DWORD Sampler, WINED3DSAMPLERSTATETYPE Type, DWORD* Value){ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + /** TODO: check that sampler is in range **/ + *Value = This->updateStateBlock->samplerState[Sampler][Type]; + return D3D_OK; + +} + +HRESULT WINAPI IWineD3DDeviceImpl_SetScissorRect(IWineD3DDevice *iface, CONST RECT* pRect){ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + ENTER_GL(); + + /** FIXME: Windows uses a top,left origin openGL uses a bottom Right? **/ + TRACE("(%p)Setting new Scissor Rect to %ld:%ld-%ld:%ld\n", This, pRect->left, pRect->top, pRect->right, pRect->bottom); + glScissor( pRect->left, pRect->top, pRect->right - pRect->left, pRect->bottom - pRect->top); + LEAVE_GL(); + return D3D_OK; +} + +HRESULT WINAPI IWineD3DDeviceImpl_GetScissorRect(IWineD3DDevice *iface, RECT* pRect){ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + GLint scissorBox[4]; + ENTER_GL(); + + /** FIXME: Windows uses a top,left origin openGL uses a bottom Right? **/ + glGetIntegerv(GL_SCISSOR_BOX, scissorBox); + pRect->left = scissorBox[1]; + pRect->top = scissorBox[2]; + pRect->right = scissorBox[1] + scissorBox[3]; + pRect->bottom = scissorBox[2] + scissorBox[4]; + TRACE("(%p)Returning a Scissor Rect of %ld:%ld-%ld:%ld\n", This, pRect->left, pRect->top, pRect->right, pRect->bottom); + LEAVE_GL(); + return D3D_OK; +} + +HRESULT WINAPI IWineD3DDeviceImpl_SetVertexDeclaration(IWineD3DDevice* iface, IWineD3DVertexDeclaration* pDecl) { + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; + + TRACE("(%p) : pDecl=%p\n", This, pDecl); + This->updateStateBlock->vertexDecl = pDecl; + This->updateStateBlock->changed.vertexDecl = TRUE; + This->updateStateBlock->set.vertexDecl = TRUE; + return D3D_OK; +} + +HRESULT WINAPI IWineD3DDeviceImpl_GetVertexDeclaration(IWineD3DDevice* iface, IWineD3DVertexDeclaration** ppDecl) { + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + + TRACE("(%p) : ppDecl=%p\n", This, ppDecl); + + *ppDecl = This->updateStateBlock->vertexDecl; + if (NULL != *ppDecl) IWineD3DVertexDeclaration_AddRef(*ppDecl); + TRACE("(%p) : returning %p\n", This, *ppDecl); + return D3D_OK; +} + +HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface, IWineD3DVertexShader* pShader){ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + + static BOOL showFixmes = TRUE; + + This->updateStateBlock->vertexShader = pShader; + This->updateStateBlock->changed.vertexShader = TRUE; + This->updateStateBlock->set.vertexShader = TRUE; + + if(pShader == NULL){ + /* clear down the shader */ + TRACE("Clear down the shader\n"); + }else{ + if(showFixmes){ + FIXME("(%p) : stub pShader(%p)\n", This, pShader); + showFixmes = FALSE; + } + } + + return D3D_OK; + + /** FIXME: refernece counting? **/ + if (pShader == NULL) { /* only valid with non FVF shaders */ + TRACE_(d3d_shader)("(%p) : FVF Shader, pShader=%p\n", This, pShader); + This->updateStateBlock->vertexShader = NULL; + } else { + TRACE_(d3d_shader)("(%p) : Created shader, pShader=%p\n", This, pShader); + This->updateStateBlock->vertexShader = pShader; + } + + This->updateStateBlock->changed.vertexShader = TRUE; + This->updateStateBlock->set.vertexShader = TRUE; + + /* Handle recording of state blocks */ + if (This->isRecordingState) { + TRACE("Recording... not performing anything\n"); + return D3D_OK; + } + /** + * TODO: merge HAL shaders context switching from prototype + */ + return D3D_OK; + } HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShader(IWineD3DDevice *iface, IWineD3DVertexShader** ppShader){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; *ppShader = This->stateBlock->vertexShader; - if(*ppShader != NULL) - IWineD3DVertexShader_AddRef(*ppShader); + IWineD3DVertexShader_AddRef(*ppShader); TRACE("(%p) : returning %p\n", This, *ppShader); return D3D_OK; } - HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShaderConstantB(IWineD3DDevice *iface, UINT StartRegister, CONST BOOL *pConstantData, UINT BoolCount){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - TRACE("(%p) : stub\n", This); return D3D_OK; } @@ -2852,7 +3995,7 @@ return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShaderConstantF(IWineD3DDevice *iface, UINT StartRegister, float *pConstantData, UINT Vector4fCount){ +HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShaderConstantF(IWineD3DDevice *iface, UINT StartRegister, float *pConstantData, UINT Vector4fCount){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p) : stub\n", This); return D3D_OK; @@ -2919,21 +4062,17 @@ *****/ HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - union { - float f; - DWORD d; - } tmpvalue; /* FIXME: Handle 3d textures? What if TSS value set before set texture? Need to reapply all values? */ - + TRACE("(%p) : Stage=%ld, Type=%s(%d), Value=%ld\n", This, Stage, debug_d3dtexturestate(Type), Type, Value); /* Reject invalid texture units */ if (Stage >= GL_LIMITS(textures)) { TRACE("Attempt to access invalid texture rejected\n"); return D3DERR_INVALIDCALL; - } - + } + /* FIXME: Only change if the value is different!*/ This->updateStateBlock->changed.textureState[Stage][Type] = TRUE; This->updateStateBlock->set.textureState[Stage][Type] = TRUE; This->updateStateBlock->textureState[Stage][Type] = Value; @@ -2942,162 +4081,19 @@ if (This->isRecordingState) { TRACE("Recording... not performing anything\n"); return D3D_OK; - } + } ENTER_GL(); /* Make appropriate texture active */ VTRACE(("Activating appropriate texture state %ld\n", Stage)); if (GL_SUPPORT(ARB_MULTITEXTURE)) { - GLACTIVETEXTURE(Stage); - } else if (Stage > 0) { - FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n"); - } - - switch (Type) { - - case D3DTSS_MINFILTER : - case D3DTSS_MIPFILTER : - { - DWORD ValueMIN = This->stateBlock->textureState[Stage][D3DTSS_MINFILTER]; - DWORD ValueMIP = This->stateBlock->textureState[Stage][D3DTSS_MIPFILTER]; - GLint realVal = GL_LINEAR; - - if (ValueMIN == D3DTEXF_NONE) { - /* Doesn't really make sense - Windows just seems to disable - mipmapping when this occurs */ - FIXME("Odd - minfilter of none, just disabling mipmaps\n"); - realVal = GL_LINEAR; - } else if (ValueMIN == D3DTEXF_POINT) { - /* GL_NEAREST_* */ - if (ValueMIP == D3DTEXF_NONE) { - realVal = GL_NEAREST; - } else if (ValueMIP == D3DTEXF_POINT) { - realVal = GL_NEAREST_MIPMAP_NEAREST; - } else if (ValueMIP == D3DTEXF_LINEAR) { - realVal = GL_NEAREST_MIPMAP_LINEAR; - } else { - FIXME("Unhandled D3DTSS_MIPFILTER value of %ld\n", ValueMIP); - realVal = GL_NEAREST; - } - } else if (ValueMIN == D3DTEXF_LINEAR) { - /* GL_LINEAR_* */ - if (ValueMIP == D3DTEXF_NONE) { - realVal = GL_LINEAR; - } else if (ValueMIP == D3DTEXF_POINT) { - realVal = GL_LINEAR_MIPMAP_NEAREST; - } else if (ValueMIP == D3DTEXF_LINEAR) { - realVal = GL_LINEAR_MIPMAP_LINEAR; - } else { - FIXME("Unhandled D3DTSS_MIPFILTER value of %ld\n", ValueMIP); - realVal = GL_LINEAR; - } - } else if (ValueMIN == D3DTEXF_ANISOTROPIC) { - if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { - if (ValueMIP == D3DTEXF_NONE) { - realVal = GL_LINEAR_MIPMAP_LINEAR; - } else if (ValueMIP == D3DTEXF_POINT) { - realVal = GL_LINEAR_MIPMAP_NEAREST; - } else if (ValueMIP == D3DTEXF_LINEAR) { - realVal = GL_LINEAR_MIPMAP_LINEAR; - } else { - FIXME("Unhandled D3DTSS_MIPFILTER value of %ld\n", ValueMIP); - realVal = GL_LINEAR; - } - } else { - WARN("Trying to use ANISOTROPIC_FILTERING for D3DTSS_MINFILTER. But not supported by OpenGL driver\n"); - realVal = GL_LINEAR; - } - } else { - FIXME("Unhandled D3DTSS_MINFILTER value of %ld\n", ValueMIN); - realVal = GL_LINEAR_MIPMAP_LINEAR; - } - - TRACE("ValueMIN=%ld, ValueMIP=%ld, setting MINFILTER to %x\n", ValueMIN, ValueMIP, realVal); - glTexParameteri(This->stateBlock->textureDimensions[Stage], GL_TEXTURE_MIN_FILTER, realVal); - checkGLcall("glTexParameter GL_TEXTURE_MIN_FILTER, ..."); - /** - * if we juste choose to use ANISOTROPIC filtering, refresh openGL state - */ - if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC) && D3DTEXF_ANISOTROPIC == ValueMIN) { - glTexParameteri(This->stateBlock->textureDimensions[Stage], - GL_TEXTURE_MAX_ANISOTROPY_EXT, - This->stateBlock->textureState[Stage][D3DTSS_MAXANISOTROPY]); - checkGLcall("glTexParameter GL_TEXTURE_MAX_ANISOTROPY_EXT, ..."); - } - } - break; - - case D3DTSS_MAGFILTER : - { - DWORD ValueMAG = This->stateBlock->textureState[Stage][D3DTSS_MAGFILTER]; - GLint realVal = GL_NEAREST; - - if (ValueMAG == D3DTEXF_POINT) { - realVal = GL_NEAREST; - } else if (ValueMAG == D3DTEXF_LINEAR) { - realVal = GL_LINEAR; - } else if (ValueMAG == D3DTEXF_ANISOTROPIC) { - if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { - realVal = GL_LINEAR; - } else { - FIXME("Trying to use ANISOTROPIC_FILTERING for D3DTSS_MAGFILTER. But not supported by current OpenGL driver\n"); - realVal = GL_NEAREST; - } - } else { - FIXME("Unhandled D3DTSS_MAGFILTER value of %ld\n", ValueMAG); - realVal = GL_NEAREST; - } - TRACE("ValueMAG=%ld setting MAGFILTER to %x\n", ValueMAG, realVal); - glTexParameteri(This->stateBlock->textureDimensions[Stage], GL_TEXTURE_MAG_FILTER, realVal); - checkGLcall("glTexParameter GL_TEXTURE_MAG_FILTER, ..."); - /** - * if we juste choose to use ANISOTROPIC filtering, refresh openGL state - */ - if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC) && D3DTEXF_ANISOTROPIC == ValueMAG) { - glTexParameteri(This->stateBlock->textureDimensions[Stage], - GL_TEXTURE_MAX_ANISOTROPY_EXT, - This->stateBlock->textureState[Stage][D3DTSS_MAXANISOTROPY]); - checkGLcall("glTexParameter GL_TEXTURE_MAX_ANISOTROPY_EXT, ..."); - } - } - break; - - case D3DTSS_MAXMIPLEVEL : - { - /** - * Not really the same, but the more apprioprate than nothing - */ - glTexParameteri(This->stateBlock->textureDimensions[Stage], - GL_TEXTURE_BASE_LEVEL, - This->stateBlock->textureState[Stage][D3DTSS_MAXMIPLEVEL]); - checkGLcall("glTexParameteri GL_TEXTURE_BASE_LEVEL ..."); - } - break; - - case D3DTSS_MAXANISOTROPY : - { - if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { - glTexParameteri(This->stateBlock->textureDimensions[Stage], - GL_TEXTURE_MAX_ANISOTROPY_EXT, - This->stateBlock->textureState[Stage][D3DTSS_MAXANISOTROPY]); - checkGLcall("glTexParameteri GL_TEXTURE_MAX_ANISOTROPY_EXT ..."); - } - } - break; - - case D3DTSS_MIPMAPLODBIAS : - { - if (GL_SUPPORT(EXT_TEXTURE_LOD_BIAS)) { - tmpvalue.d = Value; - glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, - GL_TEXTURE_LOD_BIAS_EXT, - tmpvalue.f); - checkGLcall("glTexEnvi GL_TEXTURE_LOD_BIAS_EXT ..."); - } + GLACTIVETEXTURE(Stage); + } else if (Stage > 0) { + FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n"); } - break; + switch (Type) { case D3DTSS_ALPHAOP : case D3DTSS_COLOROP : { @@ -3120,7 +4116,7 @@ } else { glDisable(GL_TEXTURE_1D); checkGLcall("Disable GL_TEXTURE_1D"); - } + } if (This->stateBlock->textureDimensions[Stage] == GL_TEXTURE_2D) { if (GL_SUPPORT(NV_TEXTURE_SHADER) && This->texture_shader_active) { glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D); @@ -3157,44 +4153,41 @@ case D3DTSS_ALPHAARG1 : case D3DTSS_ALPHAARG2 : { - BOOL isAlphaArg = (Type == D3DTSS_ALPHAOP || Type == D3DTSS_ALPHAARG1 || + BOOL isAlphaArg = (Type == D3DTSS_ALPHAOP || Type == D3DTSS_ALPHAARG1 || Type == D3DTSS_ALPHAARG2 || Type == D3DTSS_ALPHAARG0); if (isAlphaArg) { set_tex_op(iface, TRUE, Stage, This->stateBlock->textureState[Stage][D3DTSS_ALPHAOP], - This->stateBlock->textureState[Stage][D3DTSS_ALPHAARG1], - This->stateBlock->textureState[Stage][D3DTSS_ALPHAARG2], + This->stateBlock->textureState[Stage][D3DTSS_ALPHAARG1], + This->stateBlock->textureState[Stage][D3DTSS_ALPHAARG2], This->stateBlock->textureState[Stage][D3DTSS_ALPHAARG0]); } else { set_tex_op(iface, FALSE, Stage, This->stateBlock->textureState[Stage][D3DTSS_COLOROP], - This->stateBlock->textureState[Stage][D3DTSS_COLORARG1], - This->stateBlock->textureState[Stage][D3DTSS_COLORARG2], + This->stateBlock->textureState[Stage][D3DTSS_COLORARG1], + This->stateBlock->textureState[Stage][D3DTSS_COLORARG2], This->stateBlock->textureState[Stage][D3DTSS_COLORARG0]); } } break; } - - case D3DTSS_ADDRESSU : - case D3DTSS_ADDRESSV : case D3DTSS_ADDRESSW : { GLint wrapParm = GL_REPEAT; switch (Value) { case D3DTADDRESS_WRAP: wrapParm = GL_REPEAT; break; - case D3DTADDRESS_CLAMP: wrapParm = GL_CLAMP_TO_EDGE; break; - case D3DTADDRESS_BORDER: + case D3DTADDRESS_CLAMP: wrapParm = GL_CLAMP_TO_EDGE; break; + case D3DTADDRESS_BORDER: { if (GL_SUPPORT(ARB_TEXTURE_BORDER_CLAMP)) { - wrapParm = GL_CLAMP_TO_BORDER_ARB; + wrapParm = GL_CLAMP_TO_BORDER_ARB; } else { /* FIXME: Not right, but better */ FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type); - wrapParm = GL_REPEAT; + wrapParm = GL_REPEAT; } } break; - case D3DTADDRESS_MIRROR: + case D3DTADDRESS_MIRROR: { if (GL_SUPPORT(ARB_TEXTURE_MIRRORED_REPEAT)) { wrapParm = GL_MIRRORED_REPEAT_ARB; @@ -3205,33 +4198,23 @@ } } break; - case D3DTADDRESS_MIRRORONCE: + case D3DTADDRESS_MIRRORONCE: { if (GL_SUPPORT(ATI_TEXTURE_MIRROR_ONCE)) { wrapParm = GL_MIRROR_CLAMP_TO_EDGE_ATI; } else { FIXME("Unsupported D3DTADDRESS_MIRRORONCE (needs GL_ATI_texture_mirror_once) state %d\n", Type); - wrapParm = GL_REPEAT; + wrapParm = GL_REPEAT; } } break; default: - FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type); - wrapParm = GL_REPEAT; + if(Value != 0 /* default GL_REPEAT */) + FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type); + wrapParm = GL_REPEAT; } - switch (Type) { - case D3DTSS_ADDRESSU: - TRACE("Setting WRAP_S to %d for %x\n", wrapParm, This->stateBlock->textureDimensions[Stage]); - glTexParameteri(This->stateBlock->textureDimensions[Stage], GL_TEXTURE_WRAP_S, wrapParm); - checkGLcall("glTexParameteri(..., GL_TEXTURE_WRAP_S, wrapParm)"); - break; - case D3DTSS_ADDRESSV: - TRACE("Setting WRAP_T to %d for %x\n", wrapParm, This->stateBlock->textureDimensions[Stage]); - glTexParameteri(This->stateBlock->textureDimensions[Stage], GL_TEXTURE_WRAP_T, wrapParm); - checkGLcall("glTexParameteri(..., GL_TEXTURE_WRAP_T, wrapParm)"); - break; case D3DTSS_ADDRESSW: TRACE("Setting WRAP_R to %d for %x\n", wrapParm, This->stateBlock->textureDimensions[Stage]); glTexParameteri(This->stateBlock->textureDimensions[Stage], GL_TEXTURE_WRAP_R, wrapParm); @@ -3242,150 +4225,139 @@ } } break; - - case D3DTSS_BORDERCOLOR : - { - float col[4]; - D3DCOLORTOGLFLOAT4(Value, col); - TRACE("Setting border color for %x to %lx\n", This->stateBlock->textureDimensions[Stage], Value); - glTexParameterfv(This->stateBlock->textureDimensions[Stage], GL_TEXTURE_BORDER_COLOR, &col[0]); - checkGLcall("glTexParameteri(..., GL_TEXTURE_BORDER_COLOR, ...)"); - } - break; - case D3DTSS_TEXCOORDINDEX : { /* Values 0-7 are indexes into the FVF tex coords - See comments in DrawPrimitive */ - /* FIXME: From MSDN: The D3DTSS_TCI_* flags are mutually exclusive. If you include - one flag, you can still specify an index value, which the system uses to - determine the texture wrapping mode. + /** FIXME: From MSDN: The D3DTSS_TCI_* flags are mutually exclusive. If you include + one flag, you can still specify an index value, which the system uses to + determine the texture wrapping mode. eg. SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION | 1 ); - means use the vertex position (camera-space) as the input texture coordinates + means use the vertex position (camera-space) as the input texture coordinates for this texture stage, and the wrap mode set in the WINED3DRS_WRAP1 render state. We do not (yet) support the D3DRENDERSTATE_WRAPx values, nor tie them up - to the TEXCOORDINDEX value */ - - /** - * Be careful the value of the mask 0xF0000 come from d3d8types.h infos + to the TEXCOORDINDEX value **/ + + /** + * Be careful the value of the mask 0xF0000 come from d3d8types.h infos */ switch (Value & 0xFFFF0000) { case D3DTSS_TCI_PASSTHRU: - /*Use the specified texture coordinates contained within the vertex format. This value resolves to zero.*/ - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); - glDisable(GL_TEXTURE_GEN_R); - checkGLcall("glDisable(GL_TEXTURE_GEN_S,T,R)"); - break; + /* Use the specified texture coordinates contained within the vertex format. This value resolves to zero.*/ + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_R); + checkGLcall("glDisable(GL_TEXTURE_GEN_S,T,R)"); + break; case D3DTSS_TCI_CAMERASPACEPOSITION: - /* CameraSpacePosition means use the vertex position, transformed to camera space, - as the input texture coordinates for this stage's texture transformation. This - equates roughly to EYE_LINEAR */ - { - float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; - float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; - float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; - float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; - TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); - glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); - glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); - glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); - glPopMatrix(); - - TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n"); - glEnable(GL_TEXTURE_GEN_S); - checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); - glEnable(GL_TEXTURE_GEN_T); - checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); - glEnable(GL_TEXTURE_GEN_R); - checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); - glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); - } - break; + /* CameraSpacePosition means use the vertex position, transformed to camera space, + as the input texture coordinates for this stage's texture transformation. This + equates roughly to EYE_LINEAR */ + { + float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; + float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; + float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; + float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; + TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); + glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); + glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); + glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); + glPopMatrix(); + + TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n"); + glEnable(GL_TEXTURE_GEN_S); + checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); + glEnable(GL_TEXTURE_GEN_T); + checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); + glEnable(GL_TEXTURE_GEN_R); + checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)"); + } + break; case D3DTSS_TCI_CAMERASPACENORMAL: - { - if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) { - float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; - float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; - float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; - float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; - TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); - glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); - glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); - glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); - glPopMatrix(); - - glEnable(GL_TEXTURE_GEN_S); - checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); - checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)"); - glEnable(GL_TEXTURE_GEN_T); - checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); - checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)"); - glEnable(GL_TEXTURE_GEN_R); - checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); - glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); - checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)"); + { + if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) { + float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; + float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; + float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; + float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; + TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); + glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); + glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); + glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); + glPopMatrix(); + + glEnable(GL_TEXTURE_GEN_S); + checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); + checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)"); + glEnable(GL_TEXTURE_GEN_T); + checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); + checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)"); + glEnable(GL_TEXTURE_GEN_R); + checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); + checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)"); + } } - } - break; + break; case D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR: - { - if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) { - float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; - float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; - float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; - float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; - TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); - glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); - glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); - glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); - glPopMatrix(); - - glEnable(GL_TEXTURE_GEN_S); - checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); - checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)"); - glEnable(GL_TEXTURE_GEN_T); - checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); - checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)"); - glEnable(GL_TEXTURE_GEN_R); - checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); - glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); - checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)"); + { + if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) { + float s_plane[] = { 1.0, 0.0, 0.0, 0.0 }; + float t_plane[] = { 0.0, 1.0, 0.0, 0.0 }; + float r_plane[] = { 0.0, 0.0, 1.0, 0.0 }; + float q_plane[] = { 0.0, 0.0, 0.0, 1.0 }; + TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n"); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); + glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); + glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); + glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); + glPopMatrix(); + + glEnable(GL_TEXTURE_GEN_S); + checkGLcall("glEnable(GL_TEXTURE_GEN_S);"); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); + checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)"); + glEnable(GL_TEXTURE_GEN_T); + checkGLcall("glEnable(GL_TEXTURE_GEN_T);"); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); + checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)"); + glEnable(GL_TEXTURE_GEN_R); + checkGLcall("glEnable(GL_TEXTURE_GEN_R);"); + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); + checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)"); + } } - } - break; + break; /* Unhandled types: */ default: - /* Todo: */ - /* ? disable GL_TEXTURE_GEN_n ? */ + /** Todo: **/ + /* ? disable GL_TEXTURE_GEN_n ? */ glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); @@ -3398,27 +4370,27 @@ /* Unhandled */ case D3DTSS_TEXTURETRANSFORMFLAGS : set_texture_matrix((float *)&This->stateBlock->transforms[D3DTS_TEXTURE0 + Stage].u.m[0][0], Value); - break; + break; case D3DTSS_BUMPENVMAT00 : case D3DTSS_BUMPENVMAT01 : - TRACE("BUMPENVMAT0%u Stage=%ld, Type=%d, Value =%ld\n", Type - D3DTSS_BUMPENVMAT00, Stage, Type, Value); + TRACE("FIXME: BUMPENVMAT0%u Stage=%ld, Type=%d, Value =%ld\n", Type - D3DTSS_BUMPENVMAT00, Stage, Type, Value); break; case D3DTSS_BUMPENVMAT10 : case D3DTSS_BUMPENVMAT11 : - TRACE("BUMPENVMAT1%u Stage=%ld, Type=%d, Value =%ld\n", Type - D3DTSS_BUMPENVMAT10, Stage, Type, Value); + TRACE("FIXME: BUMPENVMAT1%u Stage=%ld, Type=%d, Value =%ld\n", Type - D3DTSS_BUMPENVMAT10, Stage, Type, Value); break; case D3DTSS_BUMPENVLSCALE : - TRACE("BUMPENVLSCALE Stage=%ld, Type=%d, Value =%ld\n", Stage, Type, Value); + TRACE("FIXME: BUMPENVLSCALE Stage=%ld, Type=%d, Value =%ld\n", Stage, Type, Value); break; case D3DTSS_BUMPENVLOFFSET : - TRACE("BUMPENVLOFFSET Stage=%ld, Type=%d, Value =%ld\n", Stage, Type, Value); + TRACE("FIXME: BUMPENVLOFFSET Stage=%ld, Type=%d, Value =%ld\n", Stage, Type, Value); break; case D3DTSS_RESULTARG : - TRACE("RESULTARG Still a stub, Stage=%ld, Type=%d, Value =%ld\n", Stage, Type, Value); + TRACE("FIXME: RESULTARG Still a stub, Stage=%ld, Type=%d, Value =%ld\n", Stage, Type, Value); break; default: @@ -3439,19 +4411,18 @@ } /***** - * Get / Set Texture + * Get / Set Texture *****/ -HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, DWORD Stage, IWineD3DBaseTexture* pTexture) { - +HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice* iface, DWORD Stage, IWineD3DBaseTexture* pTexture){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DBaseTexture *oldTexture; BOOL reapplyStates = TRUE; - DWORD reapplyFlags = 0; INT oldTextureDimensions = -1; + DWORD reapplyFlags = 0; D3DRESOURCETYPE textureType; - oldTexture = This->updateStateBlock->textures[Stage]; - TRACE("(%p) : Stage(%ld), Texture (%p)\n", This, Stage, pTexture); + TRACE("(%p) : Stage(%ld), pTexture(%p) \n", This, Stage, pTexture); /* Reject invalid texture units */ if (Stage >= GL_LIMITS(textures)) { @@ -3459,8 +4430,14 @@ return D3DERR_INVALIDCALL; } - This->updateStateBlock->set.textures[Stage] = TRUE; + oldTexture = This->updateStateBlock->textures[Stage]; + TRACE("GL_LIMITS %d\n",GL_LIMITS(textures)); + TRACE("(%p) : oldtexture(%p)\n", This,oldTexture); + + This->updateStateBlock->set.textures[Stage] = TRUE; This->updateStateBlock->changed.textures[Stage] = TRUE; + + TRACE("(%p) : setting new texture to %p\n", This,pTexture); This->updateStateBlock->textures[Stage] = pTexture; /* Handle recording of state blocks */ @@ -3469,14 +4446,38 @@ return D3D_OK; } + /** NOTE: MSDN says that setTexture increases the reference count, + * and the the application nust set the texture back to null (or have a leaky application), + * This means we should pass the refcount upto the parent + *******************************/ + if (NULL != oldTexture) { + + IUnknown *textureParent; + IWineD3DBaseTexture_GetParent(oldTexture, (IUnknown **)&textureParent); + IUnknown_Release(textureParent); + IUnknown_Release(textureParent); /** NOTE: Twice because GetParent adds a ref **/ + oldTexture = NULL; + } + if(NULL != This->updateStateBlock->textures[Stage]){ + + IUnknown *textureParent; + IWineD3DBaseTexture_GetParent(This->updateStateBlock->textures[Stage], (IUnknown **)&textureParent); + /** NOTE: GetParent will increase the ref count for me, I won't clean up untill the texture is set to NULL **/ + } + oldTextureDimensions = This->updateStateBlock->textureDimensions[Stage]; ENTER_GL(); /* Make appropriate texture active */ if (GL_SUPPORT(ARB_MULTITEXTURE)) { - GLACTIVETEXTURE(Stage); - +#if defined(GL_VERSION_1_3) + glActiveTexture(GL_TEXTURE0 + Stage); + checkGLcall("glActiveTexture"); +#else + glActiveTextureARB(GL_TEXTURE0_ARB + Stage); + checkGLcall("glActiveTextureARB"); +#endif } else if (Stage>0) { FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n"); } @@ -3485,78 +4486,67 @@ * and the the application nust set the texture back to null (or have a leaky application), * This means we should pass the refcount upto the parent *******************************/ - if (NULL != oldTexture) { IUnknown *textureParent; IWineD3DBaseTexture_GetParent(oldTexture, (IUnknown **)&textureParent); IUnknown_Release(textureParent); IUnknown_Release(textureParent); /** NOTE: Twice because GetParent adds a ref **/ oldTexture = NULL; - } if (NULL != pTexture) { IUnknown *textureParent; IWineD3DBaseTexture_GetParent(This->updateStateBlock->textures[Stage], (IUnknown **)&textureParent); /** NOTE: GetParent will increase the ref count for me, I won't clean up untill the texture is set to NULL **/ - + TRACE("Getting type\n"); /* Now setup the texture appropraitly */ textureType = IWineD3DBaseTexture_GetType(pTexture); if (textureType == D3DRTYPE_TEXTURE) { - - if (oldTexture == pTexture && !IWineD3DBaseTexture_GetDirty(pTexture)) { + if (oldTexture == pTexture && IWineD3DBaseTexture_GetDirty(pTexture)) { TRACE("Skipping setting texture as old == new\n"); reapplyStates = FALSE; - } else { - /* Standard 2D texture */ TRACE("Standard 2d texture\n"); This->updateStateBlock->textureDimensions[Stage] = GL_TEXTURE_2D; /* Load up the texture now */ - IWineD3DTexture_PreLoad((IWineD3DTexture *) pTexture); + IWineD3DTexture_PreLoad((IWineD3DTexture*) pTexture); } } else if (textureType == D3DRTYPE_VOLUMETEXTURE) { - - if (oldTexture == pTexture && !IWineD3DBaseTexture_GetDirty(pTexture)) { - TRACE("Skipping setting texture as old == new\n"); - reapplyStates = FALSE; - + if (oldTexture == pTexture && IWineD3DBaseTexture_GetDirty(pTexture)) { + TRACE("Skipping setting texture as old == new\n"); + reapplyStates = FALSE; } else { - - /* Standard 3D (volume) texture */ - TRACE("Standard 3d texture\n"); - This->updateStateBlock->textureDimensions[Stage] = GL_TEXTURE_3D; - - /* Load up the texture now */ - IWineD3DVolumeTexture_PreLoad((IWineD3DVolumeTexture *) pTexture); + /* Standard 3D (volume) texture */ + TRACE("Standard 3d texture\n"); + This->updateStateBlock->textureDimensions[Stage] = GL_TEXTURE_3D; + /** TODO: change this to use bind texture **/ + /* Load up the texture now */ + IWineD3DVolumeTexture_PreLoad((IWineD3DVolumeTexture*) pTexture); } - } else if (textureType == D3DRTYPE_CUBETEXTURE) { - if (oldTexture == pTexture && !IWineD3DBaseTexture_GetDirty(pTexture)) { + } else if (textureType == D3DRTYPE_CUBETEXTURE) { + if (oldTexture == pTexture && IWineD3DBaseTexture_GetDirty(pTexture)) { TRACE("Skipping setting texture as old == new\n"); reapplyStates = FALSE; - } else { - /* Standard Cube texture */ + TRACE("Standard Cube texture\n"); This->updateStateBlock->textureDimensions[Stage] = GL_TEXTURE_CUBE_MAP_ARB; - + /** TODO: change this to use bind texture **/ /* Load up the texture now */ - IWineD3DCubeTexture_PreLoad((IWineD3DCubeTexture *) pTexture); + IWineD3DCubeTexture_PreLoad((IWineD3DCubeTexture*) pTexture); } } else { FIXME("(%p) : Incorrect type for a texture : (%d,%s)\n", This, textureType, debug_d3dresourcetype(textureType)); } - } else { - TRACE("Setting to no texture (ie default texture)\n"); This->updateStateBlock->textureDimensions[Stage] = GL_TEXTURE_1D; glBindTexture(GL_TEXTURE_1D, This->dummyTextureName[Stage]); @@ -3577,7 +4567,7 @@ /* If Alpha arg1 is texture then handle the special case when there changes between a texture and no texture - See comments in set_tex_op */ - if ((This->stateBlock->textureState[Stage][D3DTSS_ALPHAARG1] == D3DTA_TEXTURE) && + if ((This->stateBlock->textureState[Stage][D3DTSS_ALPHAARG1] == D3DTA_TEXTURE) && (((oldTexture == NULL) && (pTexture != NULL)) || ((pTexture == NULL) && (oldTexture != NULL)))) { reapplyFlags |= REAPPLY_ALPHAOP; @@ -3591,43 +4581,52 @@ IWineD3DDeviceImpl_SetupTextureStates(iface, Stage, reapplyFlags); } - LEAVE_GL(); + LEAVE_GL(); TRACE("Texture now fully setup\n"); return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_GetTexture(IWineD3DDevice *iface, DWORD Stage, IWineD3DBaseTexture** ppTexture) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - TRACE("(%p) : returning %p for stage %ld\n", This, This->updateStateBlock->textures[Stage], Stage); - *ppTexture = (IWineD3DBaseTexture *) This->updateStateBlock->textures[Stage]; - if (*ppTexture) - IWineD3DBaseTexture_AddRef(*ppTexture); - return D3D_OK; +HRESULT WINAPI IWineD3DDeviceImpl_GetTexture(IWineD3DDevice* iface, DWORD Stage, IWineD3DBaseTexture** ppTexture){ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + TRACE("(%p) : (%ld /* Stage */,%p /* ppTexture */) \n", This, Stage, ppTexture); + + /* Reject invalid texture units */ + if (Stage >= GL_LIMITS(textures)) { + TRACE("Attempt to access invalid texture rejected\n"); + return D3DERR_INVALIDCALL; + } + *ppTexture=This->updateStateBlock->textures[Stage]; + if(*ppTexture) + IWineD3DTexture_AddRef(*ppTexture); + else + return D3DERR_INVALIDCALL; + return D3D_OK; } /***** * Get Back Buffer *****/ -HRESULT WINAPI IWineD3DDeviceImpl_GetBackBuffer(IWineD3DDevice *iface, UINT iSwapChain, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, - IWineD3DSurface** ppBackBuffer) { + +HRESULT WINAPI IWineD3DDeviceImpl_GetBackBuffer(IWineD3DDevice *iface, UINT iSwapChain, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, + IWineD3DSurface **ppBackBuffer) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DSwapChain *swapChain; + HRESULT hr; - *ppBackBuffer = (IWineD3DSurface *) This->backBuffer; TRACE("(%p) : BackBuf %d Type %d SwapChain %d returning %p\n", This, BackBuffer, Type, iSwapChain, *ppBackBuffer); - - if (BackBuffer > This->presentParms.BackBufferCount - 1) { - FIXME("Only one backBuffer currently supported\n"); - return D3DERR_INVALIDCALL; + + hr = IWineD3DDeviceImpl_GetSwapChain(iface, iSwapChain, &swapChain); + if(hr == D3D_OK){ + hr = IWineD3DSwapChain_GetBackBuffer(swapChain, BackBuffer, Type, ppBackBuffer); + IWineD3DSwapChain_Release(swapChain); + }else{ + *ppBackBuffer = NULL; } - - /* Note inc ref on returned surface */ - IWineD3DSurface_AddRef(*ppBackBuffer); - - return D3D_OK; + return hr; } -HRESULT WINAPI IWineD3DDeviceImpl_GetDeviceCaps(IWineD3DDevice *iface, D3DCAPS9* pCaps) { +HRESULT WINAPI IWineD3DDeviceImpl_GetDeviceCaps(IWineD3DDevice *iface, WINED3DCAPS* pCaps) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; WARN("(%p) : stub, calling idirect3d for now\n", This); IWineD3D_GetDeviceCaps(This->wineD3D, This->adapterNo, This->devType, pCaps); @@ -3637,36 +4636,23 @@ /** TODO: move to swapchains **/ HRESULT WINAPI IWineD3DDeviceImpl_GetDisplayMode(IWineD3DDevice *iface, UINT iSwapChain, D3DDISPLAYMODE* pMode) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - HDC hdc; - int bpp = 0; + IWineD3DSwapChain *swapChain; + HRESULT hr; - pMode->Width = GetSystemMetrics(SM_CXSCREEN); - pMode->Height = GetSystemMetrics(SM_CYSCREEN); - pMode->RefreshRate = 85; /*FIXME: How to identify? */ - - hdc = CreateDCA("DISPLAY", NULL, NULL, NULL); - bpp = GetDeviceCaps(hdc, BITSPIXEL); - DeleteDC(hdc); - - switch (bpp) { - case 8: pMode->Format = WINED3DFMT_R8G8B8; break; - case 16: pMode->Format = WINED3DFMT_R5G6B5; break; - case 24: /*pMode->Format = WINED3DFMT_R8G8B8; break; */ - case 32: pMode->Format = WINED3DFMT_A8R8G8B8; break; - default: - FIXME("Unrecognized display mode format\n"); - pMode->Format = WINED3DFMT_UNKNOWN; + hr = IWineD3DDeviceImpl_GetSwapChain(iface, iSwapChain, (IWineD3DSwapChain **)&swapChain); + if(hr == D3D_OK){ + hr = IWineD3DSwapChain_GetDisplayMode(swapChain, pMode); + IWineD3DSwapChain_Release(swapChain); + }else{ + FIXME("(%p) Error getting display mode\n", This); } - - FIXME("(%p) : returning w(%d) h(%d) rr(%d) fmt(%u,%s)\n", This, pMode->Width, pMode->Height, pMode->RefreshRate, - pMode->Format, debug_d3dformat(pMode->Format)); - return D3D_OK; + return hr; } /***** * Stateblock related functions *****/ - HRESULT WINAPI IWineD3DDeviceImpl_BeginStateBlock(IWineD3DDevice *iface) { +HRESULT WINAPI IWineD3DDeviceImpl_BeginStateBlock(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DStateBlockImpl *object; TRACE("(%p)", This); @@ -3676,19 +4662,19 @@ return E_OUTOFMEMORY; } TRACE("(%p) creted object %p\n", This, object); - object->wineD3DDevice= This; + object->wineD3DDevice= This; /** FIXME: object->parent = parent; **/ object->parent = NULL; - object->blockType = D3DSBT_ALL; + object->blockType = D3DSBT_ALL; object->ref = 1; - object->lpVtbl = &IWineD3DStateBlock_Vtbl; - + object->lpVtbl = &IWineD3DStateBlock_Vtbl; + IWineD3DStateBlock_Release((IWineD3DStateBlock*)This->updateStateBlock); This->updateStateBlock = object; This->isRecordingState = TRUE; - + TRACE("(%p) recording stateblock %p\n",This , object); - return D3D_OK; + return D3D_OK; } HRESULT WINAPI IWineD3DDeviceImpl_EndStateBlock(IWineD3DDevice *iface, IWineD3DStateBlock** ppStateBlock) { @@ -3702,11 +4688,11 @@ *ppStateBlock = (IWineD3DStateBlock*)This->updateStateBlock; This->isRecordingState = FALSE; - This->updateStateBlock = This->stateBlock; + This->updateStateBlock = This->stateBlock; IWineD3DStateBlock_AddRef((IWineD3DStateBlock*)This->updateStateBlock); /* IWineD3DStateBlock_AddRef(*ppStateBlock); don't need to do this, since we should really just release UpdateStateBlock first */ TRACE("(%p) returning token (ptr to stateblock) of %p\n", This, *ppStateBlock); - return D3D_OK; + return D3D_OK; } /***** @@ -3714,7 +4700,15 @@ *****/ HRESULT WINAPI IWineD3DDeviceImpl_BeginScene(IWineD3DDevice *iface) { /* At the moment we have no need for any functionality at the beginning - of a scene */ + of a scene */ + + /** + * TODO: Pass this onto the context manager + * it may be a good idea to really set the renderTarget at beginScene + * not when set render target is called, but this will be upto the + * context mamager + *****************************/ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p) : stub\n", This); return D3D_OK; @@ -3722,16 +4716,34 @@ HRESULT WINAPI IWineD3DDeviceImpl_EndScene(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + DWORD startTime = 0; + if (TRACE_ON(d3d_timings)) + startTime = GetTickCount(); + TRACE("(%p)\n", This); ENTER_GL(); /* We only have to do this if we need to read the, swapbuffers performs a flush for us */ glFlush(); checkGLcall("glFlush"); + /* Potentially I have to loop through the swapchains, + I should really do this... + IUnknown *targetContainer; + IUnknown *bufferContainter; + + IWineD3DSurface_GetContainer(This->renderTarget, targetContainer); + IWineD3DSurface_GetContainer(This->backBuffer, bufferContainter); + + + if(classof(targetContainer) != SwapChain || classof(bufferContainter) != SwapChain){ + } + ,but as a poor option I can compaire the container aginst the device (This) + since renderTargets that arn't created as part of a swapchain will have + the device as their container. + */ TRACE("End Scene\n"); if(This->renderTarget != NULL){ - /* If the container of the rendertarget is a texture then we need to save the data from the pbuffer */ IUnknown *targetContainer = NULL; if (D3D_OK == IWineD3DSurface_GetContainer(This->renderTarget, &IID_IWineD3DBaseTexture, (void **)&targetContainer)) { TRACE("RenderTarget is either standalone of a texture.\n"); @@ -3744,99 +4756,55 @@ IWineD3DBaseTexture_PreLoad((IWineD3DBaseTexture *)targetContainer); IWineD3DSurface_SetPBufferState(This->renderTarget, FALSE /* inPBuffer */, FALSE /* inTexture */); IUnknown_Release(targetContainer); + } else + if (D3D_OK == IWineD3DSurface_GetContainer(This->renderTarget, &IID_IWineD3DDevice, (void **)&targetContainer)){ + /* Were testing to see if the texture is standalone, standalone textures has a container of IWineD3DDevice */ + FIXME("If your seeing corrupt textures, this may be why\n"); + IWineD3DSurface_SetPBufferState(This->renderTarget, TRUE /* inPBuffer */, FALSE /* inTexture */); + IWineD3DSurface_AddDirtyRect(This->renderTarget, NULL); + IWineD3DSurface_PreLoad(This->renderTarget); + IWineD3DSurface_SetPBufferState(This->renderTarget, FALSE /* inPBuffer */, FALSE /* inTexture */); + IUnknown_Release(targetContainer); } } - LEAVE_GL(); + if (TRACE_ON(d3d_timings)) + TRACE_(d3d_timings)("(%p) starttime %ld, total time %ld\n", This, startTime , GetTickCount() -startTime); + return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_Present(IWineD3DDevice *iface, - CONST RECT* pSourceRect, CONST RECT* pDestRect, +HRESULT WINAPI IWineD3DDeviceImpl_Present(IWineD3DDevice *iface, + CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - TRACE("(%p) Presenting the frame\n", This); - - ENTER_GL(); - - if (pSourceRect || pDestRect) FIXME("Unhandled present options %p/%p\n", pSourceRect, pDestRect); - - glXSwapBuffers(This->display, This->drawable); - /* Don't call checkGLcall, as glGetError is not applicable here */ - - TRACE("glXSwapBuffers called, Starting new frame\n"); - - /* FPS support */ - if (TRACE_ON(d3d_fps)) - { - static long prev_time, frames; - - DWORD time = GetTickCount(); - frames++; - /* every 1.5 seconds */ - if (time - prev_time > 1500) { - TRACE_(d3d_fps)("@ approx %.2ffps\n", 1000.0*frames/(time - prev_time)); - prev_time = time; - frames = 0; - } - } + IWineD3DSwapChain *swapChain = NULL; + int i; + int swapchains = IWineD3DDeviceImpl_GetNumberOfSwapChains(iface); -#if defined(FRAME_DEBUGGING) -{ - if (GetFileAttributesA("C:\\D3DTRACE") != INVALID_FILE_ATTRIBUTES) { - if (!isOn) { - isOn = TRUE; - FIXME("Enabling D3D Trace\n"); - __WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_d3d, 1); -#if defined(SHOW_FRAME_MAKEUP) - FIXME("Singe Frame snapshots Starting\n"); - isDumpingFrames = TRUE; - glClear(GL_COLOR_BUFFER_BIT); -#endif + TRACE("(%p) Presenting the frame\n", This); -#if defined(SINGLE_FRAME_DEBUGGING) - } else { -#if defined(SHOW_FRAME_MAKEUP) - FIXME("Singe Frame snapshots Finishing\n"); - isDumpingFrames = FALSE; -#endif - FIXME("Singe Frame trace complete\n"); - DeleteFileA("C:\\D3DTRACE"); - __WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_d3d, 0); -#endif - } - } else { - if (isOn) { - isOn = FALSE; -#if defined(SHOW_FRAME_MAKEUP) - FIXME("Singe Frame snapshots Finishing\n"); - isDumpingFrames = FALSE; -#endif - FIXME("Disabling D3D Trace\n"); - __WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_d3d, 0); - } - } -} -#endif + for(i = 0 ; i < swapchains ; i ++){ - LEAVE_GL(); - /* Although this is not strictly required, a simple demo showed this does occur - on (at least non-debug) d3d */ - if (This->presentParms.SwapEffect == D3DSWAPEFFECT_DISCARD) { - IWineD3DDevice_Clear(iface, 0, NULL, D3DCLEAR_STENCIL|D3DCLEAR_ZBUFFER|D3DCLEAR_TARGET, 0x00, 1.0, 0); + IWineD3DDeviceImpl_GetSwapChain(iface, i , (IWineD3DSwapChain **)&swapChain); + TRACE("presentinng chain %d, %p\n", i, swapChain); + IWineD3DSwapChain_Present(swapChain, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, 0); + IWineD3DSwapChain_Release(swapChain); } return D3D_OK; } -HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Count, CONST D3DRECT* pRects, +HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; /* TODO: From MSDN This method fails if you specify the D3DCLEAR_ZBUFFER or D3DCLEAR_STENCIL flags when the render target does not have an attached depth buffer. Similarly, if you specify the D3DCLEAR_STENCIL flag when the depth-buffer format does not contain stencil buffer information, this method fails. */ + /* TODO: Check that the scissortests in here doesn't affect DirectX scissor tests */ + /* TODO: what about swapchains? */ GLbitfield glMask = 0; GLboolean old_ztest; GLfloat old_z_clear_value; @@ -3847,7 +4815,6 @@ TRACE("(%p) Count (%ld), pRects (%p), Flags (%lx), Z (%f), Stencil (%ld)\n", This, Count, pRects, Flags, Z, Stencil); - ENTER_GL(); glEnable(GL_SCISSOR_TEST); @@ -3860,7 +4827,7 @@ } /* Only set the values up once, as they are not changing */ - if (Flags & D3DCLEAR_STENCIL) { + if (Flags & D3DCLEAR_STENCIL) { glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &old_stencil_clear_value); glClearStencil(Stencil); checkGLcall("glClearStencil"); @@ -3870,7 +4837,7 @@ if (Flags & D3DCLEAR_ZBUFFER) { glGetBooleanv(GL_DEPTH_WRITEMASK, &old_ztest); - glDepthMask(GL_TRUE); + glDepthMask(GL_TRUE); glGetFloatv(GL_DEPTH_CLEAR_VALUE, &old_z_clear_value); glClearDepth(Z); checkGLcall("glClearDepth"); @@ -3880,9 +4847,9 @@ if (Flags & D3DCLEAR_TARGET) { TRACE("Clearing screen with glClear to color %lx\n", Color); glGetFloatv(GL_COLOR_CLEAR_VALUE, old_color_clear_value); - glClearColor(((Color >> 16) & 0xFF) / 255.0f, + glClearColor(((Color >> 16) & 0xFF) / 255.0f, ((Color >> 8) & 0xFF) / 255.0f, - ((Color >> 0) & 0xFF) / 255.0f, + ((Color >> 0) & 0xFF) / 255.0f, ((Color >> 24) & 0xFF) / 255.0f); checkGLcall("glClearColor"); @@ -3890,28 +4857,31 @@ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glMask = glMask | GL_COLOR_BUFFER_BIT; } - +TRACE("running through each rect\n"); /* Now process each rect in turn */ for (i = 0; i < Count || i == 0; i++) { if (curRect) { /* Note gl uses lower left, width/height */ + /* TODO: repalce impl usage with iface usage */ TRACE("(%p) %p Rect=(%ld,%ld)->(%ld,%ld) glRect=(%ld,%ld), len=%ld, hei=%ld\n", This, curRect, curRect->x1, curRect->y1, curRect->x2, curRect->y2, - curRect->x1, (((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height - curRect->y2), + curRect->x1, (((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height - curRect->y2), curRect->x2 - curRect->x1, curRect->y2 - curRect->y1); - glScissor(curRect->x1, (((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height - curRect->y2), + glScissor(curRect->x1, (((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height - curRect->y2), curRect->x2 - curRect->x1, curRect->y2 - curRect->y1); checkGLcall("glScissor"); } else { - glScissor(This->stateBlock->viewport.X, - (((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height - (This->stateBlock->viewport.Y + This->stateBlock->viewport.Height)), - This->stateBlock->viewport.Width, + glScissor(This->stateBlock->viewport.X, + (((IWineD3DSurfaceImpl *)This->renderTarget)->currentDesc.Height - + (This->stateBlock->viewport.Y + This->stateBlock->viewport.Height)), + This->stateBlock->viewport.Width, This->stateBlock->viewport.Height); checkGLcall("glScissor"); } - /* Clear the selected rectangle (or full screen) */ + /* Clear the selected r + ectangle (or full screen) */ glClear(glMask); checkGLcall("glClear"); @@ -3923,15 +4893,15 @@ if (Flags & D3DCLEAR_STENCIL) { glClearStencil(old_stencil_clear_value); glStencilMask(This->stateBlock->renderState[WINED3DRS_STENCILWRITEMASK]); - } + } if (Flags & D3DCLEAR_ZBUFFER) { glDepthMask(old_ztest); glClearDepth(old_z_clear_value); } if (Flags & D3DCLEAR_TARGET) { - glClearColor(old_color_clear_value[0], + glClearColor(old_color_clear_value[0], old_color_clear_value[1], - old_color_clear_value[2], + old_color_clear_value[2], old_color_clear_value[3]); glColorMask(This->stateBlock->renderState[WINED3DRS_COLORWRITEENABLE] & D3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE, This->stateBlock->renderState[WINED3DRS_COLORWRITEENABLE] & D3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE, @@ -3942,29 +4912,34 @@ glDisable(GL_SCISSOR_TEST); checkGLcall("glDisable"); LEAVE_GL(); - return D3D_OK; } /***** * Drawing functions *****/ -HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitive(IWineD3DDevice *iface, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, +HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitive(IWineD3DDevice *iface, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - This->stateBlock->streamIsUP = FALSE; + DWORD startTime = 0; - TRACE("(%p) : Type=(%d,%s), Start=%d, Count=%d\n", This, PrimitiveType, - debug_d3dprimitivetype(PrimitiveType), + This->stateBlock->streamIsUP = FALSE; + if (TRACE_ON(d3d_timings)) + startTime = GetTickCount(); /* Use windows calls for this */ + TRACE("(%p) : Type=(%d,%s), Start=%d, Count=%d\n", This, PrimitiveType, + debug_d3dprimitivetype(PrimitiveType), StartVertex, PrimitiveCount); drawPrimitive(iface, PrimitiveType, PrimitiveCount, StartVertex, -1, 0, NULL, 0); + if (TRACE_ON(d3d_timings)) + TRACE_(d3d_timings)("(%p) starttime %ld, total time %ld\n", This, startTime , GetTickCount() -startTime); + return D3D_OK; } -/* TODO: baseVIndex needs to be provided from This->stateBlock->baseVertexIndex when called from d3d8 */ -HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice *iface, +/** TODO: baseVIndex needs to be provided from This->stateBlock->baseVertexIndex when called from d3d8 **/ +HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice *iface, D3DPRIMITIVETYPE PrimitiveType, INT baseVIndex, UINT minIndex, UINT NumVertices,UINT startIndex,UINT primCount) { @@ -3973,11 +4948,14 @@ UINT idxStride = 2; IWineD3DIndexBuffer *pIB; D3DINDEXBUFFER_DESC IdxBufDsc; - + DWORD startTime = 0; + if (TRACE_ON(d3d_timings)) + startTime = GetTickCount(); /* Use windows calls for this */ + pIB = This->stateBlock->pIndexData; This->stateBlock->streamIsUP = FALSE; - TRACE("(%p) : Type=(%d,%s), min=%d, CountV=%d, startIdx=%d, baseVidx=%d, countP=%d \n", This, + TRACE("(%p) : Type=(%d,%s), min=%d, CountV=%d, startIdx=%d, baseVidx=%d, countP=%d \n", This, PrimitiveType, debug_d3dprimitivetype(PrimitiveType), minIndex, NumVertices, startIndex, baseVIndex, primCount); @@ -3987,35 +4965,46 @@ } else { idxStride = 4; } - - drawPrimitive(iface, PrimitiveType, primCount, baseVIndex, - startIndex, idxStride, + /** TODO: get rid of the IWineD3DIndexBufferImpl * cast **/ + drawPrimitive(iface, PrimitiveType, primCount, baseVIndex, + startIndex, idxStride, ((IWineD3DIndexBufferImpl *) pIB)->resource.allocatedMemory, minIndex); + if (TRACE_ON(d3d_timings)) + TRACE_(d3d_timings)("(%p) starttime %ld, total time %ld\n", This, startTime , GetTickCount() -startTime); return D3D_OK; } + HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitiveUP(IWineD3DDevice *iface, D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - TRACE("(%p) : Type=(%d,%s), pCount=%d, pVtxData=%p, Stride=%d\n", This, PrimitiveType, - debug_d3dprimitivetype(PrimitiveType), - PrimitiveCount, pVertexStreamZeroData, VertexStreamZeroStride); - - if (This->stateBlock->stream_source[0] != NULL) IWineD3DVertexBuffer_Release(This->stateBlock->stream_source[0]); - + TRACE("(%p) : Type=(%d,%s), pCount=%d, pVtxData=%p, Stride=%d\n", This, PrimitiveType, + debug_d3dprimitivetype(PrimitiveType), + PrimitiveCount, pVertexStreamZeroData, VertexStreamZeroStride); + /* TODO: instancing */ +#if 0 /* move over to using callbacks */ +#else + if(This->stateBlock->streamSource[0] != NULL){ + IWineD3DVertexBuffer_Release(This->stateBlock->streamSource[0]); + } +#endif + TRACE("Setting the stream source to something odd\n"); /* Note in the following, it's not this type, but that's the purpose of streamIsUP */ - This->stateBlock->stream_source[0] = (IWineD3DVertexBuffer *)pVertexStreamZeroData; - This->stateBlock->stream_stride[0] = VertexStreamZeroStride; + This->stateBlock->streamSource[0] = (IWineD3DVertexBuffer *)pVertexStreamZeroData; + This->stateBlock->streamStride[0] = VertexStreamZeroStride; This->stateBlock->streamIsUP = TRUE; + TRACE("calling draw primitive\n"); drawPrimitive(iface, PrimitiveType, PrimitiveCount, 0, 0, 0, NULL, 0); - This->stateBlock->stream_stride[0] = 0; - This->stateBlock->stream_source[0] = NULL; + /* stream zero settings set to null at end, as per the msdn + http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/reference/d3d/interfaces/idirect3ddevice9/DrawPrimitiveUP.asp + */ + This->stateBlock->streamStride[0] = 0; + This->stateBlock->streamSource[0] = NULL; - /*stream zero settings set to null at end, as per the msdn */ return D3D_OK; } @@ -4024,32 +5013,37 @@ UINT NumVertexIndices,UINT PrimitiveCount,CONST void* pIndexData, WINED3DFORMAT IndexDataFormat, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride) { - int idxStride; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + int idxStride; - TRACE("(%p) : Type=(%d,%s), MinVtxIdx=%d, NumVIdx=%d, PCount=%d, pidxdata=%p, IdxFmt=%d, pVtxdata=%p, stride=%d\n", + TRACE("(%p) : Type=(%d,%s), MinVtxIdx=%d, NumVIdx=%d, PCount=%d, pidxdata=%p, IdxFmt=%d, pVtxdata=%p, stride=%d\n", This, PrimitiveType, debug_d3dprimitivetype(PrimitiveType), - MinVertexIndex, NumVertexIndices, PrimitiveCount, pIndexData, + MinVertexIndex, NumVertexIndices, PrimitiveCount, pIndexData, IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride); - if (This->stateBlock->stream_source[0] != NULL) IWineD3DVertexBuffer_Release(This->stateBlock->stream_source[0]); - if (IndexDataFormat == WINED3DFMT_INDEX16) { idxStride = 2; } else { idxStride = 4; } +#if 0 /* move over to using callbacks */ +#else + if(This->stateBlock->streamSource[0] != NULL){ + IWineD3DVertexBuffer_Release(This->stateBlock->streamSource[0]); + } +#endif + /* Note in the following, it's not this type, but that's the purpose of streamIsUP */ - This->stateBlock->stream_source[0] = (IWineD3DVertexBuffer *)pVertexStreamZeroData; + This->stateBlock->streamSource[0] = (IWineD3DVertexBuffer *)pVertexStreamZeroData; This->stateBlock->streamIsUP = TRUE; - This->stateBlock->stream_stride[0] = VertexStreamZeroStride; - + This->stateBlock->streamStride[0] = VertexStreamZeroStride; drawPrimitive(iface, PrimitiveType, PrimitiveCount, 0, 0, idxStride, pIndexData, MinVertexIndex); - - /* stream zero settings set to null at end as per the msdn */ - This->stateBlock->stream_source[0] = NULL; - This->stateBlock->stream_stride[0] = 0; + /* stream zero settings set to null at end as per the msdn + http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/reference/d3d/interfaces/idirect3ddevice9/DrawPrimitiveUP.asp + */ + This->stateBlock->streamSource[0] = NULL; + This->stateBlock->streamStride[0] = 0; IWineD3DDevice_SetIndices(iface, NULL, 0); return D3D_OK; @@ -4057,31 +5051,252 @@ HRESULT WINAPI IWineD3DDeviceImpl_UpdateTexture (IWineD3DDevice *iface, IWineD3DBaseTexture *pSourceTexture, IWineD3DBaseTexture *pDestinationTexture){ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - TRACE("(%p) : stub\n", This); + /* Well it should be easy, just write from one texture in memory to another in video ram */ + + + D3DRESOURCETYPE sourceType; + D3DRESOURCETYPE destinationType; + IWineD3DTextureImpl *pDestTexture = (IWineD3DTextureImpl *)pDestinationTexture; + IWineD3DTextureImpl *pSrcTexture = (IWineD3DTextureImpl *)pSourceTexture; + int i; + DWORD startTime = 0; + if (TRACE_ON(d3d_timings)) + startTime = GetTickCount(); /* Use windows calls for this */ + + sourceType = IWineD3DBaseTexture_GetType(pSourceTexture); + destinationType = IWineD3DBaseTexture_GetType(pDestinationTexture); + if(sourceType != D3DRTYPE_TEXTURE && destinationType != D3DRTYPE_TEXTURE){ + FIXME("(%p) Only D3DRTYPE_TEXTURE to D3DRTYPE_TEXTURE supported\n", This); + return D3DERR_INVALIDCALL; + } + TRACE("(%p) Source %p Destination %p\n", This, pSourceTexture, pDestinationTexture); + + /** TODO: Get rid of the casts to IWineD3DBaseTextureImpl + repalce surfaces[x] with GetSurfaceLevel, or GetCubeMapSurface etc.. + think about moving the code into texture, and adding a member to base texture to occomplish this **/ + + /* Make sure that the destination textrue is loaded */ + IWineD3DBaseTexture_PreLoad(pDestinationTexture); + TRACE("Loading source texture\n"); + + if(pSrcTexture->surfaces[0] == NULL || pDestTexture->surfaces[0] == NULL){ + FIXME("(%p) Texture