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