From f8757ee82429004556eafbf43269c2f67f21faad Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Sun, 17 Jun 2007 15:19:59 +0000 Subject: [PATCH] GetCaps are complete, not tested in all case but almost all svn path=/trunk/; revision=27216 --- reactos/dll/directx/ddraw/Ddraw/GetCaps.c | 269 +++++++++++++++++++ reactos/dll/directx/ddraw/Ddraw/ddraw_main.c | 164 +---------- reactos/dll/directx/ddraw/ddraw.rbuild | 1 + 3 files changed, 271 insertions(+), 163 deletions(-) create mode 100644 reactos/dll/directx/ddraw/Ddraw/GetCaps.c diff --git a/reactos/dll/directx/ddraw/Ddraw/GetCaps.c b/reactos/dll/directx/ddraw/Ddraw/GetCaps.c new file mode 100644 index 00000000000..8724cc5c2e1 --- /dev/null +++ b/reactos/dll/directx/ddraw/Ddraw/GetCaps.c @@ -0,0 +1,269 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS DirectX + * FILE: ddraw/ddraw/ddraw_main.c + * PURPOSE: IDirectDraw7 Implementation + * PROGRAMMER: Magnus Olsen + * + */ + +/* TODO + * lpddNLVHELCaps and lpddNLVCaps + * Thouse two can be null or inviald in lpGBL + * we need add code in startup to detect if we have lpddNLVCaps set + * ms HEL does not support lpddNLVHELCaps shall we do that ? + * ms HEL does not support dwVidMemTotal and dwVidMemFree shall we implement a emulate of them ? + */ + +#include "rosdraw.h" + +#include + +/* PSEH for SEH Support */ +#include + + +HRESULT WINAPI +Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps, + LPDDCAPS pHELCaps) +{ + HRESULT retVal = DDERR_INVALIDPARAMS; + LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; + + DX_WINDBG_trace(); + + _SEH_TRY + { + if ((!pDriverCaps) && (!pHELCaps)) + { + retVal = DDERR_INVALIDPARAMS; + _SEH_LEAVE; + } + + if (pDriverCaps) + { + /* Setup hardware caps */ + DDSCAPS2 ddscaps = { 0 }; + LPDDCORECAPS CoreCaps = (LPDDCORECAPS)&This->lpLcl->lpGbl->ddCaps; + + DWORD dwTotal = 0; + DWORD dwFree = 0; + + Main_DirectDraw_GetAvailableVidMem4(iface, &ddscaps, &dwTotal, &dwFree); + + switch (pDriverCaps->dwSize) + { + case sizeof(DDCAPS_DX1): + { + LPDDCAPS_DX1 myCaps = (LPDDCAPS_DX1) pDriverCaps; + + if (CoreCaps->dwSize == sizeof(DDCORECAPS)) + { + memcpy(myCaps, CoreCaps, sizeof(DDCAPS_DX1)); + } + + myCaps->dwVidMemFree = dwFree; + myCaps->dwVidMemTotal = dwTotal; + myCaps->dwSize = sizeof(DDCAPS_DX1); + + retVal = DD_OK; + } + break; + + case sizeof(DDCAPS_DX3): + { + LPDDCAPS_DX3 myCaps = (LPDDCAPS_DX3) pDriverCaps; + + if (CoreCaps->dwSize == sizeof(DDCORECAPS)) + { + memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCAPS_DX3)); + } + + myCaps->dwVidMemFree = dwFree; + myCaps->dwVidMemTotal = dwTotal; + myCaps->dwSize = sizeof(DDCAPS_DX3); + + retVal = DD_OK; + } + break; + + case sizeof(DDCAPS_DX5): + { + LPDDCAPS_DX5 myCaps = (LPDDCAPS_DX5) pDriverCaps; + + /* FIXME This->lpLcl->lpGbl->lpddNLVCaps are not set in startup.c + if (This->lpLcl->lpGbl->lpddNLVCaps->dwSize == sizeof(DDNONLOCALVIDMEMCAPS)) + { + memcpy(&myCaps->dwNLVBCaps, This->lpLcl->lpGbl->lpddNLVCaps, sizeof(DDNONLOCALVIDMEMCAPS)); + } + */ + memset(myCaps->dwNLVBCaps,0,sizeof(DDNONLOCALVIDMEMCAPS)); + + if (CoreCaps->dwSize == sizeof(DDCORECAPS)) + { + memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS)); + } + + myCaps->dwVidMemFree = dwFree; + myCaps->dwVidMemTotal = dwTotal; + myCaps->dwSize = sizeof(DDCAPS_DX5); + + retVal = DD_OK; + } + break; + + /* DDCAPS_DX6 is same as DDCAPS_DX7 */ + case sizeof(DDCAPS_DX7): + { + LPDDCAPS_DX7 myCaps = (LPDDCAPS_DX7) pDriverCaps; + + /* FIXME This->lpLcl->lpGbl->lpddNLVCaps are not set in startup.c + if (This->lpLcl->lpGbl->lpddNLVCaps->dwSize == sizeof(DDNONLOCALVIDMEMCAPS)) + { + memcpy(&myCaps->dwNLVBCaps, This->lpLcl->lpGbl->lpddNLVCaps, sizeof(DDNONLOCALVIDMEMCAPS)); + } + */ + memset(myCaps->dwNLVBCaps,0,sizeof(DDNONLOCALVIDMEMCAPS)); + + if (CoreCaps->dwSize == sizeof(DDCORECAPS)) + { + memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS)); + } + + myCaps->dwVidMemFree = dwFree; + myCaps->dwVidMemTotal = dwTotal; + + myCaps->ddsCaps.dwCaps = myCaps->ddsOldCaps.dwCaps; + myCaps->ddsCaps.dwCaps2 = 0; + myCaps->ddsCaps.dwCaps3 = 0; + myCaps->ddsCaps.dwCaps4 = 0; + myCaps->dwSize = sizeof(DDCAPS_DX7); + + } + break; + + default: + retVal = DDERR_INVALIDPARAMS; + break; + } + } + + if (pHELCaps) + { + /* Setup software caps */ + DDSCAPS2 ddscaps = { 0 }; + LPDDCORECAPS CoreCaps = (LPDDCORECAPS)&This->lpLcl->lpGbl->ddHELCaps; + + DWORD dwTotal = 0; + DWORD dwFree = 0; + + Main_DirectDraw_GetAvailableVidMem4(iface, &ddscaps, &dwTotal, &dwFree); + + switch (pHELCaps->dwSize) + { + case sizeof(DDCAPS_DX1): + { + LPDDCAPS_DX1 myCaps = (LPDDCAPS_DX1) pHELCaps; + + if (CoreCaps->dwSize == sizeof(DDCORECAPS)) + { + memcpy(myCaps, CoreCaps, sizeof(DDCAPS_DX1)); + } + + myCaps->dwVidMemFree = dwFree; + myCaps->dwVidMemTotal = dwTotal; + myCaps->dwSize = sizeof(DDCAPS_DX1); + + retVal = DD_OK; + } + break; + + case sizeof(DDCAPS_DX3): + { + LPDDCAPS_DX3 myCaps = (LPDDCAPS_DX3) pHELCaps; + + if (CoreCaps->dwSize == sizeof(DDCORECAPS)) + { + memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCAPS_DX3)); + } + + myCaps->dwVidMemFree = dwFree; + myCaps->dwVidMemTotal = dwTotal; + myCaps->dwSize = sizeof(DDCAPS_DX3); + + retVal = DD_OK; + } + break; + + case sizeof(DDCAPS_DX5): + { + LPDDCAPS_DX5 myCaps = (LPDDCAPS_DX5) pHELCaps; + + /* FIXME This->lpLcl->lpGbl->lpddNLVHELCaps are not set in startup.c + if (This->lpLcl->lpGbl->lpddNLVHELCaps->dwSize == sizeof(DDNONLOCALVIDMEMCAPS)) + { + memcpy(&myCaps->dwNLVBCaps, This->lpLcl->lpGbl->lpddNLVHELCaps, sizeof(DDNONLOCALVIDMEMCAPS)); + } + */ + memset(myCaps->dwNLVBCaps,0,sizeof(DDNONLOCALVIDMEMCAPS)); + + if (CoreCaps->dwSize == sizeof(DDCORECAPS)) + { + memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS)); + } + + myCaps->dwVidMemFree = dwFree; + myCaps->dwVidMemTotal = dwTotal; + myCaps->dwSize = sizeof(DDCAPS_DX5); + + retVal = DD_OK; + } + break; + + /* DDCAPS_DX6 is same as DDCAPS_DX7 */ + case sizeof(DDCAPS_DX7): + { + LPDDCAPS_DX7 myCaps = (LPDDCAPS_DX7) pHELCaps; + + /* FIXME This->lpLcl->lpGbl->lpddNLVHELCaps are not set in startup.c + if (This->lpLcl->lpGbl->lpddNLVHELCaps->dwSize == sizeof(DDNONLOCALVIDMEMCAPS)) + { + memcpy(&myCaps->dwNLVBCaps, This->lpLcl->lpGbl->lpddNLVHELCaps, sizeof(DDNONLOCALVIDMEMCAPS)); + } + */ + memset(myCaps->dwNLVBCaps,0,sizeof(DDNONLOCALVIDMEMCAPS)); + + if (CoreCaps->dwSize == sizeof(DDCORECAPS)) + { + memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS)); + } + + myCaps->dwVidMemFree = dwFree; + myCaps->dwVidMemTotal = dwTotal; + + myCaps->ddsCaps.dwCaps = myCaps->ddsOldCaps.dwCaps; + myCaps->ddsCaps.dwCaps2 = 0; + myCaps->ddsCaps.dwCaps3 = 0; + myCaps->ddsCaps.dwCaps4 = 0; + myCaps->dwSize = sizeof(DDCAPS_DX7); + + } + break; + + default: + retVal = DDERR_INVALIDPARAMS; + break; + } + } + + + } + _SEH_HANDLE + { + retVal = DD_FALSE; + } + _SEH_END; + + return retVal; +} \ No newline at end of file diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c b/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c index 67bbee7c50b..b0f7b81b7e5 100644 --- a/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c +++ b/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c @@ -451,168 +451,6 @@ Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD lpNumCodes, LPDWORD return retVal; } -HRESULT WINAPI -Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps, - LPDDCAPS pHELCaps) -{ - HRESULT retVal = DDERR_INVALIDPARAMS; - LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; - - DX_WINDBG_trace(); - - _SEH_TRY - { - if ((!pDriverCaps) && (!pHELCaps)) - { - retVal = DDERR_INVALIDPARAMS; - _SEH_LEAVE; - } - - if (pDriverCaps) - { - /* Setup hardware caps */ - DDSCAPS2 ddscaps = { 0 }; - LPDDCORECAPS CoreCaps = (LPDDCORECAPS)&This->lpLcl->lpGbl->ddCaps; - - DWORD dwTotal = 0; - DWORD dwFree = 0; - - Main_DirectDraw_GetAvailableVidMem4(iface, &ddscaps, &dwTotal, &dwFree); - - switch (pDriverCaps->dwSize) - { - case sizeof(DDCAPS_DX1): - { - LPDDCAPS_DX1 myCaps = (LPDDCAPS_DX1) pDriverCaps; - - if (CoreCaps->dwSize == sizeof(DDCORECAPS)) - { - memcpy(myCaps, CoreCaps, sizeof(DDCAPS_DX1)); - } - - myCaps->dwVidMemFree = dwFree; - myCaps->dwVidMemTotal = dwTotal; - myCaps->dwSize = sizeof(DDCAPS_DX1); - - retVal = DD_OK; - } - break; - - case sizeof(DDCAPS_DX3): - { - LPDDCAPS_DX3 myCaps = (LPDDCAPS_DX3) pDriverCaps; - - if (CoreCaps->dwSize == sizeof(DDCORECAPS)) - { - memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCAPS_DX3)); - } - - myCaps->dwVidMemFree = dwFree; - myCaps->dwVidMemTotal = dwTotal; - myCaps->dwSize = sizeof(DDCAPS_DX3); - - retVal = DD_OK; - } - break; - - case sizeof(DDCAPS_DX5): - { - LPDDCAPS_DX5 myCaps = (LPDDCAPS_DX5) pDriverCaps; - - /* FIXME This->lpLcl->lpGbl->lpddNLVCaps are not set in startup.c - if (This->lpLcl->lpGbl->lpddNLVCaps->dwSize == sizeof(DDNONLOCALVIDMEMCAPS)) - { - memcpy(&myCaps->dwNLVBCaps, This->lpLcl->lpGbl->lpddNLVCaps, sizeof(DDNONLOCALVIDMEMCAPS)); - } - */ - memset(myCaps->dwNLVBCaps,0,sizeof(DDNONLOCALVIDMEMCAPS)); - - if (CoreCaps->dwSize == sizeof(DDCORECAPS)) - { - memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS)); - } - - myCaps->dwVidMemFree = dwFree; - myCaps->dwVidMemTotal = dwTotal; - myCaps->dwSize = sizeof(DDCAPS_DX5); - - retVal = DD_OK; - } - break; - - /* DDCAPS_DX6 is same as DDCAPS_DX7 */ - case sizeof(DDCAPS_DX7): - { - LPDDCAPS_DX7 myCaps = (LPDDCAPS_DX7) pDriverCaps; - - /* FIXME This->lpLcl->lpGbl->lpddNLVCaps are not set in startup.c - if (This->lpLcl->lpGbl->lpddNLVCaps->dwSize == sizeof(DDNONLOCALVIDMEMCAPS)) - { - memcpy(&myCaps->dwNLVBCaps, This->lpLcl->lpGbl->lpddNLVCaps, sizeof(DDNONLOCALVIDMEMCAPS)); - } - */ - memset(myCaps->dwNLVBCaps,0,sizeof(DDNONLOCALVIDMEMCAPS)); - - if (CoreCaps->dwSize == sizeof(DDCORECAPS)) - { - memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS)); - } - - myCaps->dwVidMemFree = dwFree; - myCaps->dwVidMemTotal = dwTotal; - - myCaps->ddsCaps.dwCaps = myCaps->ddsOldCaps.dwCaps; - myCaps->ddsCaps.dwCaps2 = 0; - myCaps->ddsCaps.dwCaps3 = 0; - myCaps->ddsCaps.dwCaps4 = 0; - myCaps->dwSize = sizeof(DDCAPS_DX7); - - } - break; - - default: - retVal = DDERR_INVALIDPARAMS; - break; - } - } - - if (pHELCaps) - { - /* Setup software caps */ - switch (pHELCaps->dwSize) - { - case sizeof(DDCAPS_DX1): - retVal = DDERR_INVALIDPARAMS; - break; - case sizeof(DDCAPS_DX3): - retVal = DDERR_INVALIDPARAMS; - break; - case sizeof(DDCAPS_DX5): - retVal = DDERR_INVALIDPARAMS; - break; - - /* DDCAPS_DX6 is same as DDCAPS_DX7 */ - case sizeof(DDCAPS_DX7): - retVal = DDERR_INVALIDPARAMS; - break; - default: - retVal = DDERR_INVALIDPARAMS; - break; - } - } - } - _SEH_HANDLE - { - retVal = DD_FALSE; - } - _SEH_END; - - return retVal; -} - - - - /* * We can optain the version of the directdraw object by compare the @@ -699,7 +537,7 @@ IDirectDraw7Vtbl DirectDraw7_Vtable = Main_DirectDraw_EnumDisplayModes, /* (EnumDisplayModes testing / devloping) */ Main_DirectDraw_EnumSurfaces, Main_DirectDraw_FlipToGDISurface, - Main_DirectDraw_GetCaps, /* (GetCaps testing / devloping) */ + Main_DirectDraw_GetCaps, /* (GetCaps done) */ Main_DirectDraw_GetDisplayMode, /* (GetDisplayMode testing / devloping) */ Main_DirectDraw_GetFourCCCodes, /* (GetFourCCCodes done) */ Main_DirectDraw_GetGDISurface, diff --git a/reactos/dll/directx/ddraw/ddraw.rbuild b/reactos/dll/directx/ddraw/ddraw.rbuild index 12013346f43..004fc6bd59a 100644 --- a/reactos/dll/directx/ddraw/ddraw.rbuild +++ b/reactos/dll/directx/ddraw/ddraw.rbuild @@ -27,6 +27,7 @@ ddraw_main.c ddraw_displaymode.c ddraw_setcooperativelevel.c + GetCaps.c GetDeviceIdentifier.c ddraw_stubs.c callbacks_dd_hel.c