3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Native DirectDraw implementation
6 * FILE: subsys/win32k/ntddraw/ddraw.c
7 * PROGRAMER: Peter Bajusz (hyp-x@stormregion.com)
9 * 25-10-2003 PB Created
12 #include <ddk/ntddk.h>
13 #include <win32k/ntddraw.h>
14 #include <win32k/win32k.h>
15 #include <include/intddraw.h>
16 #include <win32k/gdiobj.h>
21 /************************************************************************/
22 /* DIRECT DRAW OBJECT */
23 /************************************************************************/
26 DD_Cleanup(PDD_DIRECTDRAW pDD
)
28 pDD
->DrvDisableDirectDraw(pDD
->Global
.dhpdev
);
32 HANDLE STDCALL
NtGdiDdCreateDirectDrawObject(
36 DD_CALLBACKS callbacks
;
37 DD_SURFACECALLBACKS surface_callbacks
;
38 DD_PALETTECALLBACKS palette_callbacks
;
40 RtlZeroMemory(&callbacks
, sizeof(callbacks
));
41 callbacks
.dwSize
= sizeof(callbacks
);
42 RtlZeroMemory(&surface_callbacks
, sizeof(surface_callbacks
));
43 surface_callbacks
.dwSize
= sizeof(surface_callbacks
);
44 RtlZeroMemory(&palette_callbacks
, sizeof(palette_callbacks
));
45 palette_callbacks
.dwSize
= sizeof(palette_callbacks
);
47 DC
*pDC
= DC_LockDc(hdc
);
51 if (!pDC
->DriverFunctions
.EnableDirectDraw
)
53 // Driver doesn't support DirectDraw
58 BOOL success
= pDC
->DriverFunctions
.EnableDirectDraw(
59 pDC
->PDev
, &callbacks
, &surface_callbacks
, &palette_callbacks
);
63 // DirectDraw creation failed
68 HANDLE hDirectDraw
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW
);
69 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
71 pDirectDraw
->Global
.dhpdev
= pDC
->PDev
;
72 pDirectDraw
->Local
.lpGbl
= &pDirectDraw
->Global
;
74 pDirectDraw
->DrvGetDirectDrawInfo
= pDC
->DriverFunctions
.GetDirectDrawInfo
;
75 pDirectDraw
->DrvDisableDirectDraw
= pDC
->DriverFunctions
.DisableDirectDraw
;
77 if (callbacks
.dwFlags
& DDHAL_CB32_CREATESURFACE
)
78 pDirectDraw
->DdCreateSurface
= callbacks
.CreateSurface
;
79 if (callbacks
.dwFlags
& DDHAL_CB32_SETCOLORKEY
)
80 pDirectDraw
->DdDrvSetColorKey
= callbacks
.SetColorKey
;
81 if (callbacks
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
)
82 pDirectDraw
->DdWaitForVerticalBlank
= callbacks
.WaitForVerticalBlank
;
83 if (callbacks
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
)
84 pDirectDraw
->DdCanCreateSurface
= callbacks
.CanCreateSurface
;
85 if (callbacks
.dwFlags
& DDHAL_CB32_CREATEPALETTE
)
86 pDirectDraw
->DdCreatePalette
= callbacks
.CreatePalette
;
87 if (callbacks
.dwFlags
& DDHAL_CB32_GETSCANLINE
)
88 pDirectDraw
->DdGetScanLine
= callbacks
.GetScanLine
;
89 if (callbacks
.dwFlags
& DDHAL_CB32_MAPMEMORY
)
90 pDirectDraw
->DdMapMemory
= callbacks
.MapMemory
;
92 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
)
93 pDirectDraw
->DdDestroySurface
= surface_callbacks
.DestroySurface
;
94 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_FLIP
)
95 pDirectDraw
->DdFlip
= surface_callbacks
.Flip
;
96 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
)
97 pDirectDraw
->DdSetClipList
= surface_callbacks
.SetClipList
;
98 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_LOCK
)
99 pDirectDraw
->DdLock
= surface_callbacks
.Lock
;
100 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_UNLOCK
)
101 pDirectDraw
->DdUnlock
= surface_callbacks
.Unlock
;
102 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_BLT
)
103 pDirectDraw
->DdBlt
= surface_callbacks
.Blt
;
104 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
)
105 pDirectDraw
->DdSetColorKey
= surface_callbacks
.SetColorKey
;
106 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
)
107 pDirectDraw
->DdAddAttachedSurface
= surface_callbacks
.AddAttachedSurface
;
108 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
)
109 pDirectDraw
->DdGetBltStatus
= surface_callbacks
.GetBltStatus
;
110 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
)
111 pDirectDraw
->DdGetFlipStatus
= surface_callbacks
.GetFlipStatus
;
112 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
)
113 pDirectDraw
->DdUpdateOverlay
= surface_callbacks
.UpdateOverlay
;
114 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
)
115 pDirectDraw
->DdSetOverlayPosition
= surface_callbacks
.SetOverlayPosition
;
116 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
)
117 pDirectDraw
->DdSetPalette
= surface_callbacks
.SetPalette
;
119 if (palette_callbacks
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
)
120 pDirectDraw
->DdDestroyPalette
= palette_callbacks
.DestroyPalette
;
121 if (palette_callbacks
.dwFlags
& DDHAL_PALCB32_SETENTRIES
)
122 pDirectDraw
->DdSetEntries
= palette_callbacks
.SetEntries
;
124 GDIOBJ_UnlockObj(hDirectDraw
);
130 BOOL STDCALL
NtGdiDdDeleteDirectDrawObject(
131 HANDLE hDirectDrawLocal
134 return GDIOBJ_FreeObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
137 BOOL STDCALL
NtGdiDdQueryDirectDrawObject(
138 HANDLE hDirectDrawLocal
,
139 DD_HALINFO
*pHalInfo
,
140 DWORD
*pCallBackFlags
,
141 PD3DNTHAL_CALLBACKS puD3dCallbacks
,
142 PD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData
,
143 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks
,
144 LPDDSURFACEDESC puD3dTextureFormats
,
146 VIDEOMEMORY
*puvmList
,
151 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
155 BOOL success
= pDirectDraw
->DrvGetDirectDrawInfo(
156 pDirectDraw
->Global
.dhpdev
,
165 GDIOBJ_UnlockObj(hDirectDrawLocal
);
169 if (pHalInfo
->lpD3DHALCallbacks
)
171 RtlMoveMemory(puD3dCallbacks
, pHalInfo
->lpD3DHALCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
172 pDirectDraw
->D3dContextCreate
= puD3dCallbacks
->ContextCreate
;
173 pDirectDraw
->D3dContextDestroy
= puD3dCallbacks
->ContextDestroy
;
176 if (pHalInfo
->lpD3DGlobalDriverData
)
178 RtlMoveMemory(puD3dDriverData
, pHalInfo
->lpD3DGlobalDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
181 if (pHalInfo
->lpD3DBufCallbacks
)
183 RtlMoveMemory(puD3dBufferCallbacks
, pHalInfo
->lpD3DBufCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
184 pDirectDraw
->DdCanCreateD3DBuffer
= puD3dBufferCallbacks
->CanCreateD3DBuffer
;
185 pDirectDraw
->DdCreateD3DBuffer
= puD3dBufferCallbacks
->CreateD3DBuffer
;
186 pDirectDraw
->DdDestroyD3DBuffer
= puD3dBufferCallbacks
->DestroyD3DBuffer
;
187 pDirectDraw
->DdLockD3DBuffer
= puD3dBufferCallbacks
->LockD3DBuffer
;
188 pDirectDraw
->DdUnlockD3DBuffer
= puD3dBufferCallbacks
->UnlockD3DBuffer
;
191 GDIOBJ_UnlockObj(hDirectDrawLocal
);
196 /************************************************************************/
198 /************************************************************************/
201 DDSURF_Cleanup(PDD_SURFACE pDDSurf
)
207 HANDLE STDCALL
NtGdiDdCreateSurfaceObject(
208 HANDLE hDirectDrawLocal
,
210 PDD_SURFACE_LOCAL puSurfaceLocal
,
211 PDD_SURFACE_MORE puSurfaceMore
,
212 PDD_SURFACE_GLOBAL puSurfaceGlobal
,
216 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
221 hSurface
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE
);
223 PDD_SURFACE pSurface
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
224 /* FIXME - Handle pSurface == NULL!!!! */
226 RtlMoveMemory(&pSurface
->Local
, puSurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
227 RtlMoveMemory(&pSurface
->More
, puSurfaceMore
, sizeof(DD_SURFACE_MORE
));
228 RtlMoveMemory(&pSurface
->Global
, puSurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
229 pSurface
->Local
.lpGbl
= &pSurface
->Global
;
230 pSurface
->Local
.lpSurfMore
= &pSurface
->More
;
231 pSurface
->Local
.lpAttachList
= NULL
;
232 pSurface
->Local
.lpAttachListFrom
= NULL
;
233 pSurface
->More
.lpVideoPort
= NULL
;
234 // FIXME: figure out how to use this
235 pSurface
->bComplete
= bComplete
;
237 GDIOBJ_UnlockObj(hSurface
);
238 GDIOBJ_UnlockObj(hDirectDrawLocal
);
243 BOOL STDCALL
NtGdiDdDeleteSurfaceObject(
247 return GDIOBJ_FreeObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
251 BOOL STDCALL NtGdiDdAttachSurface(
256 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
259 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
262 GDIOBJ_UnlockObj(hSurfaceFrom);
266 if (pSurfaceFrom->Local.lpAttachListFrom)
268 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
271 GDIOBJ_UnlockObj(hSurfaceFrom);
272 GDIOBJ_UnlockObj(hSurfaceTo);