activate PDD_DIRECTDRAW for GDIOBJ_LockObj so it does not fail if it is GDI_OBJECT_TY...
[reactos.git] / reactos / subsys / win32k / ntddraw / ddraw.c
1 /*
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)
7 * REVISION HISTORY:
8 * 25-10-2003 PB Created
9 */
10
11 #include <w32k.h>
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /************************************************************************/
17 /* DIRECT DRAW OBJECT */
18 /************************************************************************/
19
20 BOOL INTERNAL_CALL
21 DD_Cleanup(PVOID ObjectBody)
22 {
23 PDD_DIRECTDRAW pDD = (PDD_DIRECTDRAW)ObjectBody;
24 pDD->DrvDisableDirectDraw(pDD->Global.dhpdev);
25 return TRUE;
26 }
27
28 HANDLE STDCALL NtGdiDdCreateDirectDrawObject(
29 HDC hdc
30 )
31 {
32 DD_CALLBACKS callbacks;
33 DD_SURFACECALLBACKS surface_callbacks;
34 DD_PALETTECALLBACKS palette_callbacks;
35
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);
42
43 DC *pDC = DC_LockDc(hdc);
44 if (!pDC)
45 return NULL;
46
47 if (!pDC->DriverFunctions.EnableDirectDraw)
48 {
49 // Driver doesn't support DirectDraw
50 DC_UnlockDc(pDC);
51 return NULL;
52 }
53
54
55
56 BOOL success = pDC->DriverFunctions.EnableDirectDraw(
57 pDC->PDev, &callbacks, &surface_callbacks, &palette_callbacks);
58
59 if (!success)
60 {
61 // DirectDraw creation failed
62 DC_UnlockDc(pDC);
63 return NULL;
64 }
65
66 HANDLE hDirectDraw = GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW);
67 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDraw, GDI_OBJECT_TYPE_DIRECTDRAW);
68
69 pDirectDraw->Global.dhpdev = pDC->PDev;
70 pDirectDraw->Local.lpGbl = &pDirectDraw->Global;
71
72 pDirectDraw->DrvGetDirectDrawInfo = pDC->DriverFunctions.GetDirectDrawInfo;
73 pDirectDraw->DrvDisableDirectDraw = pDC->DriverFunctions.DisableDirectDraw;
74
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;
89
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;
116
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;
121
122 GDIOBJ_UnlockObjByPtr(pDirectDraw);
123 DC_UnlockDc(pDC);
124
125 return hDirectDraw;
126 }
127
128 BOOL STDCALL NtGdiDdDeleteDirectDrawObject(
129 HANDLE hDirectDrawLocal
130 )
131 {
132 return GDIOBJ_FreeObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
133 }
134
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,
143 DWORD *puNumHeaps,
144 VIDEOMEMORY *puvmList,
145 DWORD *puNumFourCC,
146 DWORD *puFourCC
147 )
148 {
149 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
150 if (!pDirectDraw)
151 return FALSE;
152
153 BOOL success = pDirectDraw->DrvGetDirectDrawInfo(
154 pDirectDraw->Global.dhpdev,
155 pHalInfo,
156 puNumHeaps,
157 puvmList,
158 puNumFourCC,
159 puFourCC);
160
161 if (!success)
162 {
163 GDIOBJ_UnlockObjByPtr(pDirectDraw);
164 return FALSE;
165 }
166
167 if (pHalInfo->lpD3DHALCallbacks)
168 {
169 RtlMoveMemory(puD3dCallbacks, pHalInfo->lpD3DHALCallbacks, sizeof(D3DNTHAL_CALLBACKS));
170 pDirectDraw->D3dContextCreate = puD3dCallbacks->ContextCreate;
171 pDirectDraw->D3dContextDestroy = puD3dCallbacks->ContextDestroy;
172 }
173
174 if (pHalInfo->lpD3DGlobalDriverData)
175 {
176 RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
177 }
178
179 if (pHalInfo->lpD3DBufCallbacks)
180 {
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;
187 }
188
189
190 GDIOBJ_UnlockObjByPtr(pDirectDraw);
191
192 return TRUE;
193 }
194
195 /************************************************************************/
196 /* SURFACE OBJECT */
197 /************************************************************************/
198
199 BOOL INTERNAL_CALL
200 DDSURF_Cleanup(PVOID pDDSurf)
201 {
202 /* FIXME: implement
203 * PDD_SURFACE pDDSurf = PVOID pDDSurf
204 */
205 return TRUE;
206 }
207
208 HANDLE STDCALL NtGdiDdCreateSurfaceObject(
209 HANDLE hDirectDrawLocal,
210 HANDLE hSurface,
211 PDD_SURFACE_LOCAL puSurfaceLocal,
212 PDD_SURFACE_MORE puSurfaceMore,
213 PDD_SURFACE_GLOBAL puSurfaceGlobal,
214 BOOL bComplete
215 )
216 {
217 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
218 if (!pDirectDraw)
219 return NULL;
220
221 if (!hSurface)
222 hSurface = GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE);
223
224 PDD_SURFACE pSurface = GDIOBJ_LockObj(hSurface, GDI_OBJECT_TYPE_DD_SURFACE);
225 /* FIXME - Handle pSurface == NULL!!!! */
226
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;
237
238 GDIOBJ_UnlockObjByPtr(pSurface);
239 GDIOBJ_UnlockObjByPtr(pDirectDraw);
240
241 return hSurface;
242 }
243
244 BOOL STDCALL NtGdiDdDeleteSurfaceObject(
245 HANDLE hSurface
246 )
247 {
248 return GDIOBJ_FreeObj(hSurface, GDI_OBJECT_TYPE_DD_SURFACE);
249 }
250
251 /*
252 BOOL STDCALL NtGdiDdAttachSurface(
253 HANDLE hSurfaceFrom,
254 HANDLE hSurfaceTo
255 )
256 {
257 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
258 if (!pSurfaceFrom)
259 return FALSE;
260 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
261 if (!pSurfaceTo)
262 {
263 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
264 return FALSE;
265 }
266
267 if (pSurfaceFrom->Local.lpAttachListFrom)
268 {
269 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
270 }
271
272 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
273 GDIOBJ_UnlockObjByPtr(pSurfaceTo);
274 return TRUE;
275 }
276 */
277
278
279
280 DWORD STDCALL NtGdiDdGetDriverInfo(
281 HANDLE hDirectDrawLocal,
282 PDD_GETDRIVERINFODATA puGetDriverInfoData)
283
284 {
285 DWORD pdwNumHeaps;
286 VIDEOMEMORY *pvmList = NULL;
287 DWORD pdwNumFourCC;
288 DWORD *pdwFourCC = NULL;
289 DWORD ddRVal;
290
291 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
292
293
294 ddRVal = pDirectDraw->DrvGetDirectDrawInfo(
295 pDirectDraw->Global.dhpdev,(PDD_HALINFO) puGetDriverInfoData,
296 &pdwNumHeaps, pvmList, &pdwNumFourCC, pdwFourCC);
297
298 GDIOBJ_UnlockObjByPtr(pDirectDraw);
299
300 return ddRVal;
301 }
302
303
304
305 DWORD STDCALL NtGdiDdWaitForVerticalBlank(
306 HANDLE hDirectDrawLocal,
307 PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
308 )
309 {
310 DWORD ddRVal;
311 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
312
313 puWaitForVerticalBlankData->lpDD = pDirectDraw->Local.lpGbl;
314
315 ddRVal = pDirectDraw->DdWaitForVerticalBlank(puWaitForVerticalBlankData);
316
317 GDIOBJ_UnlockObjByPtr(pDirectDraw);
318
319 return ddRVal;
320 }
321
322
323 DWORD STDCALL NtGdiDdCanCreateSurface(
324 HANDLE hDirectDrawLocal,
325 PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
326 )
327 {
328 DWORD ddRVal;
329
330 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
331
332 puCanCreateSurfaceData->lpDD = pDirectDraw->Local.lpGbl;
333
334 ddRVal = pDirectDraw->DdCanCreateSurface(puCanCreateSurfaceData);
335
336 GDIOBJ_UnlockObjByPtr(pDirectDraw);
337
338 return ddRVal;
339 }
340
341
342
343 DWORD STDCALL NtGdiDdBlt(
344 HANDLE hSurfaceDest,
345 HANDLE hSurfaceSrc,
346 PDD_BLTDATA puBltData
347 )
348 {
349 DWORD ddRVal;
350
351 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceDest, GDI_OBJECT_TYPE_DIRECTDRAW);
352
353 puBltData->lpDDDestSurface = hSurfaceDest;
354 puBltData->lpDDSrcSurface = hSurfaceSrc;
355 puBltData->lpDD = pDirectDraw->Local.lpGbl;
356
357 ddRVal = pDirectDraw->DdBlt(puBltData);
358
359 GDIOBJ_UnlockObjByPtr(pDirectDraw);
360
361 return ddRVal;
362 }
363
364
365
366
367
368 /* EOF */