xref: /reactos/win32ss/reactx/ntddraw/dxeng.c (revision db219e45)
1 /*
2  * PROJECT:          ReactOS Win32 Subsystem
3  * LICENSE:          GPL - See COPYING in the top level directory
4  * FILE:             win32ss/reactx/ntddraw/dxeng.c
5  * PURPOSE:          Implementation of DxEng functions
6  * PROGRAMMERS:      Magnus Olsen (magnus@greatlord.com)
7  *                   Oleg Dubinskiy (oleg.dubinskij30@gmail.com)
8  */
9 
10 #include <win32k.h>
11 
12 // #define NDEBUG
13 #include <debug.h>
14 
15 HSEMAPHORE  ghsemShareDevLock = NULL;
16 
17 ULONG gcEngFuncs = DXENG_INDEX_DxEngLoadImage + 1;
18 DRVFN gaEngFuncs[] =
19 {
20     {0, (PFN) NULL},
21     {DXENG_INDEX_DxEngNUIsTermSrv, (PFN)DxEngNUIsTermSrv},
22     {DXENG_INDEX_DxEngScreenAccessCheck, (PFN)DxEngScreenAccessCheck},
23     {DXENG_INDEX_DxEngRedrawDesktop, (PFN)DxEngRedrawDesktop},
24     {DXENG_INDEX_DxEngDispUniq, (PFN)DxEngDispUniq},
25     {DXENG_INDEX_DxEngIncDispUniq, (PFN)DxEngIncDispUniq},
26     {DXENG_INDEX_DxEngVisRgnUniq, (PFN)DxEngVisRgnUniq},
27     {DXENG_INDEX_DxEngLockShareSem, (PFN)DxEngLockShareSem},
28     {DXENG_INDEX_DxEngUnlockShareSem, (PFN)DxEngUnlockShareSem},
29     {DXENG_INDEX_DxEngEnumerateHdev, (PFN)DxEngEnumerateHdev},
30     {DXENG_INDEX_DxEngLockHdev, (PFN)DxEngLockHdev},
31     {DXENG_INDEX_DxEngUnlockHdev, (PFN)DxEngUnlockHdev},
32     {DXENG_INDEX_DxEngIsHdevLockedByCurrentThread, (PFN)DxEngIsHdevLockedByCurrentThread},
33     {DXENG_INDEX_DxEngReferenceHdev, (PFN)DxEngReferenceHdev},
34     {DXENG_INDEX_DxEngUnreferenceHdev, (PFN)DxEngUnreferenceHdev},
35     {DXENG_INDEX_DxEngGetDeviceGammaRamp, (PFN)DxEngGetDeviceGammaRamp},
36     {DXENG_INDEX_DxEngSetDeviceGammaRamp, (PFN)DxEngSetDeviceGammaRamp},
37     {DXENG_INDEX_DxEngSpTearDownSprites, (PFN)DxEngSpTearDownSprites},
38     {DXENG_INDEX_DxEngSpUnTearDownSprites, (PFN)DxEngSpUnTearDownSprites},
39     {DXENG_INDEX_DxEngSpSpritesVisible, (PFN)DxEngSpSpritesVisible},
40     {DXENG_INDEX_DxEngGetHdevData, (PFN)DxEngGetHdevData},
41     {DXENG_INDEX_DxEngSetHdevData, (PFN)DxEngSetHdevData},
42     {DXENG_INDEX_DxEngCreateMemoryDC, (PFN)DxEngCreateMemoryDC},
43     {DXENG_INDEX_DxEngGetDesktopDC, (PFN)DxEngGetDesktopDC},
44     {DXENG_INDEX_DxEngDeleteDC, (PFN)DxEngDeleteDC},
45     {DXENG_INDEX_DxEngCleanDC, (PFN)DxEngCleanDC},
46     {DXENG_INDEX_DxEngSetDCOwner, (PFN)DxEngSetDCOwner},
47     {DXENG_INDEX_DxEngLockDC, (PFN)DxEngLockDC},
48     {DXENG_INDEX_DxEngUnlockDC, (PFN)DxEngUnlockDC},
49     {DXENG_INDEX_DxEngSetDCState, (PFN)DxEngSetDCState},
50     {DXENG_INDEX_DxEngGetDCState, (PFN)DxEngGetDCState},
51     {DXENG_INDEX_DxEngSelectBitmap, (PFN)DxEngSelectBitmap},
52     {DXENG_INDEX_DxEngSetBitmapOwner, (PFN)DxEngSetBitmapOwner},
53     {DXENG_INDEX_DxEngDeleteSurface, (PFN)DxEngDeleteSurface},
54     {DXENG_INDEX_DxEngGetSurfaceData, (PFN)DxEngGetSurfaceData},
55     {DXENG_INDEX_DxEngAltLockSurface, (PFN)DxEngAltLockSurface},
56     {DXENG_INDEX_DxEngUploadPaletteEntryToSurface, (PFN)DxEngUploadPaletteEntryToSurface},
57     {DXENG_INDEX_DxEngMarkSurfaceAsDirectDraw, (PFN)DxEngMarkSurfaceAsDirectDraw},
58     {DXENG_INDEX_DxEngSelectPaletteToSurface, (PFN)DxEngSelectPaletteToSurface},
59     {DXENG_INDEX_DxEngSyncPaletteTableWithDevice, (PFN)DxEngSyncPaletteTableWithDevice},
60     {DXENG_INDEX_DxEngSetPaletteState, (PFN)DxEngSetPaletteState},
61     {DXENG_INDEX_DxEngGetRedirectionBitmap, (PFN)DxEngGetRedirectionBitmap},
62     {DXENG_INDEX_DxEngLoadImage, (PFN)DxEngLoadImage}
63 };
64 
65 /*++
66 * @name DxEngDispUniq
67 * @implemented
68 *
69 * The function DxEngDispUniq returns the DisplayUniqVisrgn counter value from GDI shared memory
70 *
71 * @return
72 * Returns the DisplayUniqVisrgn counter value from GDI shared memory
73 *
74 * @remarks.
75 * none
76 *
77 *--*/
78 ULONG
79 APIENTRY
80 DxEngDispUniq(VOID)
81 {
82     DPRINT("ReactX Calling : DxEngDispUniq\n");
83     return GdiHandleTable->flDeviceUniq;
84 }
85 
86 /*++
87 * @name DxEngGetDeviceGammaRamp
88 * @implemented
89 *
90 * The function DxEngGetDeviceGammaRamp gets the gamma ramp to dxg.sys.
91 
92 * @param HDEV hPDev
93 * The hdev.
94 *
95 * @param PGAMMARAMP Ramp
96 * Pointer to store the gamma ramp value in.
97 *
98 * @return
99 *Returns TRUE for success, FALSE for failure
100 *
101 * @remarks.
102 * None
103 *
104 *--*/
105 BOOL
106 APIENTRY
107 DxEngGetDeviceGammaRamp(HDEV hPDev, PGAMMARAMP Ramp)
108 {
109     DPRINT("ReactX Calling : DxEngGetDeviceGammaRamp\n");
110     return IntGetDeviceGammaRamp(hPDev, Ramp);
111 }
112 
113 /*++
114 * @name DxEngLockDC
115 * @implemented
116 *
117 * The function DxEngLockDC locks a hdc from dxg.sys
118 *
119 * @param HDC hDC
120 * The handle we want to lock
121 *
122 * @return
123 * Returns PDC if lock succeeded or NULL if it failed.
124 *
125 * @remarks.
126 * none
127 *
128 *--*/
129 PDC
130 APIENTRY
131 DxEngLockDC(HDC hDC)
132 {
133     DPRINT("ReactX Calling : DxEngLockDC\n");
134     return DC_LockDc(hDC);
135 }
136 
137 /*++
138 * @name DxEngUnlockDC
139 * @implemented
140 *
141 * The function DxEngUnlockDC unlocks a pDC (hdc) from dxg.sys.
142 
143 * @param PDC pDC
144 * The handle we want to unlock.
145 *
146 * @return
147 * This function returns TRUE no matter what.
148 *
149 * @remarks.
150 * none
151 *
152 *--*/
153 BOOLEAN
154 APIENTRY
155 DxEngUnlockDC(PDC pDC)
156 {
157     DPRINT("ReactX Calling : DxEngUnlockDC\n");
158     DC_UnlockDc(pDC);
159     return TRUE;
160 }
161 
162 /*++
163 * @name DxEngLockShareSem
164 * @implemented
165 *
166 * The function DxEngLockShareSem locks a struct of type ghsemShareDevLock that can be shared.
167 *
168 * @return
169 * This function returns TRUE for success and FALSE for failure.
170 * FALSE must mean the struct has already been locked.
171 *
172 * @remarks.
173 * It is being used in various ntuser* functions and ntgdi*
174 * ReactOS specific: It is not in use yet?
175 *SystemResourcesList
176 *--*/
177 BOOLEAN
178 APIENTRY
179 DxEngLockShareSem(VOID)
180 {
181     DPRINT("ReactX Calling : DxEngLockShareSem\n");
182     if(!ghsemShareDevLock) ghsemShareDevLock = EngCreateSemaphore(); // Hax, should be in dllmain.c
183     EngAcquireSemaphore(ghsemShareDevLock);
184     return TRUE;
185 }
186 
187 /*++
188 * @name DxEngUnlockShareSem
189 * @implemented
190 *
191 * The function DxEngUnlockShareSem unlocks the struct of type ghsemShareDevLock.
192 *
193 * @return
194 * This function returns TRUE no matter what.
195 *
196 * @remarks.
197 * ReactOS specific: It is not in use yet?
198 *
199 *--*/
200 BOOLEAN
201 APIENTRY
202 DxEngUnlockShareSem(VOID)
203 {
204     DPRINT("ReactX Calling : DxEngUnlockShareSem\n");
205     EngReleaseSemaphore(ghsemShareDevLock);
206     return TRUE;
207 }
208 
209 /*++
210 * @name DxEngSetDeviceGammaRamp
211 * @implemented
212 *
213 * The function DxEngSetDeviceGammaRamp sets gamma ramp from dxg.sys
214 
215 * @param HDEV hPDev
216 * The hdev
217 *
218 * @param PGAMMARAMP Ramp
219 * Value to change gamma ramp to.
220 *
221 * @param BOOL Test
222 * Whether gamma should be tested. TRUE to test, FALSE to not test.
223 *
224 * @return
225 *Returns TRUE for success, FALSE for failure.
226 *
227 * @remarks.
228 * None
229 *
230 *--*/
231 BOOLEAN
232 APIENTRY
233 DxEngSetDeviceGammaRamp(HDEV hPDev, PGAMMARAMP Ramp, BOOL Test)
234 {
235     DPRINT("ReactX Calling : DxEngSetDeviceGammaRamp\n");
236     return IntSetDeviceGammaRamp(hPDev, Ramp, Test);
237 }
238 
239 /*++
240 * @name DxEngGetHdevData
241 * @implemented
242 *
243 * The function DxEngGetHdevData retrieves a value from the HDEV
244 
245 * @param HDEV hPDev
246 * The HDEV
247 *
248 * @param DXEGSHDEVDATA Type
249 * The following typs are supported
250 * Type                                            Purpose
251 * DxEGShDevData_Surface      Retrieve pointer to Surface handle.
252 * DxEGShDevData_hSpooler     Device object of graphics driver.
253 * DxEGShDevData_DitherFmt    Retrieve the device iDitherFormat
254 * DxEGShDevData_FxCaps       Retrieve the device flGraphicsCaps
255 * DxEGShDevData_FxCaps2      Retrieve the device flGraphicsCaps2
256 * DxEGShDevData_DrvFuncs     Retrieve the device DriverFunctions function table
257 * DxEGShDevData_dhpdev       Retrieve the device hPDev, the real DHPDEV
258 * DxEGShDevData_eddg         Retrieve the device pEDDgpl
259 * DxEGShDevData_dd_nCount    Retrieve the device DxDd_nCount
260 * DxEGShDevData_dd_flags     Retrieve the device DxDd_Flags
261 * DxEGShDevData_disable      See if the device pdev is disabled
262 * DxEGShDevData_metadev      See if the device pdev is a meta device
263 * DxEGShDevData_display      See if the device is the primary display driver
264 * DxEGShDevData_Parent       Retrieve the ppdevParent
265 * DxEGShDevData_OpenRefs     Retrieve the pdevOpenRefs counter
266 * DxEGShDevData_palette      See if the device RC_PALETTE is set
267 * DxEGShDevData_ldev         ATM we do not support the Loader Device driver structure
268 * DxEGShDevData_GDev         Retrieve the device pGraphicsDevice
269 * DxEGShDevData_clonedev     Retrieve the device PDEV_CLONE_DEVICE flag is set or not
270 *
271 * @return
272 * Returns the data we requested
273 *
274 * @remarks.
275 * ReactOS specific: Implementation is incomplete, I do not save the value into the hdev yet.
276 *
277 *--*/
278 DWORD_PTR
279 APIENTRY
280 DxEngGetHdevData(HDEV hDev,
281                  DXEGSHDEVDATA Type)
282 {
283     DWORD_PTR retVal = 0;
284     PPDEVOBJ PDev = (PPDEVOBJ)hDev;
285 
286     DPRINT("ReactX Calling : DxEngGetHdevData, Type: %d\n", Type);
287 
288 #if 1
289     DPRINT("hDev: %p\n", hDev);
290 #endif
291 
292     switch ( Type )
293     {
294       case DxEGShDevData_Surface:
295         DPRINT("requested DxEGShDevData_Surface\n");
296         retVal = (DWORD_PTR) PDev->pSurface; // ptr to Surface handle.
297         break;
298       case DxEGShDevData_hSpooler:
299         DPRINT("requested DxEGShDevData_hSpooler\n");
300         retVal = (DWORD_PTR) PDev->hSpooler;
301         break;
302       case DxEGShDevData_DitherFmt:
303         DPRINT("requested DxEGShDevData_DitherFmt\n");
304         retVal = (DWORD_PTR) PDev->devinfo.iDitherFormat;
305         break;
306       case DxEGShDevData_FxCaps:
307         DPRINT("requested DxEGShDevData_FxCaps\n");
308         retVal = (DWORD_PTR) PDev->devinfo.flGraphicsCaps;
309         break;
310       case DxEGShDevData_FxCaps2:
311         DPRINT("requested DxEGShDevData_FxCaps2\n");
312         retVal = (DWORD_PTR) PDev->devinfo.flGraphicsCaps2;
313         break;
314       case DxEGShDevData_DrvFuncs:
315         DPRINT("requested DxEGShDevData_DrvFuncs\n");
316         retVal = (DWORD_PTR) &PDev->DriverFunctions;
317         break;
318       case DxEGShDevData_dhpdev:
319         DPRINT("requested DxEGShDevData_dhpdev\n");
320         retVal = (DWORD_PTR) PDev->dhpdev; // DHPDEV
321         break;
322       case DxEGShDevData_eddg:
323         DPRINT("requested DxEGShDevData_eddg\n");
324         retVal = (DWORD_PTR) PDev->pEDDgpl;
325         break;
326       case DxEGShDevData_dd_locks:
327         DPRINT("requested DxEGShDevData_dd_locks\n");
328         retVal = (DWORD_PTR) PDev->cDirectDrawDisableLocks;
329         break;
330       case DxEGShDevData_dd_flags:
331         DPRINT("requested DxEGShDevData_dd_flags\n");
332         retVal = (DWORD_PTR) PDev->DxDd_Flags;
333         break;
334       case DxEGShDevData_disable:
335         DPRINT("requested DxEGShDevData_disable\n");
336         retVal = (DWORD_PTR) PDev->flFlags & PDEV_DISABLED;
337         break;
338       case DxEGShDevData_metadev:
339         DPRINT("requested DxEGShDevData_metadev\n");
340         retVal = (DWORD_PTR) PDev->flFlags & PDEV_META_DEVICE;
341         break;
342       case DxEGShDevData_display:
343         DPRINT("requested DxEGShDevData_display\n");
344         retVal = (DWORD_PTR) PDev->flFlags & PDEV_DISPLAY;
345         break;
346       case DxEGShDevData_Parent:
347         DPRINT("requested DxEGShDevData_Parent\n");
348         retVal = (DWORD_PTR) PDev->ppdevParent;
349         break;
350       case DxEGShDevData_OpenRefs:
351         DPRINT("requested DxEGShDevData_OpenRefs\n");
352         retVal = (DWORD_PTR) PDev->cPdevOpenRefs != 0;
353         break;
354       case DxEGShDevData_palette:
355         DPRINT("requested DxEGShDevData_palette\n");
356         retVal = (DWORD_PTR) PDev->gdiinfo.flRaster & RC_PALETTE;
357         break;
358       case DxEGShDevData_ldev:
359         DPRINT("requested DxEGShDevData_ldev\n");
360         retVal = (DWORD_PTR) PDev->pldev;
361         break;
362       case DxEGShDevData_GDev:
363         DPRINT("requested DxEGShDevData_GDev\n");
364         retVal = (DWORD_PTR) PDev->pGraphicsDevice; // P"GRAPHICS_DEVICE"
365         break;
366       case DxEGShDevData_clonedev:
367         DPRINT("requested DxEGShDevData_clonedev\n");
368         retVal = (DWORD_PTR) PDev->flFlags & PDEV_CLONE_DEVICE;
369         break;
370       default:
371         // TODO: Make this default a bit more useful.
372         break;
373     }
374 
375 #if 1
376     DPRINT("retVal: %08Ix\n", retVal);
377 #endif
378 
379     return retVal;
380 }
381 
382 /*++
383 * @name DxEngSetHdevData
384 * @implemented
385 *
386 * The function DxEngSetHdevData sets a value in hdev
387 
388 * @param HDEV hPDev
389 * The hdev
390 *
391 * @param DXEGSHDEVDATA Type
392 * Supports only DxEGShDevData_dd_nCount. It is an internal counter on how many times hdev has been locked and unlocked
393 *
394 * @param DWORD Data
395 * The value to be saved to hdev's internal counter.
396 *
397 * @return
398 * Returns TRUE for success, FALSE for failure
399 *
400 * @remarks.
401 * none
402 *
403 *--*/
404 BOOLEAN
405 APIENTRY
406 DxEngSetHdevData(HDEV hDev,
407                  DXEGSHDEVDATA Type,
408                  DWORD_PTR Data)
409 {
410     BOOLEAN retVal = FALSE; // Default, no set.
411 
412     DPRINT("ReactX Calling : DxEngSetHdevData, Type: %d\n", Type);
413 
414     if (Type == DxEGShDevData_dd_locks)
415     {
416         DPRINT("Assigning value: %Iu\n", Data);
417         ((PPDEVOBJ)hDev)->cDirectDrawDisableLocks = Data;
418         retVal = TRUE; // Set
419     }
420     return retVal;
421 }
422 
423 /*++
424 * @name DxEngGetDCState
425 * @implemented
426 *
427 * The function DxEngGetDCState is capable of returning three
428 * DC states depending on what value is passed in its second parameter:
429 * 1. If the DC is full screen
430 * 2. Get Complexity of visible region
431 * 3. Get Driver hdev, which is ppdev
432 *
433 * @param HDC hdc
434 * The DC handle
435 *
436 * @param DWORD type
437 * value 1 = Is DC fullscreen
438 * value 2 = Get Complexity of visible region.
439 * value 3 = Get Driver hdev, which is a ppdev.
440 *
441 * @return
442 * Return one of the type values
443 *
444 * @remarks.
445 * none
446 *
447 *--*/
448 DWORD_PTR
449 APIENTRY
450 DxEngGetDCState(HDC hDC,
451                 DWORD type)
452 {
453     PDC pDC = DC_LockDc(hDC);
454     DWORD_PTR retVal = 0;
455 
456     DPRINT("ReactX Calling : DxEngGetDCState, type: %lu\n", type);
457 
458     if (pDC)
459     {
460         switch (type)
461         {
462             case 1:
463                 retVal = (DWORD_PTR) pDC->fs & DC_FULLSCREEN;
464                 break;
465             case 2:
466                 /* Return the complexity of the visible region. */
467                 retVal = (DWORD_PTR) REGION_Complexity(pDC->prgnVis);
468                 break;
469             case 3:
470             {
471                 /* Return the HDEV of this DC. */
472                 retVal = (DWORD_PTR) pDC->ppdev;
473                 break;
474             }
475             default:
476                 /* If a valid type is not found, zero is returned */
477                 DPRINT1("Warning: did not find type %lu\n", type);
478                 break;
479         }
480         DC_UnlockDc(pDC);
481     }
482 
483     DPRINT("retVal: %08Ix\n", retVal);
484 
485     return retVal;
486 }
487 
488 /*++
489 * @name DxEngIncDispUniq
490 * @implemented
491 *
492 * The function DxEngIncDispUniq increments the DisplayUniqVisrgn counter from GDI shared memory.
493 *
494 * @return
495 * This function returns TRUE no matter what.
496 *
497 * @remarks.
498 * none
499 *
500 *--*/
501 BOOLEAN
502 APIENTRY
503 DxEngIncDispUniq(VOID)
504 {
505     DPRINT("ReactX Calling : DxEngIncDispUniq\n");
506 
507     InterlockedIncrement((LONG*)&GdiHandleTable->flDeviceUniq);
508     return TRUE;
509 }
510 
511 /*++
512 * @name DxEngLockHdev
513 * @implemented
514 *
515 * The function DxEngLockHdev lock the internal PDEV
516 *
517 * @param HDEV type
518 * it is a pointer to win32k internal pdev struct known as PPDEVOBJ
519 
520 * @return
521 * This function returns TRUE no matter what.
522 *
523 * @remarks.
524 * none
525 *
526 *--*/
527 BOOLEAN
528 APIENTRY
529 DxEngLockHdev(HDEV hDev)
530 {
531     PPDEVOBJ ppdev = (PPDEVOBJ)hDev;
532     PERESOURCE Resource;
533 
534     DPRINT("ReactX Calling : DxEngLockHdev\n");
535 
536     DPRINT("hDev: %p\n", hDev);
537 
538     Resource = (PERESOURCE)ppdev->hsemDevLock;
539 
540     if (Resource)
541     {
542         KeEnterCriticalRegion();
543         ExAcquireResourceExclusiveLite( Resource , TRUE); // Lock monitor.
544     }
545     return TRUE;
546 }
547 
548 /*++
549 * @name DxEngUnlockHdev
550 * @implemented
551 *
552 * The function DxEngUnlockHdev unlock the internal PDEV
553 *
554 * @param HDEV type
555 * it is a pointer to win32k internal pdev struct known as PPDEVOBJ
556 
557 * @return
558 * This function returns TRUE no matter what.
559 *
560 * @remarks.
561 * none
562 *
563 *--*/
564 BOOLEAN
565 APIENTRY
566 DxEngUnlockHdev(HDEV hDev)
567 {
568     PPDEVOBJ ppdev = (PPDEVOBJ)hDev;
569     PERESOURCE Resource = (PERESOURCE)ppdev->hsemDevLock;
570 
571     DPRINT("ReactX Calling : DxEngUnlockHdev\n");
572 
573     if (Resource)
574     {
575         ExReleaseResourceLite( Resource );
576         KeLeaveCriticalRegion();
577     }
578     return TRUE;
579 }
580 
581 /************************************************************************/
582 /* DxEngReferenceHdev                                                   */
583 /************************************************************************/
584 BOOLEAN
585 APIENTRY
586 DxEngReferenceHdev(HDEV hDev)
587 {
588     PDEVOBJ_vReference((PPDEVOBJ)hDev);
589     /* ALWAYS return true */
590     return TRUE;
591 }
592 
593 /************************************************************************/
594 /* DxEngNUIsTermSrv                                                     */
595 /************************************************************************/
596 
597 /* Notes: Check if terminal server got connections or not */
598 BOOLEAN
599 APIENTRY
600 DxEngNUIsTermSrv(VOID)
601 {
602     /* FIXME: ReactOS does not suport terminal server yet, we can not check if we got connections or not */
603     UNIMPLEMENTED;
604     return FALSE;
605 }
606 
607 /************************************************************************/
608 /* DxEngRedrawDesktop                                                   */
609 /************************************************************************/
610 
611 /* Notes: it always returns TRUE, and it updates whole screen
612    (redraws current desktop) */
613 BOOLEAN
614 APIENTRY
615 DxEngRedrawDesktop(VOID)
616 {
617     UserRedrawDesktop();
618     return TRUE;
619 }
620 
621 ULONG gulVisRgnUniqueness; // Increase count everytime client region is updated.
622 
623 /************************************************************************/
624 /* DxEngVisRgnUniq                                                      */
625 /************************************************************************/
626 /* Notes: returns the VisRgnUniq counter for win32k */
627 ULONG
628 APIENTRY
629 DxEngVisRgnUniq(VOID)
630 {
631     DPRINT("ReactX Calling : DxEngVisRgnUniq\n");
632 
633     return gulVisRgnUniqueness;
634 }
635 
636 /************************************************************************/
637 /* DxEngEnumerateHdev                                                   */
638 /************************************************************************/
639 /* Enumerate all drivers in win32k */
640 HDEV *
641 APIENTRY
642 DxEngEnumerateHdev(HDEV *hdev)
643 {
644     /* FIXME: Enumerate all drivers in win32k */
645     UNIMPLEMENTED;
646     return FALSE;
647 }
648 
649 /************************************************************************/
650 /* DxEngCreateMemoryDC                                                  */
651 /************************************************************************/
652 HDC
653 APIENTRY
654 DxEngCreateMemoryDC(HDEV hDev)
655 {
656     return IntGdiCreateDisplayDC(hDev, DCTYPE_MEMORY, FALSE);
657 }
658 
659 /************************************************************************/
660 /* DxEngScreenAccessCheck                                               */
661 /************************************************************************/
662 DWORD APIENTRY DxEngScreenAccessCheck(VOID)
663 {
664     UNIMPLEMENTED;
665 
666     /* We're cheating here and telling dxg.sys it has always had permissions to access the screen */
667     return TRUE;
668 }
669 
670 /************************************************************************/
671 /* DxEngIsHdevLockedByCurrentThread                                     */
672 /************************************************************************/
673 BOOLEAN
674 APIENTRY
675 DxEngIsHdevLockedByCurrentThread(HDEV hDev)
676 {   // Based on EngIsSemaphoreOwnedByCurrentThread w/o the Ex call.
677     PERESOURCE pSem = (PERESOURCE)(((PPDEVOBJ)hDev)->hsemDevLock);
678     return pSem->OwnerEntry.OwnerThread == (ERESOURCE_THREAD)PsGetCurrentThread();
679 }
680 
681 /************************************************************************/
682 /* DxEngUnreferenceHdev                                                 */
683 /************************************************************************/
684 BOOLEAN
685 APIENTRY
686 DxEngUnreferenceHdev(HDEV hDev)
687 {
688     PDEVOBJ_vRelease((PPDEVOBJ)hDev);
689     return TRUE; // Always true.
690 }
691 
692 /************************************************************************/
693 /* DxEngGetDesktopDC                                                    */
694 /************************************************************************/
695 HDC
696 APIENTRY
697 DxEngGetDesktopDC(ULONG DcType, BOOL EmptyDC, BOOL ValidatehWnd)
698 {
699     return UserGetDesktopDC(DcType, EmptyDC, ValidatehWnd);
700 }
701 
702 /************************************************************************/
703 /* DxEngDeleteDC                                                        */
704 /************************************************************************/
705 BOOLEAN
706 APIENTRY
707 DxEngDeleteDC(HDC hdc, BOOL Force)
708 {
709    return IntGdiDeleteDC(hdc, Force);
710 }
711 
712 /************************************************************************/
713 /* DxEngCleanDC                                                         */
714 /************************************************************************/
715 BOOLEAN
716 APIENTRY
717 DxEngCleanDC(HDC hdc)
718 {
719     return IntGdiCleanDC(hdc);
720 }
721 
722 /************************************************************************/
723 /* DxEngSetDCOwner                                                      */
724 /************************************************************************/
725 BOOL APIENTRY DxEngSetDCOwner(HGDIOBJ hObject, DWORD OwnerMask)
726 {
727     DPRINT("ReactX Calling : DxEngSetDCOwner\n");
728 
729     return GreSetDCOwner(hObject, OwnerMask);
730 }
731 
732 /************************************************************************/
733 /* DxEngSetDCState                                                      */
734 /************************************************************************/
735 BOOLEAN
736 APIENTRY
737 DxEngSetDCState(HDC hDC, DWORD SetType, DWORD Set)
738 {
739    BOOLEAN Ret = FALSE;
740    PDC pDC = DC_LockDc(hDC);
741 
742    if (pDC)
743    {
744       if (SetType == 1)
745       {
746         if ( Set )
747             pDC->fs |= DC_FULLSCREEN;
748         else
749             pDC->fs &= ~DC_FULLSCREEN;
750         Ret = TRUE;
751       }
752       DC_UnlockDc(pDC);
753       return Ret; // Everything else returns FALSE.
754    }
755    return Ret;
756 }
757 
758 /************************************************************************/
759 /* DxEngSelectBitmap                                                    */
760 /************************************************************************/
761 HBITMAP APIENTRY DxEngSelectBitmap(HDC hdc, HBITMAP hbmp)
762 {
763     DPRINT("ReactX Calling : DxEngSelectBitmap\n");
764 
765     return NtGdiSelectBitmap(hdc, hbmp);
766 }
767 
768 /************************************************************************/
769 /* DxEngSetBitmapOwner                                                  */
770 /************************************************************************/
771 BOOLEAN APIENTRY DxEngSetBitmapOwner(HBITMAP hbmp, ULONG ulOwner)
772 {
773     DPRINT("ReactX Calling : DxEngSetBitmapOwner\n");
774 
775     return GreSetBitmapOwner(hbmp, ulOwner);
776 }
777 
778 /************************************************************************/
779 /* DxEngDeleteSurface                                                   */
780 /************************************************************************/
781 BOOLEAN APIENTRY DxEngDeleteSurface(HSURF hsurf)
782 {
783     DPRINT("ReactX Calling : DxEngDeleteSurface\n");
784 
785     return EngDeleteSurface(hsurf);
786 }
787 
788 /************************************************************************/
789 /* DxEngGetSurfaceData                                                  */
790 /************************************************************************/
791 DWORD APIENTRY DxEngGetSurfaceData(DWORD x1, DWORD x2)
792 {
793     UNIMPLEMENTED;
794     return FALSE;
795 }
796 
797 /************************************************************************/
798 /* DxEngAltLockSurface                                                  */
799 /************************************************************************/
800 SURFOBJ * APIENTRY DxEngAltLockSurface(HSURF hsurf)
801 {
802     DPRINT("ReactX Calling : DxEngAltLockSurface\n");
803 
804     return EngLockSurface(hsurf);
805 }
806 
807 /************************************************************************/
808 /* DxEngUploadPaletteEntryToSurface                                     */
809 /************************************************************************/
810 DWORD APIENTRY DxEngUploadPaletteEntryToSurface(DWORD x1, DWORD x2,DWORD x3, DWORD x4)
811 {
812     UNIMPLEMENTED;
813     return FALSE;
814 }
815 
816 /************************************************************************/
817 /* DxEngMarkSurfaceAsDirectDraw                                         */
818 /************************************************************************/
819 DWORD APIENTRY DxEngMarkSurfaceAsDirectDraw(DWORD x1, DWORD x2)
820 {
821     UNIMPLEMENTED;
822     return FALSE;
823 }
824 
825 /************************************************************************/
826 /* DxEngSelectPaletteToSurface                                          */
827 /************************************************************************/
828 DWORD APIENTRY DxEngSelectPaletteToSurface(DWORD x1, DWORD x2)
829 {
830     UNIMPLEMENTED;
831     return FALSE;
832 }
833 
834 /************************************************************************/
835 /* DxEngSyncPaletteTableWithDevice                                      */
836 /************************************************************************/
837 DWORD APIENTRY DxEngSyncPaletteTableWithDevice(DWORD x1, DWORD x2)
838 {
839     UNIMPLEMENTED;
840     return FALSE;
841 }
842 
843 /************************************************************************/
844 /* DxEngSetPaletteState                                                 */
845 /************************************************************************/
846 DWORD APIENTRY DxEngSetPaletteState(DWORD x1, DWORD x2, DWORD x3)
847 {
848     UNIMPLEMENTED;
849     return FALSE;
850 }
851 
852 /************************************************************************/
853 /* DxEngGetRedirectionBitmap                                            */
854 /************************************************************************/
855 DWORD
856 APIENTRY
857 DxEngGetRedirectionBitmap(DWORD x1)
858 {
859     return FALSE; // Normal return.
860 }
861 
862 /************************************************************************/
863 /* DxEngLoadImage                                                       */
864 /************************************************************************/
865 DWORD APIENTRY DxEngLoadImage(DWORD x1,DWORD x2)
866 {
867     UNIMPLEMENTED;
868     return FALSE;
869 }
870 
871 /************************************************************************/
872 /* DxEngSpTearDownSprites                                               */
873 /************************************************************************/
874 DWORD APIENTRY DxEngSpTearDownSprites(DWORD x1, DWORD x2, DWORD x3)
875 {
876     UNIMPLEMENTED;
877     return FALSE;
878 }
879 
880 /************************************************************************/
881 /* DxEngSpUnTearDownSprites                                             */
882 /************************************************************************/
883 DWORD APIENTRY DxEngSpUnTearDownSprites(DWORD x1, DWORD x2, DWORD x3)
884 {
885     UNIMPLEMENTED;
886     return FALSE;
887 }
888 
889 /************************************************************************/
890 /* DxEngSpSpritesVisible                                                */
891 /************************************************************************/
892 DWORD APIENTRY DxEngSpSpritesVisible(DWORD x1)
893 {
894     UNIMPLEMENTED;
895     return FALSE;
896 }
897