2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Native DirectDraw implementation
5 * FILE: subsys/win32k/ntddraw/ddraw.c
6 * PROGRAMER: Peter Bajusz (hyp-x@stormregion.com)
8 * 25-10-2003 PB Created
16 /************************************************************************/
17 /* DIRECT DRAW OBJECT */
18 /************************************************************************/
21 DD_Cleanup(PVOID ObjectBody
)
23 PDD_DIRECTDRAW pDD
= (PDD_DIRECTDRAW
)ObjectBody
;
24 pDD
->DrvDisableDirectDraw(pDD
->Global
.dhpdev
);
28 HANDLE STDCALL
NtGdiDdCreateDirectDrawObject(
32 DD_CALLBACKS callbacks
;
33 DD_SURFACECALLBACKS surface_callbacks
;
34 DD_PALETTECALLBACKS palette_callbacks
;
36 RtlZeroMemory(&callbacks
, sizeof(callbacks
));
37 callbacks
.dwSize
= sizeof(callbacks
);
38 RtlZeroMemory(&surface_callbacks
, sizeof(surface_callbacks
));
39 surface_callbacks
.dwSize
= sizeof(surface_callbacks
);
40 RtlZeroMemory(&palette_callbacks
, sizeof(palette_callbacks
));
41 palette_callbacks
.dwSize
= sizeof(palette_callbacks
);
43 DC
*pDC
= DC_LockDc(hdc
);
47 if (!pDC
->DriverFunctions
.EnableDirectDraw
)
49 // Driver doesn't support DirectDraw
56 BOOL success
= pDC
->DriverFunctions
.EnableDirectDraw(
57 pDC
->PDev
, &callbacks
, &surface_callbacks
, &palette_callbacks
);
61 // DirectDraw creation failed
66 HANDLE hDirectDraw
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW
);
67 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
69 pDirectDraw
->Global
.dhpdev
= pDC
->PDev
;
70 pDirectDraw
->Local
.lpGbl
= &pDirectDraw
->Global
;
72 pDirectDraw
->DrvGetDirectDrawInfo
= pDC
->DriverFunctions
.GetDirectDrawInfo
;
73 pDirectDraw
->DrvDisableDirectDraw
= pDC
->DriverFunctions
.DisableDirectDraw
;
75 if (callbacks
.dwFlags
& DDHAL_CB32_CREATESURFACE
)
76 pDirectDraw
->DdCreateSurface
= callbacks
.CreateSurface
;
77 if (callbacks
.dwFlags
& DDHAL_CB32_SETCOLORKEY
)
78 pDirectDraw
->DdDrvSetColorKey
= callbacks
.SetColorKey
;
79 if (callbacks
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
)
80 pDirectDraw
->DdWaitForVerticalBlank
= callbacks
.WaitForVerticalBlank
;
81 if (callbacks
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
)
82 pDirectDraw
->DdCanCreateSurface
= callbacks
.CanCreateSurface
;
83 if (callbacks
.dwFlags
& DDHAL_CB32_CREATEPALETTE
)
84 pDirectDraw
->DdCreatePalette
= callbacks
.CreatePalette
;
85 if (callbacks
.dwFlags
& DDHAL_CB32_GETSCANLINE
)
86 pDirectDraw
->DdGetScanLine
= callbacks
.GetScanLine
;
87 if (callbacks
.dwFlags
& DDHAL_CB32_MAPMEMORY
)
88 pDirectDraw
->DdMapMemory
= callbacks
.MapMemory
;
90 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
)
91 pDirectDraw
->DdDestroySurface
= surface_callbacks
.DestroySurface
;
92 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_FLIP
)
93 pDirectDraw
->DdFlip
= surface_callbacks
.Flip
;
94 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
)
95 pDirectDraw
->DdSetClipList
= surface_callbacks
.SetClipList
;
96 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_LOCK
)
97 pDirectDraw
->DdLock
= surface_callbacks
.Lock
;
98 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_UNLOCK
)
99 pDirectDraw
->DdUnlock
= surface_callbacks
.Unlock
;
100 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_BLT
)
101 pDirectDraw
->DdBlt
= surface_callbacks
.Blt
;
102 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
)
103 pDirectDraw
->DdSetColorKey
= surface_callbacks
.SetColorKey
;
104 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
)
105 pDirectDraw
->DdAddAttachedSurface
= surface_callbacks
.AddAttachedSurface
;
106 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
)
107 pDirectDraw
->DdGetBltStatus
= surface_callbacks
.GetBltStatus
;
108 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
)
109 pDirectDraw
->DdGetFlipStatus
= surface_callbacks
.GetFlipStatus
;
110 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
)
111 pDirectDraw
->DdUpdateOverlay
= surface_callbacks
.UpdateOverlay
;
112 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
)
113 pDirectDraw
->DdSetOverlayPosition
= surface_callbacks
.SetOverlayPosition
;
114 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
)
115 pDirectDraw
->DdSetPalette
= surface_callbacks
.SetPalette
;
117 if (palette_callbacks
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
)
118 pDirectDraw
->DdDestroyPalette
= palette_callbacks
.DestroyPalette
;
119 if (palette_callbacks
.dwFlags
& DDHAL_PALCB32_SETENTRIES
)
120 pDirectDraw
->DdSetEntries
= palette_callbacks
.SetEntries
;
122 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
128 BOOL STDCALL
NtGdiDdDeleteDirectDrawObject(
129 HANDLE hDirectDrawLocal
132 return GDIOBJ_FreeObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
135 BOOL STDCALL
NtGdiDdQueryDirectDrawObject(
136 HANDLE hDirectDrawLocal
,
137 DD_HALINFO
*pHalInfo
,
138 DWORD
*pCallBackFlags
,
139 PD3DNTHAL_CALLBACKS puD3dCallbacks
,
140 PD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData
,
141 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks
,
142 LPDDSURFACEDESC puD3dTextureFormats
,
144 VIDEOMEMORY
*puvmList
,
149 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
153 BOOL success
= pDirectDraw
->DrvGetDirectDrawInfo(
154 pDirectDraw
->Global
.dhpdev
,
163 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
167 if (pHalInfo
->lpD3DHALCallbacks
)
169 RtlMoveMemory(puD3dCallbacks
, pHalInfo
->lpD3DHALCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
170 pDirectDraw
->D3dContextCreate
= puD3dCallbacks
->ContextCreate
;
171 pDirectDraw
->D3dContextDestroy
= puD3dCallbacks
->ContextDestroy
;
174 if (pHalInfo
->lpD3DGlobalDriverData
)
176 RtlMoveMemory(puD3dDriverData
, pHalInfo
->lpD3DGlobalDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
179 if (pHalInfo
->lpD3DBufCallbacks
)
181 RtlMoveMemory(puD3dBufferCallbacks
, pHalInfo
->lpD3DBufCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
182 pDirectDraw
->DdCanCreateD3DBuffer
= puD3dBufferCallbacks
->CanCreateD3DBuffer
;
183 pDirectDraw
->DdCreateD3DBuffer
= puD3dBufferCallbacks
->CreateD3DBuffer
;
184 pDirectDraw
->DdDestroyD3DBuffer
= puD3dBufferCallbacks
->DestroyD3DBuffer
;
185 pDirectDraw
->DdLockD3DBuffer
= puD3dBufferCallbacks
->LockD3DBuffer
;
186 pDirectDraw
->DdUnlockD3DBuffer
= puD3dBufferCallbacks
->UnlockD3DBuffer
;
190 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
195 /************************************************************************/
197 /************************************************************************/
200 DDSURF_Cleanup(PVOID pDDSurf
)
203 * PDD_SURFACE pDDSurf = PVOID pDDSurf
208 HANDLE STDCALL
NtGdiDdCreateSurfaceObject(
209 HANDLE hDirectDrawLocal
,
211 PDD_SURFACE_LOCAL puSurfaceLocal
,
212 PDD_SURFACE_MORE puSurfaceMore
,
213 PDD_SURFACE_GLOBAL puSurfaceGlobal
,
217 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
222 hSurface
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE
);
224 PDD_SURFACE pSurface
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
225 /* FIXME - Handle pSurface == NULL!!!! */
227 RtlMoveMemory(&pSurface
->Local
, puSurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
228 RtlMoveMemory(&pSurface
->More
, puSurfaceMore
, sizeof(DD_SURFACE_MORE
));
229 RtlMoveMemory(&pSurface
->Global
, puSurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
230 pSurface
->Local
.lpGbl
= &pSurface
->Global
;
231 pSurface
->Local
.lpSurfMore
= &pSurface
->More
;
232 pSurface
->Local
.lpAttachList
= NULL
;
233 pSurface
->Local
.lpAttachListFrom
= NULL
;
234 pSurface
->More
.lpVideoPort
= NULL
;
235 // FIXME: figure out how to use this
236 pSurface
->bComplete
= bComplete
;
238 GDIOBJ_UnlockObjByPtr(pSurface
);
239 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
244 BOOL STDCALL
NtGdiDdDeleteSurfaceObject(
248 return GDIOBJ_FreeObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
252 BOOL STDCALL NtGdiDdAttachSurface(
257 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
260 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
263 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
267 if (pSurfaceFrom->Local.lpAttachListFrom)
269 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
272 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
273 GDIOBJ_UnlockObjByPtr(pSurfaceTo);
280 DWORD STDCALL
NtGdiDdGetDriverInfo(
281 HANDLE hDirectDrawLocal
,
282 PDD_GETDRIVERINFODATA puGetDriverInfoData
)
286 VIDEOMEMORY
*pvmList
= NULL
;
288 DWORD
*pdwFourCC
= NULL
;
291 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
294 ddRVal
= pDirectDraw
->DrvGetDirectDrawInfo(
295 pDirectDraw
->Global
.dhpdev
,(PDD_HALINFO
) puGetDriverInfoData
,
296 &pdwNumHeaps
, pvmList
, &pdwNumFourCC
, pdwFourCC
);
298 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
305 DWORD STDCALL
NtGdiDdWaitForVerticalBlank(
306 HANDLE hDirectDrawLocal
,
307 PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
311 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
313 puWaitForVerticalBlankData
->lpDD
= pDirectDraw
->Local
.lpGbl
;
315 ddRVal
= pDirectDraw
->DdWaitForVerticalBlank(puWaitForVerticalBlankData
);
317 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
323 DWORD STDCALL
NtGdiDdCanCreateSurface(
324 HANDLE hDirectDrawLocal
,
325 PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
330 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
332 puCanCreateSurfaceData
->lpDD
= pDirectDraw
->Local
.lpGbl
;
334 ddRVal
= pDirectDraw
->DdCanCreateSurface(puCanCreateSurfaceData
);
336 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
343 DWORD STDCALL
NtGdiDdBlt(
346 PDD_BLTDATA puBltData
351 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDest
, GDI_OBJECT_TYPE_DIRECTDRAW
);
353 puBltData
->lpDDDestSurface
= hSurfaceDest
;
354 puBltData
->lpDDSrcSurface
= hSurfaceSrc
;
355 puBltData
->lpDD
= pDirectDraw
->Local
.lpGbl
;
357 ddRVal
= pDirectDraw
->DdBlt(puBltData
);
359 GDIOBJ_UnlockObjByPtr(pDirectDraw
);