[DXG] Initial implementation of DxDdLock and better stub for DxDdUnlock
[reactos.git] / reactos / win32ss / reactx / dxg / ddsurf.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Native driver for dxg implementation
5 * FILE: win32ss/reactx/dxg/ddsurf.c
6 * PROGRAMER: Sebastian Gasiorek (sebastian.gasiorek@reactos.org)
7 */
8
9 /*++
10 * @name DxDdLock
11 * @implemented
12 *
13 * The function DxDdLock locks the surface and calls
14 * MapMemory driver function to assign surface memory.
15 * Surface memory is returned in mapMemoryData.fpProcess variable
16 *
17 * @param HANDLE hSurface
18 * Handle to DirectDraw surface
19 *
20 * @param PDD_LOCKDATA puLockData
21 * Structure with lock details
22 *
23 * @param HDC hdcClip
24 * Reserved
25 *
26 * @return
27 * Returns DDHAL_DRIVER_HANDLED or DDHAL_DRIVER_NOTHANDLED.
28 *
29 * @remarks.
30 * Missing lock data and error handling.
31 *--*/
32 DWORD
33 NTAPI
34 DxDdLock(HANDLE hSurface,
35 PDD_LOCKDATA puLockData,
36 HDC hdcClip)
37 {
38 PEDD_SURFACE pSurface;
39 PEDD_DIRECTDRAW_LOCAL peDdL;
40 PEDD_DIRECTDRAW_GLOBAL peDdGl;
41 DD_MAPMEMORYDATA mapMemoryData;
42
43 pSurface = (PEDD_SURFACE)DdHmgLock(hSurface, ObjType_DDSURFACE_TYPE, TRUE);
44 peDdL = pSurface->peDirectDrawLocal;
45 peDdGl = peDdL->peDirectDrawGlobal2;
46
47 // Map memory if it's not already mapped and driver function is provided
48 if (!peDdL->isMemoryMapped && (peDdGl->ddCallbacks.dwFlags & DDHAL_CB32_MAPMEMORY))
49 {
50 mapMemoryData.bMap = 1;
51 mapMemoryData.hProcess = (HANDLE)-1;
52 mapMemoryData.fpProcess = 0;
53 mapMemoryData.lpDD = (PDD_DIRECTDRAW_GLOBAL)peDdGl;
54
55 peDdGl->ddCallbacks.MapMemory(&mapMemoryData);
56
57 if (!mapMemoryData.ddRVal)
58 {
59 peDdL->isMemoryMapped = 1;
60 peDdL->fpProcess2 = mapMemoryData.fpProcess;
61 }
62 }
63
64 if (pSurface)
65 {
66 InterlockedExchangeAdd((LONG*)&pSurface->pobj.cExclusiveLock, 0xFFFFFFFF);
67 }
68
69 puLockData->ddRVal = DD_OK;
70
71 return DDHAL_DRIVER_HANDLED;
72 }
73
74 /*++
75 * @name DxDdUnlock
76 * @unimplemented
77 *
78 * The function DxDdUnlock releases the lock from specified surface
79 *
80 * @param HANDLE hSurface
81 * Handle to DirectDraw surface
82 *
83 * @param PDD_UNLOCKDATA puUnlockData
84 * Structure with lock details
85 *
86 * @return
87 * Returns DDHAL_DRIVER_HANDLED or DDHAL_DRIVER_NOTHANDLED.
88 *
89 * @remarks.
90 * Stub
91 *--*/
92 DWORD
93 NTAPI
94 DxDdUnlock(HANDLE hSurface,
95 PDD_UNLOCKDATA puUnlockData)
96 {
97 puUnlockData->ddRVal = DD_OK;
98
99 return DDHAL_DRIVER_HANDLED;
100 }