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(PDD_DIRECTDRAW pDD
)
23 pDD
->DrvDisableDirectDraw(pDD
->Global
.dhpdev
);
27 HANDLE STDCALL
NtGdiDdCreateDirectDrawObject(
31 DD_CALLBACKS callbacks
;
32 DD_SURFACECALLBACKS surface_callbacks
;
33 DD_PALETTECALLBACKS palette_callbacks
;
35 RtlZeroMemory(&callbacks
, sizeof(callbacks
));
36 callbacks
.dwSize
= sizeof(callbacks
);
37 RtlZeroMemory(&surface_callbacks
, sizeof(surface_callbacks
));
38 surface_callbacks
.dwSize
= sizeof(surface_callbacks
);
39 RtlZeroMemory(&palette_callbacks
, sizeof(palette_callbacks
));
40 palette_callbacks
.dwSize
= sizeof(palette_callbacks
);
42 DC
*pDC
= DC_LockDc(hdc
);
46 if (!pDC
->DriverFunctions
.EnableDirectDraw
)
48 // Driver doesn't support DirectDraw
53 BOOL success
= pDC
->DriverFunctions
.EnableDirectDraw(
54 pDC
->PDev
, &callbacks
, &surface_callbacks
, &palette_callbacks
);
58 // DirectDraw creation failed
63 HANDLE hDirectDraw
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW
);
64 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
66 pDirectDraw
->Global
.dhpdev
= pDC
->PDev
;
67 pDirectDraw
->Local
.lpGbl
= &pDirectDraw
->Global
;
69 pDirectDraw
->DrvGetDirectDrawInfo
= pDC
->DriverFunctions
.GetDirectDrawInfo
;
70 pDirectDraw
->DrvDisableDirectDraw
= pDC
->DriverFunctions
.DisableDirectDraw
;
72 if (callbacks
.dwFlags
& DDHAL_CB32_CREATESURFACE
)
73 pDirectDraw
->DdCreateSurface
= callbacks
.CreateSurface
;
74 if (callbacks
.dwFlags
& DDHAL_CB32_SETCOLORKEY
)
75 pDirectDraw
->DdDrvSetColorKey
= callbacks
.SetColorKey
;
76 if (callbacks
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
)
77 pDirectDraw
->DdWaitForVerticalBlank
= callbacks
.WaitForVerticalBlank
;
78 if (callbacks
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
)
79 pDirectDraw
->DdCanCreateSurface
= callbacks
.CanCreateSurface
;
80 if (callbacks
.dwFlags
& DDHAL_CB32_CREATEPALETTE
)
81 pDirectDraw
->DdCreatePalette
= callbacks
.CreatePalette
;
82 if (callbacks
.dwFlags
& DDHAL_CB32_GETSCANLINE
)
83 pDirectDraw
->DdGetScanLine
= callbacks
.GetScanLine
;
84 if (callbacks
.dwFlags
& DDHAL_CB32_MAPMEMORY
)
85 pDirectDraw
->DdMapMemory
= callbacks
.MapMemory
;
87 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
)
88 pDirectDraw
->DdDestroySurface
= surface_callbacks
.DestroySurface
;
89 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_FLIP
)
90 pDirectDraw
->DdFlip
= surface_callbacks
.Flip
;
91 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
)
92 pDirectDraw
->DdSetClipList
= surface_callbacks
.SetClipList
;
93 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_LOCK
)
94 pDirectDraw
->DdLock
= surface_callbacks
.Lock
;
95 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_UNLOCK
)
96 pDirectDraw
->DdUnlock
= surface_callbacks
.Unlock
;
97 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_BLT
)
98 pDirectDraw
->DdBlt
= surface_callbacks
.Blt
;
99 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
)
100 pDirectDraw
->DdSetColorKey
= surface_callbacks
.SetColorKey
;
101 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
)
102 pDirectDraw
->DdAddAttachedSurface
= surface_callbacks
.AddAttachedSurface
;
103 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
)
104 pDirectDraw
->DdGetBltStatus
= surface_callbacks
.GetBltStatus
;
105 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
)
106 pDirectDraw
->DdGetFlipStatus
= surface_callbacks
.GetFlipStatus
;
107 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
)
108 pDirectDraw
->DdUpdateOverlay
= surface_callbacks
.UpdateOverlay
;
109 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
)
110 pDirectDraw
->DdSetOverlayPosition
= surface_callbacks
.SetOverlayPosition
;
111 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
)
112 pDirectDraw
->DdSetPalette
= surface_callbacks
.SetPalette
;
114 if (palette_callbacks
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
)
115 pDirectDraw
->DdDestroyPalette
= palette_callbacks
.DestroyPalette
;
116 if (palette_callbacks
.dwFlags
& DDHAL_PALCB32_SETENTRIES
)
117 pDirectDraw
->DdSetEntries
= palette_callbacks
.SetEntries
;
119 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
125 BOOL STDCALL
NtGdiDdDeleteDirectDrawObject(
126 HANDLE hDirectDrawLocal
129 return GDIOBJ_FreeObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
132 BOOL STDCALL
NtGdiDdQueryDirectDrawObject(
133 HANDLE hDirectDrawLocal
,
134 DD_HALINFO
*pHalInfo
,
135 DWORD
*pCallBackFlags
,
136 PD3DNTHAL_CALLBACKS puD3dCallbacks
,
137 PD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData
,
138 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks
,
139 LPDDSURFACEDESC puD3dTextureFormats
,
141 VIDEOMEMORY
*puvmList
,
146 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
150 BOOL success
= pDirectDraw
->DrvGetDirectDrawInfo(
151 pDirectDraw
->Global
.dhpdev
,
160 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
164 if (pHalInfo
->lpD3DHALCallbacks
)
166 RtlMoveMemory(puD3dCallbacks
, pHalInfo
->lpD3DHALCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
167 pDirectDraw
->D3dContextCreate
= puD3dCallbacks
->ContextCreate
;
168 pDirectDraw
->D3dContextDestroy
= puD3dCallbacks
->ContextDestroy
;
171 if (pHalInfo
->lpD3DGlobalDriverData
)
173 RtlMoveMemory(puD3dDriverData
, pHalInfo
->lpD3DGlobalDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
176 if (pHalInfo
->lpD3DBufCallbacks
)
178 RtlMoveMemory(puD3dBufferCallbacks
, pHalInfo
->lpD3DBufCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
179 pDirectDraw
->DdCanCreateD3DBuffer
= puD3dBufferCallbacks
->CanCreateD3DBuffer
;
180 pDirectDraw
->DdCreateD3DBuffer
= puD3dBufferCallbacks
->CreateD3DBuffer
;
181 pDirectDraw
->DdDestroyD3DBuffer
= puD3dBufferCallbacks
->DestroyD3DBuffer
;
182 pDirectDraw
->DdLockD3DBuffer
= puD3dBufferCallbacks
->LockD3DBuffer
;
183 pDirectDraw
->DdUnlockD3DBuffer
= puD3dBufferCallbacks
->UnlockD3DBuffer
;
187 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
192 /************************************************************************/
194 /************************************************************************/
197 DDSURF_Cleanup(PDD_SURFACE pDDSurf
)
203 HANDLE STDCALL
NtGdiDdCreateSurfaceObject(
204 HANDLE hDirectDrawLocal
,
206 PDD_SURFACE_LOCAL puSurfaceLocal
,
207 PDD_SURFACE_MORE puSurfaceMore
,
208 PDD_SURFACE_GLOBAL puSurfaceGlobal
,
212 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
217 hSurface
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE
);
219 PDD_SURFACE pSurface
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
220 /* FIXME - Handle pSurface == NULL!!!! */
222 RtlMoveMemory(&pSurface
->Local
, puSurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
223 RtlMoveMemory(&pSurface
->More
, puSurfaceMore
, sizeof(DD_SURFACE_MORE
));
224 RtlMoveMemory(&pSurface
->Global
, puSurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
225 pSurface
->Local
.lpGbl
= &pSurface
->Global
;
226 pSurface
->Local
.lpSurfMore
= &pSurface
->More
;
227 pSurface
->Local
.lpAttachList
= NULL
;
228 pSurface
->Local
.lpAttachListFrom
= NULL
;
229 pSurface
->More
.lpVideoPort
= NULL
;
230 // FIXME: figure out how to use this
231 pSurface
->bComplete
= bComplete
;
233 GDIOBJ_UnlockObjByPtr(pSurface
);
234 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
239 BOOL STDCALL
NtGdiDdDeleteSurfaceObject(
243 return GDIOBJ_FreeObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
247 BOOL STDCALL NtGdiDdAttachSurface(
252 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
255 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
258 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
262 if (pSurfaceFrom->Local.lpAttachListFrom)
264 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
267 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
268 GDIOBJ_UnlockObjByPtr(pSurfaceTo);
275 DWORD STDCALL
NtGdiDdGetDriverInfo(
276 HANDLE hDirectDrawLocal
,
277 PDD_GETDRIVERINFODATA puGetDriverInfoData
)
281 VIDEOMEMORY
*pvmList
= NULL
;
283 DWORD
*pdwFourCC
= NULL
;
286 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
289 ddRVal
= pDirectDraw
->DrvGetDirectDrawInfo(
290 pDirectDraw
->Global
.dhpdev
,(PDD_HALINFO
) puGetDriverInfoData
,
291 &pdwNumHeaps
, pvmList
, &pdwNumFourCC
, pdwFourCC
);
293 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
300 DWORD STDCALL
NtGdiDdWaitForVerticalBlank(
301 HANDLE hDirectDrawLocal
,
302 PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
306 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
308 puWaitForVerticalBlankData
->lpDD
= pDirectDraw
->Local
.lpGbl
;
310 ddRVal
= pDirectDraw
->DdWaitForVerticalBlank(puWaitForVerticalBlankData
);
312 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
318 DWORD STDCALL
NtGdiDdCanCreateSurface(
319 HANDLE hDirectDrawLocal
,
320 PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
325 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
327 puCanCreateSurfaceData
->lpDD
= pDirectDraw
->Local
.lpGbl
;
329 ddRVal
= pDirectDraw
->DdCanCreateSurface(puCanCreateSurfaceData
);
331 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
338 DWORD STDCALL
NtGdiDdBlt(
341 PDD_BLTDATA puBltData
346 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDest
, GDI_OBJECT_TYPE_DIRECTDRAW
);
348 puBltData
->lpDDDestSurface
= hSurfaceDest
;
349 puBltData
->lpDDSrcSurface
= hSurfaceSrc
;
350 puBltData
->lpDD
= pDirectDraw
->Local
.lpGbl
;
352 ddRVal
= pDirectDraw
->DdBlt(puBltData
);
354 GDIOBJ_UnlockObjByPtr(pDirectDraw
);