diff --git a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c index b44198c9725..24eb967f51a 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c +++ b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c @@ -30,9 +30,8 @@ BOOL INTERNAL_CALL DD_Cleanup(PVOID ObjectBody) { PDD_DIRECTDRAW pDirectDraw = (PDD_DIRECTDRAW) ObjectBody; -#ifdef DX_DEBUG + DPRINT1("DD_Cleanup\n"); -#endif if (!pDirectDraw) return FALSE; @@ -47,9 +46,8 @@ DD_Cleanup(PVOID ObjectBody) return TRUE; } -HANDLE STDCALL NtGdiDdCreateDirectDrawObject( - HDC hdc -) +HANDLE STDCALL +NtGdiDdCreateDirectDrawObject(HDC hdc) { DD_CALLBACKS callbacks; DD_SURFACECALLBACKS surface_callbacks; @@ -85,6 +83,11 @@ HANDLE STDCALL NtGdiDdCreateDirectDrawObject( if (pDC->DriverFunctions.EnableDirectDraw == NULL) { /* Driver doesn't support DirectDraw */ + + /* + Warring ReactOS complain that pDC are not right owner + when DC_UnlockDc(pDC) hit, why ? + */ DC_UnlockDc(pDC); return NULL; } @@ -134,17 +137,14 @@ HANDLE STDCALL NtGdiDdCreateDirectDrawObject( GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); DC_UnlockDc(pDC); - DPRINT1("DirectDraw return handler\n"); + DPRINT1("DirectDraw return handler 0x%x\n",hDirectDraw); return hDirectDraw; } -BOOL STDCALL NtGdiDdDeleteDirectDrawObject( - HANDLE hDirectDrawLocal -) +BOOL STDCALL +NtGdiDdDeleteDirectDrawObject( HANDLE hDirectDrawLocal) { -#ifdef DX_DEBUG DPRINT1("NtGdiDdDeleteDirectDrawObject\n"); -#endif return GDIOBJ_FreeObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW); } @@ -162,59 +162,42 @@ BOOL STDCALL NtGdiDdQueryDirectDrawObject( DWORD *puFourCC ) { -#ifdef DX_DEBUG + DD_HALINFO HalInfo; PDD_DIRECTDRAW pDirectDraw; BOOL success; + + DPRINT1("NtGdiDdQueryDirectDrawObject\n"); -#endif /* Check for NULL pointer to prevent any one doing a mistake */ - if (hDirectDrawLocal == NULL) { -#ifdef DX_DEBUG - DPRINT1("warning hDirectDraw handler is NULL, the handler is DDRAWI_DIRECTDRAW_GBL.hDD\n"); - DPRINT1("and it is NtGdiDdCreateDirectDrawObject return value\n"); -#endif return FALSE; } - if (pHalInfo == NULL) - { -#ifdef DX_DEBUG - DPRINT1("warning pHalInfo buffer is NULL \n"); -#endif + { return FALSE; } if ( pCallBackFlags == NULL) { -#ifdef DX_DEBUG - DPRINT1("warning pCallBackFlags s NULL, the size must be 3*DWORD in follow order \n"); - DPRINT1("pCallBackFlags[0] = flags in DD_CALLBACKS\n"); - DPRINT1("pCallBackFlags[1] = flags in DD_SURFACECALLBACKS\n"); - DPRINT1("pCallBackFlags[2] = flags in DD_PALETTECALLBACKS\n"); -#endif return FALSE; } - - + pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW); - - + if (!pDirectDraw) { /* Fail to Lock DirectDraw handle */ -#ifdef DX_DEBUG - DPRINT1(" Fail to Lock DirectDraw handle \n"); -#endif return FALSE; } + pHalInfo->dwSize = 0; + success = pDirectDraw->DrvGetDirectDrawInfo( pDirectDraw->Global.dhpdev, - pHalInfo, + &HalInfo, puNumHeaps, puvmList, puNumFourCC, @@ -222,136 +205,77 @@ BOOL STDCALL NtGdiDdQueryDirectDrawObject( if (!success) { -#ifdef DX_DEBUG - DPRINT1(" Fail to get DirectDraw driver info \n"); -#endif + DPRINT1("Driver does not fill the Fail to get DirectDraw driver info \n"); + GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); return FALSE; } + + if (HalInfo.dwSize == 0) + { + DPRINT1(" Fail for driver does not fill the DD_HALINFO struct \n"); + GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); + return FALSE; + } - + if (HalInfo.dwSize != sizeof(DD_HALINFO)) + { + if (HalInfo.dwSize == sizeof(DD_HALINFO_V4)) + { + /* NT4 Compatible */ + DPRINT1("Got DD_HALINFO_V4 sturct we convert it to DD_HALINFO \n"); + HalInfo.dwSize = sizeof(DD_HALINFO); + HalInfo.lpD3DGlobalDriverData = NULL; + HalInfo.lpD3DHALCallbacks = NULL; + HalInfo.lpD3DBufCallbacks = NULL; + } + else + { + DPRINT1(" Fail : did not get DD_HALINFO size \n"); + GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); + return FALSE; + } + } + + RtlMoveMemory(pHalInfo, &HalInfo, sizeof(DD_HALINFO)); + /* rest the flag so we do not need do it later */ - pCallBackFlags[0]=0; - pCallBackFlags[1]=0; - pCallBackFlags[2]=0; + pCallBackFlags[0]=pDirectDraw->DD.dwFlags; + pCallBackFlags[1]=pDirectDraw->Surf.dwFlags; + pCallBackFlags[2]=pDirectDraw->Pal.dwFlags; - if (pHalInfo) - { - - { - DDHALINFO* pHalInfo2 = ((DDHALINFO*) pHalInfo); -#ifdef DX_DEBUG - DPRINT1("Found DirectDraw CallBack for 2D and 3D Hal\n"); -#endif - RtlMoveMemory(&pDirectDraw->Hal, pHalInfo2, sizeof(DDHALINFO)); + DPRINT1("Found DirectDraw CallBack for 2D and 3D Hal\n"); - if (pHalInfo2->lpDDExeBufCallbacks) - { -#ifdef DX_DEBUG - DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n"); -#endif - /* msdn DDHAL_D3DBUFCALLBACKS = DD_D3DBUFCALLBACKS */ - RtlMoveMemory(puD3dBufferCallbacks, pHalInfo2->lpDDExeBufCallbacks, sizeof(DD_D3DBUFCALLBACKS)); - } - -#ifdef DX_DEBUG - DPRINT1("Do not support CallBack for 3D Hal\n"); -#endif - /* FIXME we need D3DHAL be include + RtlMoveMemory(&pDirectDraw->Hal, pHalInfo, sizeof(DD_HALINFO)); - if (pHalInfo2->lpD3DHALCallbacks ) - { -#ifdef DX_DEBUG - DPRINT1("Found DirectDraw CallBack for 3D Hal\n"); -#endif - RtlMoveMemory(puD3dCallbacks, (ULONG *)pHalInfo2->lpD3DHALCallbacks, sizeof( D3DHAL_CALLBACKS )); - } - */ - - - /* msdn say D3DHAL_GLOBALDRIVERDATA and D3DNTHAL_GLOBALDRIVERDATA are not same - but if u compare these in msdn it is exacly same */ - - if (pHalInfo->lpD3DGlobalDriverData) - { -#ifdef DX_DEBUG - DPRINT1("Found DirectDraw CallBack for 3D Hal Private \n"); -#endif - RtlMoveMemory(puD3dDriverData, (ULONG *)pHalInfo2->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)); - } - - /* build the flag */ - - if (pHalInfo2->lpDDCallbacks!=NULL) - { -#ifdef DX_DEBUG - DPRINT1("Dectect DirectDraw lpDDCallbacks for 2D Hal flag = %d\n",pHalInfo2->lpDDCallbacks->dwFlags); -#endif - pCallBackFlags[0] = pHalInfo2->lpDDCallbacks->dwFlags; - } - - if (pHalInfo2->lpDDCallbacks!=NULL) - { -#ifdef DX_DEBUG - DPRINT1("Dectect DirectDraw lpDDSurfaceCallbacks for 2D Hal flag = %d\n",pHalInfo2->lpDDSurfaceCallbacks->dwFlags); -#endif - pCallBackFlags[1] = pHalInfo2->lpDDSurfaceCallbacks->dwFlags; - } - - if (pHalInfo2->lpDDCallbacks!=NULL) - { -#ifdef DX_DEBUG - DPRINT1("Dectect DirectDraw lpDDCallbacks for 2D Hal flag = %d\n",pHalInfo2->lpDDPaletteCallbacks->dwFlags); -#endif - pCallBackFlags[2] = pHalInfo2->lpDDPaletteCallbacks->dwFlags; - } - - } - -#ifdef DX_DEBUG - DPRINT1("Found DirectDraw CallBack for 3D Hal\n"); -#endif - RtlMoveMemory(&pDirectDraw->Hal, pHalInfo, sizeof(DD_HALINFO)); - - if (pHalInfo->lpD3DBufCallbacks) - { -#ifdef DX_DEBUG - DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n"); -#endif - RtlMoveMemory(puD3dBufferCallbacks, pHalInfo->lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS)); - } - - if (pHalInfo->lpD3DHALCallbacks) - { -#ifdef DX_DEBUG - DPRINT1("Found DirectDraw CallBack for 3D Hal\n"); -#endif - RtlMoveMemory(puD3dCallbacks, pHalInfo->lpD3DHALCallbacks, sizeof(D3DNTHAL_CALLBACKS)); - } - - if (pHalInfo->lpD3DGlobalDriverData) - { -#ifdef DX_DEBUG - DPRINT1("Found DirectDraw CallBack for 3D Hal Private \n"); -#endif - RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)); - } - -#ifdef DX_DEBUG - DPRINT1("Unkown DirectX driver interface\n"); -#endif - - } - -#ifdef DX_DEBUG - else - { - DPRINT1("No DirectDraw Hal info have been found, it did not fail, it did gather some other info \n"); + if (pHalInfo->lpD3DGlobalDriverData) + { + /* + msdn say D3DHAL_GLOBALDRIVERDATA and D3DNTHAL_GLOBALDRIVERDATA are not same + but if u compare these in msdn it is exacly same + */ + DPRINT1("Found DirectDraw Global DriverData \n"); + RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)); } -#endif - - GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); + /* FIXME + * we missing D3DHAL_CALLBACKS in the headers + * + if (pHalInfo->lpD3DHALCallbacks ) + { + DPRINT1("Found DirectDraw CallBack for 3D Hal\n"); + RtlMoveMemory(puD3dCallbacks, (ULONG *)pHalInfo->lpD3DHALCallbacks, sizeof( D3DHAL_CALLBACKS )); + } + + */ + if (pHalInfo->lpD3DBufCallbacks) + { + DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n"); + /* msdn DDHAL_D3DBUFCALLBACKS = DD_D3DBUFCALLBACKS */ + RtlMoveMemory(puD3dBufferCallbacks, pHalInfo->lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS)); + } + + GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); return TRUE; }