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