mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 22:32:58 +00:00
rewrote NtGdiDdQueryDirectDrawObject for I must have been drunk when I wrote it frist time.
Now we manger getting gdientry2 working more or less here is a log how far I have come I have not implement create surface for the drv yet. But it showing lest how far dxhaltest comes. as u all can see it is not far before we getting dx hal working out of the box from win32k and gdi32. I will thank all people that have been invlove in this, DrFred to helping debug betwin ddraw.dll gdi32.dll with his sniffer apps, Alex for GdiEntry2, and some other help, W3seek, Filip, GvG help me to understand how our win32k how it works and some other info. to make so far posible, it is now posible to load a graphic driver directx hal support in ros. But I do not known how well it works yet, after it is the frist public version that working so far. ddraw.c:60) NtGdiDdCreateDirectDrawObject ddraw.c:140) DirectDraw return handler 0x3b6001e4 ddraw.c:170) NtGdiDdQueryDirectDrawObject ddraw.c:247) Found DirectDraw CallBack for 2D and 3D Hal ddraw.c:170) NtGdiDdQueryDirectDrawObject ddraw.c:247) Found DirectDraw CallBack for 2D and 3D Hal ddraw.c:432) NtGdiDdCanCreateSurface ddraw.c:348) NtGdiDdCreateSurface svn path=/trunk/; revision=23160
This commit is contained in:
parent
b1863c2944
commit
8fdd3538a9
1 changed files with 81 additions and 157 deletions
|
@ -30,9 +30,8 @@ BOOL INTERNAL_CALL
|
||||||
DD_Cleanup(PVOID ObjectBody)
|
DD_Cleanup(PVOID ObjectBody)
|
||||||
{
|
{
|
||||||
PDD_DIRECTDRAW pDirectDraw = (PDD_DIRECTDRAW) ObjectBody;
|
PDD_DIRECTDRAW pDirectDraw = (PDD_DIRECTDRAW) ObjectBody;
|
||||||
#ifdef DX_DEBUG
|
|
||||||
DPRINT1("DD_Cleanup\n");
|
DPRINT1("DD_Cleanup\n");
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!pDirectDraw)
|
if (!pDirectDraw)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -47,9 +46,8 @@ DD_Cleanup(PVOID ObjectBody)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE STDCALL NtGdiDdCreateDirectDrawObject(
|
HANDLE STDCALL
|
||||||
HDC hdc
|
NtGdiDdCreateDirectDrawObject(HDC hdc)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
DD_CALLBACKS callbacks;
|
DD_CALLBACKS callbacks;
|
||||||
DD_SURFACECALLBACKS surface_callbacks;
|
DD_SURFACECALLBACKS surface_callbacks;
|
||||||
|
@ -85,6 +83,11 @@ HANDLE STDCALL NtGdiDdCreateDirectDrawObject(
|
||||||
if (pDC->DriverFunctions.EnableDirectDraw == NULL)
|
if (pDC->DriverFunctions.EnableDirectDraw == NULL)
|
||||||
{
|
{
|
||||||
/* Driver doesn't support DirectDraw */
|
/* Driver doesn't support DirectDraw */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Warring ReactOS complain that pDC are not right owner
|
||||||
|
when DC_UnlockDc(pDC) hit, why ?
|
||||||
|
*/
|
||||||
DC_UnlockDc(pDC);
|
DC_UnlockDc(pDC);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -134,17 +137,14 @@ HANDLE STDCALL NtGdiDdCreateDirectDrawObject(
|
||||||
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
|
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
|
||||||
DC_UnlockDc(pDC);
|
DC_UnlockDc(pDC);
|
||||||
|
|
||||||
DPRINT1("DirectDraw return handler\n");
|
DPRINT1("DirectDraw return handler 0x%x\n",hDirectDraw);
|
||||||
return hDirectDraw;
|
return hDirectDraw;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL STDCALL NtGdiDdDeleteDirectDrawObject(
|
BOOL STDCALL
|
||||||
HANDLE hDirectDrawLocal
|
NtGdiDdDeleteDirectDrawObject( HANDLE hDirectDrawLocal)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
#ifdef DX_DEBUG
|
|
||||||
DPRINT1("NtGdiDdDeleteDirectDrawObject\n");
|
DPRINT1("NtGdiDdDeleteDirectDrawObject\n");
|
||||||
#endif
|
|
||||||
return GDIOBJ_FreeObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
|
return GDIOBJ_FreeObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,59 +162,42 @@ BOOL STDCALL NtGdiDdQueryDirectDrawObject(
|
||||||
DWORD *puFourCC
|
DWORD *puFourCC
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
#ifdef DX_DEBUG
|
DD_HALINFO HalInfo;
|
||||||
PDD_DIRECTDRAW pDirectDraw;
|
PDD_DIRECTDRAW pDirectDraw;
|
||||||
BOOL success;
|
BOOL success;
|
||||||
|
|
||||||
|
|
||||||
DPRINT1("NtGdiDdQueryDirectDrawObject\n");
|
DPRINT1("NtGdiDdQueryDirectDrawObject\n");
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Check for NULL pointer to prevent any one doing a mistake */
|
/* Check for NULL pointer to prevent any one doing a mistake */
|
||||||
|
|
||||||
if (hDirectDrawLocal == NULL)
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (pHalInfo == NULL)
|
if (pHalInfo == NULL)
|
||||||
{
|
{
|
||||||
#ifdef DX_DEBUG
|
|
||||||
DPRINT1("warning pHalInfo buffer is NULL \n");
|
|
||||||
#endif
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( pCallBackFlags == NULL)
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
|
pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
|
||||||
|
|
||||||
|
|
||||||
if (!pDirectDraw)
|
if (!pDirectDraw)
|
||||||
{
|
{
|
||||||
/* Fail to Lock DirectDraw handle */
|
/* Fail to Lock DirectDraw handle */
|
||||||
#ifdef DX_DEBUG
|
|
||||||
DPRINT1(" Fail to Lock DirectDraw handle \n");
|
|
||||||
#endif
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pHalInfo->dwSize = 0;
|
||||||
|
|
||||||
success = pDirectDraw->DrvGetDirectDrawInfo(
|
success = pDirectDraw->DrvGetDirectDrawInfo(
|
||||||
pDirectDraw->Global.dhpdev,
|
pDirectDraw->Global.dhpdev,
|
||||||
pHalInfo,
|
&HalInfo,
|
||||||
puNumHeaps,
|
puNumHeaps,
|
||||||
puvmList,
|
puvmList,
|
||||||
puNumFourCC,
|
puNumFourCC,
|
||||||
|
@ -222,136 +205,77 @@ BOOL STDCALL NtGdiDdQueryDirectDrawObject(
|
||||||
|
|
||||||
if (!success)
|
if (!success)
|
||||||
{
|
{
|
||||||
#ifdef DX_DEBUG
|
DPRINT1("Driver does not fill the Fail to get DirectDraw driver info \n");
|
||||||
DPRINT1(" Fail to get DirectDraw driver info \n");
|
|
||||||
#endif
|
|
||||||
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
|
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
|
||||||
return FALSE;
|
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 */
|
/* rest the flag so we do not need do it later */
|
||||||
pCallBackFlags[0]=0;
|
pCallBackFlags[0]=pDirectDraw->DD.dwFlags;
|
||||||
pCallBackFlags[1]=0;
|
pCallBackFlags[1]=pDirectDraw->Surf.dwFlags;
|
||||||
pCallBackFlags[2]=0;
|
pCallBackFlags[2]=pDirectDraw->Pal.dwFlags;
|
||||||
|
|
||||||
if (pHalInfo)
|
DPRINT1("Found DirectDraw CallBack for 2D and 3D Hal\n");
|
||||||
|
|
||||||
|
RtlMoveMemory(&pDirectDraw->Hal, pHalInfo, sizeof(DD_HALINFO));
|
||||||
|
|
||||||
|
if (pHalInfo->lpD3DGlobalDriverData)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
{
|
msdn say D3DHAL_GLOBALDRIVERDATA and D3DNTHAL_GLOBALDRIVERDATA are not same
|
||||||
DDHALINFO* pHalInfo2 = ((DDHALINFO*) pHalInfo);
|
but if u compare these in msdn it is exacly same
|
||||||
#ifdef DX_DEBUG
|
*/
|
||||||
DPRINT1("Found DirectDraw CallBack for 2D and 3D Hal\n");
|
DPRINT1("Found DirectDraw Global DriverData \n");
|
||||||
#endif
|
RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
|
||||||
RtlMoveMemory(&pDirectDraw->Hal, pHalInfo2, sizeof(DDHALINFO));
|
}
|
||||||
|
/* FIXME
|
||||||
if (pHalInfo2->lpDDExeBufCallbacks)
|
* we missing D3DHAL_CALLBACKS in the headers
|
||||||
{
|
*
|
||||||
#ifdef DX_DEBUG
|
|
||||||
DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n");
|
if (pHalInfo->lpD3DHALCallbacks )
|
||||||
#endif
|
{
|
||||||
/* msdn DDHAL_D3DBUFCALLBACKS = DD_D3DBUFCALLBACKS */
|
DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
|
||||||
RtlMoveMemory(puD3dBufferCallbacks, pHalInfo2->lpDDExeBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
|
RtlMoveMemory(puD3dCallbacks, (ULONG *)pHalInfo->lpD3DHALCallbacks, sizeof( D3DHAL_CALLBACKS ));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DX_DEBUG
|
*/
|
||||||
DPRINT1("Do not support CallBack for 3D Hal\n");
|
if (pHalInfo->lpD3DBufCallbacks)
|
||||||
#endif
|
{
|
||||||
/* FIXME we need D3DHAL be include
|
DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n");
|
||||||
|
/* msdn DDHAL_D3DBUFCALLBACKS = DD_D3DBUFCALLBACKS */
|
||||||
if (pHalInfo2->lpD3DHALCallbacks )
|
RtlMoveMemory(puD3dBufferCallbacks, pHalInfo->lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
|
||||||
{
|
|
||||||
#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");
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
|
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue