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 pDirectDraw
= GDIOBJ_LockObj(ObjectBody
, GDI_OBJECT_TYPE_DIRECTDRAW
);
27 pDirectDraw
->DrvDisableDirectDraw(pDirectDraw
->Global
.dhpdev
);
29 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
33 HANDLE STDCALL
NtGdiDdCreateDirectDrawObject(
37 DD_CALLBACKS callbacks
;
38 DD_SURFACECALLBACKS surface_callbacks
;
39 DD_PALETTECALLBACKS palette_callbacks
;
41 RtlZeroMemory(&callbacks
, sizeof(DD_CALLBACKS
));
42 callbacks
.dwSize
= sizeof(DD_CALLBACKS
);
43 RtlZeroMemory(&surface_callbacks
, sizeof(DD_SURFACECALLBACKS
));
44 surface_callbacks
.dwSize
= sizeof(DD_SURFACECALLBACKS
);
45 RtlZeroMemory(&palette_callbacks
, sizeof(DD_PALETTECALLBACKS
));
46 palette_callbacks
.dwSize
= sizeof(DD_PALETTECALLBACKS
);
49 DC
*pDC
= DC_LockDc(hdc
);
53 if (!pDC
->DriverFunctions
.EnableDirectDraw
)
55 // Driver doesn't support DirectDraw
60 BOOL success
= pDC
->DriverFunctions
.EnableDirectDraw(
61 pDC
->PDev
, &callbacks
, &surface_callbacks
, &palette_callbacks
);
65 // DirectDraw creation failed
70 HANDLE hDirectDraw
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW
);
78 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
87 pDirectDraw
->Global
.dhpdev
= pDC
->PDev
;
88 pDirectDraw
->Local
.lpGbl
= &pDirectDraw
->Global
;
90 pDirectDraw
->DrvGetDirectDrawInfo
= pDC
->DriverFunctions
.GetDirectDrawInfo
;
91 pDirectDraw
->DrvDisableDirectDraw
= pDC
->DriverFunctions
.DisableDirectDraw
;
93 /* DD_CALLBACKS setup */
94 RtlMoveMemory(&pDirectDraw
->DD
, &callbacks
, sizeof(DD_CALLBACKS
));
96 /* DD_SURFACECALLBACKS setup*/
97 RtlMoveMemory(&pDirectDraw
->Surf
, &surface_callbacks
, sizeof(DD_SURFACECALLBACKS
));
99 /* DD_PALETTECALLBACKS setup*/
100 RtlMoveMemory(&pDirectDraw
->Pal
, &surface_callbacks
, sizeof(DD_PALETTECALLBACKS
));
102 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
108 BOOL STDCALL
NtGdiDdDeleteDirectDrawObject(
109 HANDLE hDirectDrawLocal
112 return GDIOBJ_FreeObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
115 BOOL STDCALL
NtGdiDdQueryDirectDrawObject(
116 HANDLE hDirectDrawLocal
,
117 DD_HALINFO
*pHalInfo
,
118 DWORD
*pCallBackFlags
,
119 PD3DNTHAL_CALLBACKS puD3dCallbacks
,
120 PD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData
,
121 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks
,
122 LPDDSURFACEDESC puD3dTextureFormats
,
124 VIDEOMEMORY
*puvmList
,
129 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
133 BOOL success
= pDirectDraw
->DrvGetDirectDrawInfo(
134 pDirectDraw
->Global
.dhpdev
,
143 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
149 RtlMoveMemory(&pDirectDraw
->Hal
, pHalInfo
, sizeof(DD_HALINFO
));
151 if (pHalInfo
->lpD3DHALCallbacks
)
153 RtlMoveMemory(puD3dCallbacks
, pHalInfo
->lpD3DHALCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
156 if (pHalInfo
->lpD3DGlobalDriverData
)
158 RtlMoveMemory(puD3dDriverData
, pHalInfo
->lpD3DGlobalDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
160 if (pHalInfo
->lpD3DBufCallbacks
)
162 RtlMoveMemory(puD3dBufferCallbacks
, pHalInfo
->lpD3DBufCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
167 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
173 DWORD STDCALL
NtGdiDdGetDriverInfo(
174 HANDLE hDirectDrawLocal
,
175 PDD_GETDRIVERINFODATA puGetDriverInfoData
)
180 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
181 if (pDirectDraw
== NULL
)
182 return DDHAL_DRIVER_NOTHANDLED
;
184 if (!(pDirectDraw
->Hal
.dwFlags
& DDHALINFO_GETDRIVERINFOSET
))
185 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
187 ddRVal
= pDirectDraw
->Hal
.GetDriverInfo(puGetDriverInfoData
);
189 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
194 /************************************************************************/
196 /* FIXME NtGdiDdCreateSurface we do not call to ddCreateSurface */
197 /************************************************************************/
199 DWORD STDCALL
NtGdiDdCreateSurface(
200 HANDLE hDirectDrawLocal
,
202 DDSURFACEDESC
*puSurfaceDescription
,
203 DD_SURFACE_GLOBAL
*puSurfaceGlobalData
,
204 DD_SURFACE_LOCAL
*puSurfaceLocalData
,
205 DD_SURFACE_MORE
*puSurfaceMoreData
,
206 PDD_CREATESURFACEDATA puCreateSurfaceData
,
210 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
213 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
214 if (pDirectDraw
== NULL
)
215 return DDHAL_DRIVER_NOTHANDLED
;
217 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
))
218 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
221 ddRVal
= pDirectDraw
->DD
.CreateSurface(puCreateSurfaceData
);
224 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
228 DWORD STDCALL
NtGdiDdWaitForVerticalBlank(
229 HANDLE hDirectDrawLocal
,
230 PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
234 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
235 if (pDirectDraw
== NULL
)
236 return DDHAL_DRIVER_NOTHANDLED
;
238 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
))
239 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
241 ddRVal
= pDirectDraw
->DD
.WaitForVerticalBlank(puWaitForVerticalBlankData
);
243 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
247 DWORD STDCALL
NtGdiDdCanCreateSurface(
248 HANDLE hDirectDrawLocal
,
249 PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
254 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
255 if (pDirectDraw
== NULL
)
256 return DDHAL_DRIVER_NOTHANDLED
;
258 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
))
259 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
261 ddRVal
= pDirectDraw
->DD
.CanCreateSurface(puCanCreateSurfaceData
);
263 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
267 DWORD STDCALL
NtGdiDdGetScanLine(
268 HANDLE hDirectDrawLocal
,
269 PDD_GETSCANLINEDATA puGetScanLineData
274 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
275 if (pDirectDraw
== NULL
)
276 return DDHAL_DRIVER_NOTHANDLED
;
278 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_GETSCANLINE
))
279 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
281 ddRVal
= pDirectDraw
->DD
.GetScanLine(puGetScanLineData
);
283 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
289 /************************************************************************/
290 /* Surface CALLBACKS */
292 /* NtGdiDdDestroySurface */
293 /************************************************************************/
295 DWORD STDCALL
NtGdiDdDestroySurface(
300 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
302 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
303 if (pDirectDraw
== NULL
)
304 return DDHAL_DRIVER_NOTHANDLED
;
306 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
))
307 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
310 DD_DESTROYSURFACEDATA DestroySurf
;
314 * are we doing right ??
316 DestroySurf
.lpDD
= &pDirectDraw
->Global
;
318 DestroySurf
.lpDDSurface
= hSurface
; // ?
319 DestroySurf
.DestroySurface
= pDirectDraw
->Surf
.DestroySurface
;
321 ddRVal
= pDirectDraw
->Surf
.DestroySurface(&DestroySurf
);
324 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
328 DWORD STDCALL
NtGdiDdFlip(
329 HANDLE hSurfaceCurrent
,
330 HANDLE hSurfaceTarget
,
331 HANDLE hSurfaceCurrentLeft
,
332 HANDLE hSurfaceTargetLeft
,
333 PDD_FLIPDATA puFlipData
338 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceTarget
, GDI_OBJECT_TYPE_DIRECTDRAW
);
339 if (pDirectDraw
== NULL
)
340 return DDHAL_DRIVER_NOTHANDLED
;
342 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_FLIP
))
343 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
345 ddRVal
= pDirectDraw
->Surf
.Flip(puFlipData
);
347 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
351 DWORD STDCALL
NtGdiDdLock(
353 PDD_LOCKDATA puLockData
,
359 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
360 if (pDirectDraw
== NULL
)
361 return DDHAL_DRIVER_NOTHANDLED
;
363 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_LOCK
))
364 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
366 ddRVal
= pDirectDraw
->Surf
.Lock(puLockData
);
368 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
372 DWORD STDCALL
NtGdiDdUnlock(
374 PDD_UNLOCKDATA puUnlockData
379 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
380 if (pDirectDraw
== NULL
)
381 return DDHAL_DRIVER_NOTHANDLED
;
383 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_UNLOCK
))
384 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
386 ddRVal
= pDirectDraw
->Surf
.Unlock(puUnlockData
);
388 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
392 DWORD STDCALL
NtGdiDdBlt(
395 PDD_BLTDATA puBltData
400 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDest
, GDI_OBJECT_TYPE_DIRECTDRAW
);
401 if (pDirectDraw
== NULL
)
402 return DDHAL_DRIVER_NOTHANDLED
;
404 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_BLT
))
405 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
407 ddRVal
= pDirectDraw
->Surf
.Blt(puBltData
);
409 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
413 DWORD STDCALL
NtGdiDdSetColorKey(
415 PDD_SETCOLORKEYDATA puSetColorKeyData
420 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
421 if (pDirectDraw
== NULL
)
422 return DDHAL_DRIVER_NOTHANDLED
;
424 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
))
425 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
427 ddRVal
= pDirectDraw
->Surf
.SetColorKey(puSetColorKeyData
);
429 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
434 DWORD STDCALL
NtGdiDdAddAttachedSurface(
436 HANDLE hSurfaceAttached
,
437 PDD_ADDATTACHEDSURFACEDATA puAddAttachedSurfaceData
442 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceAttached
, GDI_OBJECT_TYPE_DIRECTDRAW
);
443 if (pDirectDraw
== NULL
)
444 return DDHAL_DRIVER_NOTHANDLED
;
446 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
))
447 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
449 ddRVal
= pDirectDraw
->Surf
.AddAttachedSurface(puAddAttachedSurfaceData
);
451 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
455 DWORD STDCALL
NtGdiDdGetBltStatus(
457 PDD_GETBLTSTATUSDATA puGetBltStatusData
462 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
463 if (pDirectDraw
== NULL
)
464 return DDHAL_DRIVER_NOTHANDLED
;
466 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
))
467 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
469 ddRVal
= pDirectDraw
->Surf
.GetBltStatus(puGetBltStatusData
);
471 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
475 DWORD STDCALL
NtGdiDdGetFlipStatus(
477 PDD_GETFLIPSTATUSDATA puGetFlipStatusData
482 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
483 if (pDirectDraw
== NULL
)
484 return DDHAL_DRIVER_NOTHANDLED
;
486 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
))
487 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
489 ddRVal
= pDirectDraw
->Surf
.GetFlipStatus(puGetFlipStatusData
);
491 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
495 DWORD STDCALL
NtGdiDdUpdateOverlay(
496 HANDLE hSurfaceDestination
,
497 HANDLE hSurfaceSource
,
498 PDD_UPDATEOVERLAYDATA puUpdateOverlayData
503 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDestination
, GDI_OBJECT_TYPE_DIRECTDRAW
);
504 if (pDirectDraw
== NULL
)
505 return DDHAL_DRIVER_NOTHANDLED
;
507 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
))
508 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
510 ddRVal
= pDirectDraw
->Surf
.UpdateOverlay(puUpdateOverlayData
);
512 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
516 DWORD STDCALL
NtGdiDdSetOverlayPosition(
517 HANDLE hSurfaceSource
,
518 HANDLE hSurfaceDestination
,
519 PDD_SETOVERLAYPOSITIONDATA puSetOverlayPositionData
524 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDestination
, GDI_OBJECT_TYPE_DIRECTDRAW
);
525 if (pDirectDraw
== NULL
)
526 return DDHAL_DRIVER_NOTHANDLED
;
528 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
))
529 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
531 ddRVal
= pDirectDraw
->Surf
.SetOverlayPosition(puSetOverlayPositionData
);
533 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
538 /************************************************************************/
540 /************************************************************************/
543 DDSURF_Cleanup(PVOID pDDSurf
)
546 * PDD_SURFACE pDDSurf = PVOID pDDSurf
551 HANDLE STDCALL
NtGdiDdCreateSurfaceObject(
552 HANDLE hDirectDrawLocal
,
554 PDD_SURFACE_LOCAL puSurfaceLocal
,
555 PDD_SURFACE_MORE puSurfaceMore
,
556 PDD_SURFACE_GLOBAL puSurfaceGlobal
,
560 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
565 hSurface
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE
);
567 PDD_SURFACE pSurface
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
568 /* FIXME - Handle pSurface == NULL!!!! */
570 RtlMoveMemory(&pSurface
->Local
, puSurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
571 RtlMoveMemory(&pSurface
->More
, puSurfaceMore
, sizeof(DD_SURFACE_MORE
));
572 RtlMoveMemory(&pSurface
->Global
, puSurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
573 pSurface
->Local
.lpGbl
= &pSurface
->Global
;
574 pSurface
->Local
.lpSurfMore
= &pSurface
->More
;
575 pSurface
->Local
.lpAttachList
= NULL
;
576 pSurface
->Local
.lpAttachListFrom
= NULL
;
577 pSurface
->More
.lpVideoPort
= NULL
;
578 // FIXME: figure out how to use this
579 pSurface
->bComplete
= bComplete
;
581 GDIOBJ_UnlockObjByPtr(pSurface
);
582 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
587 BOOL STDCALL
NtGdiDdDeleteSurfaceObject(
591 return GDIOBJ_FreeObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
596 /************************************************************************/
597 /* DIRECT DRAW SURFACR END */
598 /************************************************************************/
602 BOOL STDCALL NtGdiDdAttachSurface(
607 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
610 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
613 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
617 if (pSurfaceFrom->Local.lpAttachListFrom)
619 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
622 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
623 GDIOBJ_UnlockObjByPtr(pSurfaceTo);
628 DWORD STDCALL
NtGdiDdGetAvailDriverMemory(
629 HANDLE hDirectDrawLocal
,
630 PDD_GETAVAILDRIVERMEMORYDATA puGetAvailDriverMemoryData
633 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
635 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
637 // ddRVal = pDirectDraw->DdGetAvailDriverMemory(puGetAvailDriverMemoryData);
639 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
647 DWORD STDCALL
NtGdiDdSetExclusiveMode(
649 PDD_SETEXCLUSIVEMODEDATA puSetExclusiveModeData
654 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
656 ddRVal
= pDirectDraw
->DdSetExclusiveMode(puSetExclusiveModeData
);
658 GDIOBJ_UnlockObjByPtr(pDirectDraw
);