2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS GDI32
4 * PURPOSE: GDI DirectX inteface
5 * FILE: lib/gdi32/misc/gdientry.c
6 * PROGRAMERS: Alex Ionescu (alex@relsoft.net)
7 * Magnus Olsen (magnus@greatlord.com)
10 /* INCLUDES ******************************************************************/
19 /* DATA **********************************************************************/
24 #define GetDdHandle(Handle) ((HANDLE)Handle ? (HANDLE)Handle : ghDirectDraw)
27 /* CALLBACKS *****************************************************************/
30 * Dd Surface Callbacks
34 DdAddAttachedSurface(LPDDHAL_ADDATTACHEDSURFACEDATA Attach
)
37 return NtGdiDdAddAttachedSurface((HANDLE
)Attach
->lpDDSurface
->hDDSurface
,
38 (HANDLE
)Attach
->lpSurfAttached
->hDDSurface
,
39 (PDD_ADDATTACHEDSURFACEDATA
)Attach
);
44 DdBlt(LPDDHAL_BLTDATA Blt
)
48 /* Use the right surface */
49 if (Blt
->lpDDSrcSurface
) Surface
= (HANDLE
)Blt
->lpDDSrcSurface
->hDDSurface
;
52 return NtGdiDdBlt((HANDLE
)Blt
->lpDDDestSurface
->hDDSurface
, Surface
, (PDD_BLTDATA
)Blt
);
57 DdDestroySurface(LPDDHAL_DESTROYSURFACEDATA pDestroySurface
)
59 DWORD Return
= DDHAL_DRIVER_NOTHANDLED
;
60 BOOL RealDestroy
= TRUE
;
61 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
;
63 /* Get the local surface */
64 pSurfaceLocal
= pDestroySurface
->lpDDSurface
;
66 /* Make sure there's a surface */
67 if (pSurfaceLocal
->hDDSurface
)
69 /* Check if we shoudl really destroy it */
70 if ((pSurfaceLocal
->dwFlags
& DDRAWISURF_DRIVERMANAGED
) &&
71 (pSurfaceLocal
->dwFlags
& DDRAWISURF_INVALID
))
77 Return
= NtGdiDdDestroySurface((HANDLE
)pSurfaceLocal
->hDDSurface
,
86 DdFlip(LPDDHAL_FLIPDATA Flip
)
90 return NtGdiDdFlip( (HANDLE
)Flip
->lpSurfCurr
->hDDSurface
,
91 (HANDLE
)Flip
->lpSurfTarg
->hDDSurface
,
92 /* FIXME the two last should be current left handler */
93 (HANDLE
)Flip
->lpSurfCurr
->hDDSurface
,
94 (HANDLE
)Flip
->lpSurfTarg
->hDDSurface
,
100 DdLock(LPDDHAL_LOCKDATA Lock
)
103 return NtGdiDdLock((HANDLE
)Lock
->lpDDSurface
->hDDSurface
,
105 (HANDLE
)Lock
->lpDDSurface
->hDC
);
110 DdUnlock(LPDDHAL_UNLOCKDATA Unlock
)
113 return NtGdiDdUnlock((HANDLE
)Unlock
->lpDDSurface
->hDDSurface
,
114 (PDD_UNLOCKDATA
)Unlock
);
119 DdGetBltStatus(LPDDHAL_GETBLTSTATUSDATA GetBltStatus
)
122 return NtGdiDdGetBltStatus((HANDLE
)GetBltStatus
->lpDDSurface
->hDDSurface
,
123 (PDD_GETBLTSTATUSDATA
)GetBltStatus
);
128 DdGetFlipStatus(LPDDHAL_GETFLIPSTATUSDATA GetFlipStatus
)
131 return NtGdiDdGetFlipStatus((HANDLE
)GetFlipStatus
->lpDDSurface
->hDDSurface
,
132 (PDD_GETFLIPSTATUSDATA
)GetFlipStatus
);
137 DdUpdateOverlay(LPDDHAL_UPDATEOVERLAYDATA UpdateOverlay
)
139 /* We have to handle this manually here */
140 if (UpdateOverlay
->dwFlags
& DDOVER_KEYDEST
)
142 /* Use the override */
143 UpdateOverlay
->dwFlags
&= ~DDOVER_KEYDEST
;
144 UpdateOverlay
->dwFlags
|= DDOVER_KEYDESTOVERRIDE
;
146 /* Set the overlay */
147 UpdateOverlay
->overlayFX
.dckDestColorkey
=
148 UpdateOverlay
->lpDDDestSurface
->ddckCKDestOverlay
;
150 if (UpdateOverlay
->dwFlags
& DDOVER_KEYSRC
)
152 /* Use the override */
153 UpdateOverlay
->dwFlags
&= ~DDOVER_KEYSRC
;
154 UpdateOverlay
->dwFlags
|= DDOVER_KEYSRCOVERRIDE
;
156 /* Set the overlay */
157 UpdateOverlay
->overlayFX
.dckSrcColorkey
=
158 UpdateOverlay
->lpDDSrcSurface
->ddckCKSrcOverlay
;
162 return NtGdiDdUpdateOverlay((HANDLE
)UpdateOverlay
->lpDDDestSurface
->hDDSurface
,
163 (HANDLE
)UpdateOverlay
->lpDDSrcSurface
->hDDSurface
,
164 (PDD_UPDATEOVERLAYDATA
)UpdateOverlay
);
169 DdSetOverlayPosition(LPDDHAL_SETOVERLAYPOSITIONDATA SetOverlayPosition
)
172 return NtGdiDdSetOverlayPosition((HANDLE
)SetOverlayPosition
->
173 lpDDSrcSurface
->hDDSurface
,
174 (HANDLE
)SetOverlayPosition
->
175 lpDDDestSurface
->hDDSurface
,
176 (PDD_SETOVERLAYPOSITIONDATA
)
185 DdWaitForVerticalBlank(LPDDHAL_WAITFORVERTICALBLANKDATA WaitForVerticalBlank
)
188 return NtGdiDdWaitForVerticalBlank(GetDdHandle(
189 WaitForVerticalBlank
->lpDD
->hDD
),
190 (PDD_WAITFORVERTICALBLANKDATA
)
191 WaitForVerticalBlank
);
196 DdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA CanCreateSurface
)
199 return NtGdiDdCanCreateSurface(GetDdHandle(CanCreateSurface
->lpDD
->hDD
),
200 (PDD_CANCREATESURFACEDATA
)CanCreateSurface
);
205 DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface
)
207 DWORD Return
= DDHAL_DRIVER_NOTHANDLED
;
208 ULONG SurfaceCount
= pCreateSurface
->dwSCnt
;
209 DD_SURFACE_LOCAL DdSurfaceLocal
;
210 DD_SURFACE_MORE DdSurfaceMore
;
211 DD_SURFACE_GLOBAL DdSurfaceGlobal
;
212 HANDLE hPrevSurface
, hSurface
;
213 DD_SURFACE_LOCAL
* pDdSurfaceLocal
;
214 DD_SURFACE_MORE
* pDdSurfaceMore
;
215 DD_SURFACE_GLOBAL
* pDdSurfaceGlobal
;
216 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
;
217 //LPDDRAWI_DDRAWSURFACE_MORE pSurfaceMore;
218 LPDDRAWI_DDRAWSURFACE_GBL pSurfaceGlobal
;
219 PHANDLE phSurface
= NULL
, puhSurface
= NULL
;
221 LPDDSURFACEDESC pSurfaceDesc
;
223 /* Check how many surfaces there are */
224 if (SurfaceCount
!= 1)
226 /* We'll have to allocate more data, our stack isn't big enough */
231 /* We'll use what we have on the stack */
232 pDdSurfaceLocal
= &DdSurfaceLocal
;
233 pDdSurfaceMore
= &DdSurfaceMore
;
234 pDdSurfaceGlobal
= &DdSurfaceGlobal
;
235 phSurface
= &hPrevSurface
;
236 puhSurface
= &hSurface
;
238 /* Clear the structures */
239 RtlZeroMemory(&DdSurfaceLocal
, sizeof(DdSurfaceLocal
));
240 RtlZeroMemory(&DdSurfaceGlobal
, sizeof(DdSurfaceGlobal
));
241 RtlZeroMemory(&DdSurfaceMore
, sizeof(DdSurfaceMore
));
244 /* Loop for each surface */
245 for (i
= 0; i
< pCreateSurface
->dwSCnt
; i
++)
248 pSurfaceLocal
= pCreateSurface
->lplpSList
[i
];
249 pSurfaceGlobal
= pSurfaceLocal
->lpGbl
;
250 pSurfaceDesc
= pCreateSurface
->lpDDSurfaceDesc
;
252 /* Check if it has pixel data */
253 if (pSurfaceDesc
->dwFlags
& DDRAWISURF_HASPIXELFORMAT
)
255 /* Use its pixel data */
256 DdSurfaceGlobal
.ddpfSurface
= pSurfaceDesc
->ddpfPixelFormat
;
257 DdSurfaceGlobal
.ddpfSurface
.dwSize
= sizeof(DDPIXELFORMAT
);
261 /* Use the one from the global surface */
262 DdSurfaceGlobal
.ddpfSurface
= pSurfaceGlobal
->lpDD
->vmiData
.ddpfDisplay
;
266 DdSurfaceGlobal
.wWidth
= pSurfaceGlobal
->wWidth
;
267 DdSurfaceGlobal
.wHeight
= pSurfaceGlobal
->wHeight
;
268 DdSurfaceGlobal
.lPitch
= pSurfaceGlobal
->lPitch
;
269 DdSurfaceGlobal
.fpVidMem
= pSurfaceGlobal
->fpVidMem
;
270 DdSurfaceGlobal
.dwBlockSizeX
= pSurfaceGlobal
->dwBlockSizeX
;
271 DdSurfaceGlobal
.dwBlockSizeY
= pSurfaceGlobal
->dwBlockSizeY
;
272 // DdSurfaceGlobal.ddsCaps = pSurfaceLocal->ddsCaps | 0xBF0000;
274 /* FIXME: Ddscapsex stuff missing */
276 /* Call win32k now */
277 pCreateSurface
->ddRVal
= E_FAIL
;
279 Return
= NtGdiDdCreateSurface(GetDdHandle(pCreateSurface
->lpDD
->hDD
),
285 (PDD_CREATESURFACEDATA
)pCreateSurface
,
289 /* FIXME: Ddscapsex stuff missing */
291 /* Convert the data back */
292 pSurfaceGlobal
->lPitch
= DdSurfaceGlobal
.lPitch
;
293 pSurfaceGlobal
->fpVidMem
= DdSurfaceGlobal
.fpVidMem
;
294 pSurfaceGlobal
->dwBlockSizeX
= DdSurfaceGlobal
.dwBlockSizeX
;
295 pSurfaceGlobal
->dwBlockSizeY
= DdSurfaceGlobal
.dwBlockSizeY
;
296 pCreateSurface
->lplpSList
[i
]->hDDSurface
= (DWORD
) hSurface
;
298 /* FIXME: Ddscapsex stuff missing */
301 /* Check if we have to free all our local allocations */
302 if (SurfaceCount
> 1)
313 DdSetColorKey(LPDDHAL_SETCOLORKEYDATA pSetColorKey
)
316 return NtGdiDdSetColorKey((HANDLE
)pSetColorKey
->lpDDSurface
->hDDSurface
,
317 (PDD_SETCOLORKEYDATA
)pSetColorKey
);
322 DdGetScanLine(LPDDHAL_GETSCANLINEDATA pGetScanLine
)
325 return NtGdiDdGetScanLine(GetDdHandle(pGetScanLine
->lpDD
->hDD
),
326 (PDD_GETSCANLINEDATA
)pGetScanLine
);
329 /* PRIVATE FUNCTIONS *********************************************************/
330 static ULONG RemberDdQueryDisplaySettingsUniquenessID
= 0;
334 bDDCreateSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface
,
337 DD_SURFACE_LOCAL SurfaceLocal
;
338 DD_SURFACE_GLOBAL SurfaceGlobal
;
339 DD_SURFACE_MORE SurfaceMore
;
342 RtlZeroMemory(&SurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
343 RtlZeroMemory(&SurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
344 RtlZeroMemory(&SurfaceMore
, sizeof(DD_SURFACE_MORE
));
346 /* Set up SurfaceLocal struct */
347 SurfaceLocal
.ddsCaps
.dwCaps
= pSurface
->ddsCaps
.dwCaps
;
348 SurfaceLocal
.dwFlags
= pSurface
->dwFlags
;
350 /* Set up SurfaceMore struct */
351 RtlMoveMemory(&SurfaceMore
.ddsCapsEx
,
352 &pSurface
->ddckCKDestBlt
,
354 SurfaceMore
.dwSurfaceHandle
= (DWORD
)pSurface
->dbnOverlayNode
.object_int
->lpVtbl
;
356 /* Set up SurfaceGlobal struct */
357 SurfaceGlobal
.fpVidMem
= pSurface
->lpGbl
->fpVidMem
;
358 SurfaceGlobal
.dwLinearSize
= pSurface
->lpGbl
->dwLinearSize
;
359 SurfaceGlobal
.wHeight
= pSurface
->lpGbl
->wHeight
;
360 SurfaceGlobal
.wWidth
= pSurface
->lpGbl
->wWidth
;
362 /* Check if we have a pixel format */
363 if (pSurface
->dwFlags
& DDSD_PIXELFORMAT
)
366 SurfaceGlobal
.ddpfSurface
= pSurface
->lpGbl
->lpDD
->vmiData
.ddpfDisplay
;
367 SurfaceGlobal
.ddpfSurface
.dwSize
= sizeof(DDPIXELFORMAT
);
372 SurfaceGlobal
.ddpfSurface
= pSurface
->lpGbl
->lpDD
->vmiData
.ddpfDisplay
;
375 /* Create the object */
376 pSurface
->hDDSurface
= (DWORD
)NtGdiDdCreateSurfaceObject(GetDdHandle(pSurface
->lpGbl
->lpDD
->hDD
),
377 (HANDLE
)pSurface
->hDDSurface
,
384 if (pSurface
->hDDSurface
) return TRUE
;
388 /* PUBLIC FUNCTIONS **********************************************************/
397 DdCreateDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
,
402 /* Check if the global hDC (hdc == 0) is being used */
405 /* We'll only allow this if the global object doesn't exist yet */
409 if ((hdc
= CreateDC(L
"Display", NULL
, NULL
, NULL
)))
411 /* Create the DDraw Object */
412 ghDirectDraw
= NtGdiDdCreateDirectDrawObject(hdc
);
415 NtGdiDeleteObjectApp(hdc
);
419 /* If we created the object, or had one ...*/
422 /* Increase count and set success */
427 /* Zero the handle */
428 pDirectDrawGlobal
->hDD
= 0;
432 /* Using the per-process object, so create it */
433 pDirectDrawGlobal
->hDD
= (ULONG_PTR
)NtGdiDdCreateDirectDrawObject(hdc
);
435 /* Set the return value */
436 Return
= pDirectDrawGlobal
->hDD
? TRUE
: FALSE
;
439 /* Return to caller */
450 DdQueryDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
,
451 LPDDHALINFO pHalInfo
,
452 LPDDHAL_DDCALLBACKS pDDCallbacks
,
453 LPDDHAL_DDSURFACECALLBACKS pDDSurfaceCallbacks
,
454 LPDDHAL_DDPALETTECALLBACKS pDDPaletteCallbacks
,
455 LPD3DHAL_CALLBACKS pD3dCallbacks
,
456 LPD3DHAL_GLOBALDRIVERDATA pD3dDriverData
,
457 LPDDHAL_DDEXEBUFCALLBACKS pD3dBufferCallbacks
,
458 LPDDSURFACEDESC pD3dTextureFormats
,
462 PVIDEOMEMORY VidMemList
= NULL
;
464 D3DNTHAL_CALLBACKS D3dCallbacks
;
465 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData
;
466 DD_D3DBUFCALLBACKS D3dBufferCallbacks
;
467 DWORD CallbackFlags
[3];
468 DWORD dwNumHeaps
=0, FourCCs
;
471 /* Check if we got a list pointer */
474 /* Allocate memory for it */
475 VidMemList
= LocalAlloc(LMEM_ZEROINIT
,
476 sizeof(VIDEOMEMORY
) *
477 pHalInfo
->vmiData
.dwNumHeaps
);
480 /* Clear the structures */
481 RtlZeroMemory(&HalInfo
, sizeof(DD_HALINFO
));
482 RtlZeroMemory(&D3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
483 RtlZeroMemory(&D3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
484 RtlZeroMemory(&D3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
487 if (!NtGdiDdQueryDirectDrawObject(GetDdHandle(pDirectDrawGlobal
->hDD
),
499 /* We failed, free the memory and return */
500 if (VidMemList
) LocalFree(VidMemList
);
504 /* Clear the incoming pointer */
505 RtlZeroMemory(pHalInfo
, sizeof(DDHALINFO
));
507 /* Convert all the data */
508 pHalInfo
->dwSize
= sizeof(DDHALINFO
);
509 pHalInfo
->lpDDCallbacks
= pDDCallbacks
;
510 pHalInfo
->lpDDSurfaceCallbacks
= pDDSurfaceCallbacks
;
511 pHalInfo
->lpDDPaletteCallbacks
= pDDPaletteCallbacks
;
513 /* Check for NT5+ D3D Data */
514 if (D3dCallbacks
.dwSize
&& D3dDriverData
.dwSize
)
516 /* Write these down */
517 pHalInfo
->lpD3DGlobalDriverData
= (ULONG_PTR
)pD3dDriverData
;
518 pHalInfo
->lpD3DHALCallbacks
= (ULONG_PTR
)pD3dCallbacks
;
520 /* Check for Buffer Callbacks */
521 if (D3dBufferCallbacks
.dwSize
)
523 /* Write this one too */
524 pHalInfo
->lpDDExeBufCallbacks
= pD3dBufferCallbacks
;
528 /* Continue converting the rest */
529 pHalInfo
->vmiData
.dwFlags
= HalInfo
.vmiData
.dwFlags
;
530 pHalInfo
->vmiData
.dwDisplayWidth
= HalInfo
.vmiData
.dwDisplayWidth
;
531 pHalInfo
->vmiData
.dwDisplayHeight
= HalInfo
.vmiData
.dwDisplayHeight
;
532 pHalInfo
->vmiData
.lDisplayPitch
= HalInfo
.vmiData
.lDisplayPitch
;
533 pHalInfo
->vmiData
.fpPrimary
= 0;
534 pHalInfo
->vmiData
.ddpfDisplay
= HalInfo
.vmiData
.ddpfDisplay
;
535 pHalInfo
->vmiData
.dwOffscreenAlign
= HalInfo
.vmiData
.dwOffscreenAlign
;
536 pHalInfo
->vmiData
.dwOverlayAlign
= HalInfo
.vmiData
.dwOverlayAlign
;
537 pHalInfo
->vmiData
.dwTextureAlign
= HalInfo
.vmiData
.dwTextureAlign
;
538 pHalInfo
->vmiData
.dwZBufferAlign
= HalInfo
.vmiData
.dwZBufferAlign
;
539 pHalInfo
->vmiData
.dwAlphaAlign
= HalInfo
.vmiData
.dwAlphaAlign
;
540 pHalInfo
->vmiData
.dwNumHeaps
= dwNumHeaps
;
541 pHalInfo
->vmiData
.pvmList
= pvmList
;
542 // pHalInfo->ddCaps = HalInfo.ddCaps;
543 // pHalInfo->ddCaps.dwNumFourCCCodes = FourCCs;
544 pHalInfo
->lpdwFourCC
= pdwFourCC
;
545 pHalInfo
->ddCaps
.dwRops
[6] = 0x1000;
546 pHalInfo
->dwFlags
= HalInfo
.dwFlags
| DDHALINFO_GETDRIVERINFOSET
;
547 // pHalInfo->GetDriverInfo = DdGetDriverInfo;
549 /* Now check if we got any DD callbacks */
552 /* Zero the structure */
553 RtlZeroMemory(pDDCallbacks
, sizeof(DDHAL_DDCALLBACKS
));
555 /* Set the flags for this structure */
556 Flags
= CallbackFlags
[0];
558 /* Write the header */
559 pDDCallbacks
->dwSize
= sizeof(DDHAL_DDCALLBACKS
);
560 pDDCallbacks
->dwFlags
= Flags
;
562 /* Now write the pointers, if applicable */
563 if (Flags
& DDHAL_CB32_CREATESURFACE
)
565 pDDCallbacks
->CreateSurface
= DdCreateSurface
;
567 if (Flags
& DDHAL_CB32_WAITFORVERTICALBLANK
)
569 pDDCallbacks
->WaitForVerticalBlank
= DdWaitForVerticalBlank
;
571 if (Flags
& DDHAL_CB32_CANCREATESURFACE
)
573 pDDCallbacks
->CanCreateSurface
= DdCanCreateSurface
;
575 if (Flags
& DDHAL_CB32_GETSCANLINE
)
577 pDDCallbacks
->GetScanLine
= DdGetScanLine
;
581 /* Check for DD Surface Callbacks */
582 if (pDDSurfaceCallbacks
)
584 /* Zero the structures */
585 RtlZeroMemory(pDDSurfaceCallbacks
, sizeof(DDHAL_DDSURFACECALLBACKS
));
587 /* Set the flags for this one */
588 Flags
= CallbackFlags
[1];
591 /* Write the header, note that some functions are always exposed */
592 pDDSurfaceCallbacks
->dwSize
= sizeof(DDHAL_DDSURFACECALLBACKS
);
594 pDDSurfaceCallbacks
->dwFlags
= Flags
;
596 pDDSurfaceCallBacks->dwFlags = (DDHAL_SURFCB32_LOCK |
597 DDHAL_SURFCB32_UNLOCK |
598 DDHAL_SURFCB32_SETCOLORKEY |
599 DDHAL_SURFCB32_DESTROYSURFACE) | Flags;
602 /* Write the always-on functions */
603 pDDSurfaceCallbacks
->Lock
= DdLock
;
604 pDDSurfaceCallbacks
->Unlock
= DdUnlock
;
605 pDDSurfaceCallbacks
->SetColorKey
= DdSetColorKey
;
606 pDDSurfaceCallbacks
->DestroySurface
= DdDestroySurface
;
608 /* Write the optional ones */
609 if (Flags
& DDHAL_SURFCB32_FLIP
)
611 pDDSurfaceCallbacks
->Flip
= DdFlip
;
613 if (Flags
& DDHAL_SURFCB32_BLT
)
615 pDDSurfaceCallbacks
->Blt
= DdBlt
;
617 if (Flags
& DDHAL_SURFCB32_GETBLTSTATUS
)
619 pDDSurfaceCallbacks
->GetBltStatus
= DdGetBltStatus
;
621 if (Flags
& DDHAL_SURFCB32_GETFLIPSTATUS
)
623 pDDSurfaceCallbacks
->GetFlipStatus
= DdGetFlipStatus
;
625 if (Flags
& DDHAL_SURFCB32_UPDATEOVERLAY
)
627 pDDSurfaceCallbacks
->UpdateOverlay
= DdUpdateOverlay
;
629 if (Flags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
)
631 pDDSurfaceCallbacks
->SetOverlayPosition
= DdSetOverlayPosition
;
633 if (Flags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
)
635 pDDSurfaceCallbacks
->AddAttachedSurface
= DdAddAttachedSurface
;
639 /* Check for DD Palette Callbacks */
640 if (pDDPaletteCallbacks
)
642 /* Zero the struct */
643 RtlZeroMemory(pDDPaletteCallbacks
, sizeof(DDHAL_DDPALETTECALLBACKS
));
645 /* Get the flags for this one */
646 Flags
= CallbackFlags
[2];
648 /* Write the header */
649 pDDPaletteCallbacks
->dwSize
= sizeof(DDHAL_DDPALETTECALLBACKS
);
650 pDDPaletteCallbacks
->dwFlags
= Flags
;
653 /* Check for D3D Callbacks */
656 /* Zero the struct */
657 RtlZeroMemory(pD3dCallbacks
, sizeof(D3DHAL_CALLBACKS
));
659 /* Check if we have one */
660 if (D3dCallbacks
.dwSize
)
662 /* Write the header */
663 pD3dCallbacks
->dwSize
= sizeof(D3DHAL_CALLBACKS
);
665 /* Now check for each callback */
666 if (D3dCallbacks
.ContextCreate
)
669 pD3dCallbacks->ContextCreate = D3dContextCreate;
672 if (D3dCallbacks
.ContextDestroy
)
674 pD3dCallbacks
->ContextDestroy
= (LPD3DHAL_CONTEXTDESTROYCB
) NtGdiD3dContextDestroy
;
676 if (D3dCallbacks
.ContextDestroyAll
)
679 pD3dCallbacks->ContextDestroyAll = (LPD3DHAL_CONTEXTDESTROYALLCB) NtGdiD3dContextDestroyAll;
685 /* Check for D3D Driver Data */
688 /* Copy the struct */
689 RtlMoveMemory(pD3dDriverData
,
691 sizeof(D3DHAL_GLOBALDRIVERDATA
));
693 /* Write the pointer to the texture formats */
694 pD3dDriverData
->lpTextureFormats
= pD3dTextureFormats
;
697 /* FIXME: Check for D3D Buffer Callbacks */
699 /* Check if we have a video memory list */
702 /* Start a loop here */
703 PVIDEOMEMORY VidMem
= VidMemList
;
705 /* Loop all the heaps we have */
708 /* Copy from one format to the other */
709 pvmList
->dwFlags
= VidMem
->dwFlags
;
710 pvmList
->fpStart
= VidMem
->fpStart
;
711 pvmList
->fpEnd
= VidMem
->fpEnd
;
712 pvmList
->ddsCaps
= VidMem
->ddsCaps
;
713 pvmList
->ddsCapsAlt
= VidMem
->ddsCapsAlt
;
714 pvmList
->dwHeight
= VidMem
->dwHeight
;
716 /* Advance in both structures */
721 /* Free our structure */
722 LocalFree(VidMemList
);
736 DdDeleteDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
)
740 /* If this is the global object */
741 if(pDirectDrawGlobal
->hDD
)
744 Return
= NtGdiDdDeleteDirectDrawObject((HANDLE
)pDirectDrawGlobal
->hDD
);
747 pDirectDrawGlobal
->hDD
= 0;
750 else if (ghDirectDraw
)
752 /* Always success here */
755 /* Make sure this is the last instance */
756 if (!(--gcDirectDraw
))
758 /* Delete the object */
759 Return
= NtGdiDdDeleteDirectDrawObject(ghDirectDraw
);
778 DdCreateSurfaceObject( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
,
779 BOOL bPrimarySurface
)
781 return bDDCreateSurface(pSurfaceLocal
, TRUE
);
782 //return bDdCreateSurfaceObject(pSurfaceLocal, TRUE);
793 DdDeleteSurfaceObject(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
)
797 /* Make sure there is one */
798 if (pSurfaceLocal
->hDDSurface
)
801 Return
= NtGdiDdDeleteSurfaceObject((HANDLE
)pSurfaceLocal
->hDDSurface
);
802 pSurfaceLocal
->hDDSurface
= 0;
815 DdResetVisrgn(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
,
818 /* Call win32k directly */
819 return NtGdiDdResetVisrgn((HANDLE
) pSurfaceLocal
->hDDSurface
, hWnd
);
829 DdGetDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
,
830 LPPALETTEENTRY pColorTable
)
832 /* Call win32k directly */
833 return NtGdiDdGetDC(pColorTable
, (HANDLE
) pSurfaceLocal
->hDDSurface
);
843 DdReleaseDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
)
845 /* Call win32k directly */
846 return NtGdiDdReleaseDC((HANDLE
) pSurfaceLocal
->hDDSurface
);
855 DdCreateDIBSection(HDC hdc
,
856 CONST BITMAPINFO
*pbmi
,
862 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
873 DdReenableDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
,
876 /* Call win32k directly */
877 return NtGdiDdReenableDirectDrawObject(GetDdHandle(pDirectDrawGlobal
->hDD
),
889 DdAttachSurface( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceFrom
,
890 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceTo
)
892 /* Create Surface if it does not exits one */
893 if (pSurfaceFrom
->hDDSurface
)
895 if (!bDDCreateSurface(pSurfaceFrom
, FALSE
))
901 /* Create Surface if it does not exits one */
902 if (pSurfaceTo
->hDDSurface
)
904 if (!bDDCreateSurface(pSurfaceTo
, FALSE
))
911 return NtGdiDdAttachSurface((HANDLE
)pSurfaceFrom
->hDDSurface
,
912 (HANDLE
)pSurfaceTo
->hDDSurface
);
922 DdUnattachSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface
,
923 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceAttached
)
926 NtGdiDdUnattachSurface((HANDLE
)pSurface
->hDDSurface
,
927 (HANDLE
)pSurfaceAttached
->hDDSurface
);
937 DdQueryDisplaySettingsUniqueness()
939 return RemberDdQueryDisplaySettingsUniquenessID
;
949 DdGetDxHandle(LPDDRAWI_DIRECTDRAW_LCL pDDraw
,
950 LPDDRAWI_DDRAWSURFACE_LCL pSurface
,
954 HANDLE hSurface
= (HANDLE
)pSurface
->hDDSurface
;
956 /* Check if we already have a surface */
959 /* We don't have one, use the DirectDraw Object handle instead */
961 hDD
= GetDdHandle(pDDraw
->lpGbl
->hDD
);
965 return (HANDLE
)NtGdiDdGetDxHandle(hDD
, hSurface
, bRelease
);
975 DdSetGammaRamp(LPDDRAWI_DIRECTDRAW_LCL pDDraw
,
979 /* Call win32k directly */
980 return NtGdiDdSetGammaRamp(GetDdHandle(pDDraw
->lpGbl
->hDD
),
991 DdSwapTextureHandles(LPDDRAWI_DIRECTDRAW_LCL pDDraw
,
992 LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl1
,
993 LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl2
)
995 /* Always returns success */