Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygengdientry.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS GDI32 00004 * PURPOSE: GDI DirectX inteface 00005 * FILE: lib/gdi32/misc/gdientry.c 00006 * PROGRAMERS: Alex Ionescu (alex@relsoft.net) 00007 * Magnus Olsen (magnus@greatlord.com) 00008 */ 00009 00010 /* INCLUDES ******************************************************************/ 00011 00012 #include "precomp.h" 00013 00014 /* DATA **********************************************************************/ 00015 00016 HANDLE ghDirectDraw; 00017 ULONG gcDirectDraw; 00018 00019 #define GetDdHandle(Handle) ((HANDLE)Handle ? (HANDLE)Handle : ghDirectDraw) 00020 00021 00022 00023 /* CALLBACKS *****************************************************************/ 00024 00025 /* 00026 * @implemented 00027 * 00028 * DdAddAttachedSurface 00029 */ 00030 DWORD 00031 WINAPI 00032 DdAddAttachedSurface(LPDDHAL_ADDATTACHEDSURFACEDATA Attach) 00033 { 00034 /* Call win32k */ 00035 return NtGdiDdAddAttachedSurface((HANDLE)Attach->lpDDSurface->hDDSurface, 00036 (HANDLE)Attach->lpSurfAttached->hDDSurface, 00037 (PDD_ADDATTACHEDSURFACEDATA)Attach); 00038 } 00039 00040 /* 00041 * @implemented 00042 * 00043 * DdBlt 00044 */ 00045 DWORD 00046 WINAPI 00047 DdBlt(LPDDHAL_BLTDATA Blt) 00048 { 00049 HANDLE Surface = 0; 00050 00051 /* Use the right surface */ 00052 if (Blt->lpDDSrcSurface) 00053 { 00054 Surface = (HANDLE)Blt->lpDDSrcSurface->hDDSurface; 00055 } 00056 00057 /* Call win32k */ 00058 return NtGdiDdBlt((HANDLE)Blt->lpDDDestSurface->hDDSurface, Surface, (PDD_BLTDATA)Blt); 00059 } 00060 00061 /* 00062 * @implemented 00063 * 00064 * DdDestroySurface 00065 */ 00066 DWORD 00067 WINAPI 00068 DdDestroySurface(LPDDHAL_DESTROYSURFACEDATA pDestroySurface) 00069 { 00070 DWORD Return = DDHAL_DRIVER_NOTHANDLED; 00071 BOOL RealDestroy; 00072 00073 if (pDestroySurface->lpDDSurface->hDDSurface) 00074 { 00075 /* Check if we shoudl really destroy it */ 00076 RealDestroy = !(pDestroySurface->lpDDSurface->dwFlags & DDRAWISURF_DRIVERMANAGED) || 00077 !(pDestroySurface->lpDDSurface->dwFlags & DDRAWISURF_INVALID); 00078 00079 /* Call win32k */ 00080 Return = NtGdiDdDestroySurface((HANDLE)pDestroySurface->lpDDSurface->hDDSurface, RealDestroy); 00081 } 00082 00083 return Return; 00084 } 00085 00086 /* 00087 * @implemented 00088 * 00089 * DdFlip 00090 */ 00091 DWORD 00092 WINAPI 00093 DdFlip(LPDDHAL_FLIPDATA Flip) 00094 { 00095 /* Note : 00096 * See http://msdn2.microsoft.com/en-us/library/ms794213.aspx and 00097 * http://msdn2.microsoft.com/en-us/library/ms792675.aspx 00098 */ 00099 00100 HANDLE hSurfaceCurrentLeft = NULL; 00101 HANDLE hSurfaceTargetLeft = NULL; 00102 00103 /* Auto flip off or on */ 00104 if (Flip->dwFlags & DDFLIP_STEREO ) 00105 { 00106 if ( (Flip->lpSurfTargLeft) && 00107 (Flip->lpSurfCurrLeft)) 00108 { 00109 /* Auto flip on */ 00110 hSurfaceTargetLeft = (HANDLE) Flip->lpSurfTargLeft->hDDSurface; 00111 hSurfaceCurrentLeft = (HANDLE) Flip->lpSurfCurrLeft->hDDSurface; 00112 } 00113 } 00114 00115 /* Call win32k */ 00116 return NtGdiDdFlip( (HANDLE) Flip->lpSurfCurr->hDDSurface, 00117 (HANDLE) Flip->lpSurfTarg->hDDSurface, 00118 hSurfaceCurrentLeft, 00119 hSurfaceTargetLeft, 00120 (PDD_FLIPDATA) Flip); 00121 } 00122 00123 /* 00124 * @implemented 00125 * 00126 * DdLock 00127 */ 00128 DWORD 00129 WINAPI 00130 DdLock(LPDDHAL_LOCKDATA Lock) 00131 { 00132 00133 /* Call win32k */ 00134 return NtGdiDdLock((HANDLE)Lock->lpDDSurface->hDDSurface, 00135 (PDD_LOCKDATA)Lock, 00136 (HANDLE)Lock->lpDDSurface->hDC); 00137 } 00138 00139 /* 00140 * @implemented 00141 * 00142 * DdUnlock 00143 */ 00144 DWORD 00145 WINAPI 00146 DdUnlock(LPDDHAL_UNLOCKDATA Unlock) 00147 { 00148 /* Call win32k */ 00149 return NtGdiDdUnlock((HANDLE)Unlock->lpDDSurface->hDDSurface, 00150 (PDD_UNLOCKDATA)Unlock); 00151 } 00152 00153 /* 00154 * @implemented 00155 * 00156 * DdGetBltStatus 00157 */ 00158 DWORD 00159 WINAPI 00160 DdGetBltStatus(LPDDHAL_GETBLTSTATUSDATA GetBltStatus) 00161 { 00162 /* Call win32k */ 00163 return NtGdiDdGetBltStatus((HANDLE)GetBltStatus->lpDDSurface->hDDSurface, 00164 (PDD_GETBLTSTATUSDATA)GetBltStatus); 00165 } 00166 00167 /* 00168 * @implemented 00169 * 00170 * DdGetBltStatus 00171 */ 00172 DWORD 00173 WINAPI 00174 DdGetFlipStatus(LPDDHAL_GETFLIPSTATUSDATA GetFlipStatus) 00175 { 00176 /* Call win32k */ 00177 return NtGdiDdGetFlipStatus((HANDLE)GetFlipStatus->lpDDSurface->hDDSurface, 00178 (PDD_GETFLIPSTATUSDATA)GetFlipStatus); 00179 } 00180 00181 /* 00182 * @implemented 00183 * 00184 * DdUpdateOverlay 00185 */ 00186 DWORD 00187 WINAPI 00188 DdUpdateOverlay(LPDDHAL_UPDATEOVERLAYDATA UpdateOverlay) 00189 { 00190 00191 /* We have to handle this manually here */ 00192 if (UpdateOverlay->dwFlags & DDOVER_KEYDEST) 00193 { 00194 /* Use the override */ 00195 UpdateOverlay->dwFlags &= ~DDOVER_KEYDEST; 00196 UpdateOverlay->dwFlags |= DDOVER_KEYDESTOVERRIDE; 00197 00198 /* Set the overlay */ 00199 UpdateOverlay->overlayFX.dckDestColorkey = 00200 UpdateOverlay->lpDDDestSurface->ddckCKDestOverlay; 00201 } 00202 if (UpdateOverlay->dwFlags & DDOVER_KEYSRC) 00203 { 00204 /* Use the override */ 00205 UpdateOverlay->dwFlags &= ~DDOVER_KEYSRC; 00206 UpdateOverlay->dwFlags |= DDOVER_KEYSRCOVERRIDE; 00207 00208 /* Set the overlay */ 00209 UpdateOverlay->overlayFX.dckSrcColorkey = 00210 UpdateOverlay->lpDDSrcSurface->ddckCKSrcOverlay; 00211 } 00212 00213 /* Call win32k */ 00214 return NtGdiDdUpdateOverlay((HANDLE)UpdateOverlay->lpDDDestSurface->hDDSurface, 00215 (HANDLE)UpdateOverlay->lpDDSrcSurface->hDDSurface, 00216 (PDD_UPDATEOVERLAYDATA)UpdateOverlay); 00217 } 00218 00219 /* 00220 * @implemented 00221 * 00222 * DdSetOverlayPosition 00223 */ 00224 DWORD 00225 WINAPI 00226 DdSetOverlayPosition(LPDDHAL_SETOVERLAYPOSITIONDATA SetOverlayPosition) 00227 { 00228 /* Call win32k */ 00229 return NtGdiDdSetOverlayPosition( (HANDLE)SetOverlayPosition->lpDDSrcSurface->hDDSurface, 00230 (HANDLE)SetOverlayPosition->lpDDDestSurface->hDDSurface, 00231 (PDD_SETOVERLAYPOSITIONDATA) SetOverlayPosition); 00232 } 00233 00234 /* 00235 * @implemented 00236 * 00237 * DdWaitForVerticalBlank 00238 */ 00239 DWORD 00240 WINAPI 00241 DdWaitForVerticalBlank(LPDDHAL_WAITFORVERTICALBLANKDATA WaitForVerticalBlank) 00242 { 00243 /* Call win32k */ 00244 return NtGdiDdWaitForVerticalBlank(GetDdHandle( 00245 WaitForVerticalBlank->lpDD->hDD), 00246 (PDD_WAITFORVERTICALBLANKDATA) 00247 WaitForVerticalBlank); 00248 } 00249 00250 /* 00251 * @implemented 00252 * 00253 * DdCanCreateSurface 00254 */ 00255 DWORD 00256 WINAPI 00257 DdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA CanCreateSurface) 00258 { 00259 /* 00260 * Note : This functions are basic same, in win32k 00261 * NtGdiDdCanCreateD3DBuffer and NtGdiDdCanCreateSurface are mergs 00262 * toghter in win32k at end and retrurn same data, it is still sepreated 00263 * at user mode but in kmode it is not. 00264 */ 00265 00266 /* Call win32k */ 00267 return NtGdiDdCanCreateSurface(GetDdHandle(CanCreateSurface->lpDD->hDD), 00268 (PDD_CANCREATESURFACEDATA)CanCreateSurface); 00269 } 00270 00271 /* 00272 * @implemented 00273 * 00274 * DdCreateSurface 00275 */ 00276 DWORD 00277 WINAPI 00278 DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface) 00279 { 00280 DWORD Return = DDHAL_DRIVER_NOTHANDLED; 00281 ULONG SurfaceCount = pCreateSurface->dwSCnt; 00282 DD_SURFACE_LOCAL DdSurfaceLocal; 00283 DD_SURFACE_MORE DdSurfaceMore; 00284 DD_SURFACE_GLOBAL DdSurfaceGlobal; 00285 00286 HANDLE hPrevSurface, hSurface; 00287 00288 PDD_SURFACE_LOCAL pDdSurfaceLocal = NULL; 00289 PDD_SURFACE_MORE pDdSurfaceMore = NULL; 00290 PDD_SURFACE_GLOBAL pDdSurfaceGlobal = NULL; 00291 00292 PDD_SURFACE_LOCAL ptmpDdSurfaceLocal = NULL; 00293 PDD_SURFACE_MORE ptmpDdSurfaceMore = NULL; 00294 PDD_SURFACE_GLOBAL ptmpDdSurfaceGlobal = NULL; 00295 PHANDLE phSurface = NULL, puhSurface = NULL; 00296 ULONG i; 00297 LPDDSURFACEDESC pSurfaceDesc = NULL; 00298 00299 /* TODO: Optimize speed. Most games/dx apps/programs do not want one surface, they want at least two. 00300 * So we need increase the stack to contain two surfaces instead of one. This will increase 00301 * the speed of the apps when allocating buffers. How to increase the surface stack space: 00302 * we need to create a struct for DD_SURFACE_LOCAL DdSurfaceLocal, DD_SURFACE_MORE DdSurfaceMore 00303 * DD_SURFACE_GLOBAL DdSurfaceGlobal, HANDLE hPrevSurface, hSurface like 00304 * struct { DD_SURFACE_LOCAL DdSurfaceLocal1, DD_SURFACE_LOCAL DdSurfaceLocal2 } 00305 * in a way that it may contain two surfaces, maybe even four. We need to watch what is most common before 00306 * we create the size. Activate this IF when you start doing the optimze and please also 00307 * take reports from users which value they got here. 00308 */ 00309 #if 1 00310 { 00311 char buffer[1024]; 00312 \ 00313 sprintf ( buffer, "Function %s : Optimze max to %d Surface ? (%s:%d)\n", __FUNCTION__, (int)SurfaceCount,__FILE__,__LINE__ ); 00314 OutputDebugStringA(buffer); 00315 } 00316 #endif 00317 00318 /* Check how many surfaces there are */ 00319 if (SurfaceCount != 1) 00320 { 00321 /* We got more than one surface, so we need to allocate memory for them */ 00322 pDdSurfaceLocal = (PDD_SURFACE_LOCAL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_LOCAL) * SurfaceCount )); 00323 pDdSurfaceMore = (PDD_SURFACE_MORE) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_MORE) * SurfaceCount )); 00324 pDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_GLOBAL) * SurfaceCount )); 00325 phSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) * SurfaceCount )); 00326 puhSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) * SurfaceCount )); 00327 00328 /* Check if we successfully allocated all memory we need */ 00329 if ((pDdSurfaceLocal == NULL) || (pDdSurfaceMore == NULL) || (pDdSurfaceGlobal == NULL) || (phSurface == NULL) || (puhSurface == NULL)) 00330 { 00331 pCreateSurface->ddRVal = DDERR_OUTOFMEMORY; 00332 00333 if ( pDdSurfaceLocal != NULL ) 00334 { 00335 HeapFree(GetProcessHeap(), 0, pDdSurfaceLocal); 00336 } 00337 00338 if ( pDdSurfaceMore != NULL ) 00339 { 00340 HeapFree(GetProcessHeap(), 0, pDdSurfaceMore); 00341 } 00342 00343 if ( pDdSurfaceGlobal != NULL ) 00344 { 00345 HeapFree(GetProcessHeap(), 0, pDdSurfaceGlobal); 00346 } 00347 00348 if ( phSurface != NULL ) 00349 { 00350 HeapFree(GetProcessHeap(), 0, phSurface); 00351 } 00352 00353 if ( puhSurface != NULL ) 00354 { 00355 HeapFree(GetProcessHeap(), 0, puhSurface); 00356 } 00357 00358 return DDHAL_DRIVER_HANDLED; 00359 } 00360 } 00361 else 00362 { 00363 /* We'll use what we have on the stack */ 00364 pDdSurfaceLocal = &DdSurfaceLocal; 00365 pDdSurfaceMore = &DdSurfaceMore; 00366 pDdSurfaceGlobal = &DdSurfaceGlobal; 00367 phSurface = &hPrevSurface; 00368 puhSurface = &hSurface; 00369 00370 /* Clear the structures */ 00371 RtlZeroMemory(&DdSurfaceLocal, sizeof(DdSurfaceLocal)); 00372 RtlZeroMemory(&DdSurfaceGlobal, sizeof(DdSurfaceGlobal)); 00373 RtlZeroMemory(&DdSurfaceMore, sizeof(DdSurfaceMore)); 00374 } 00375 00376 /* check if we got a surface or not */ 00377 if (SurfaceCount!=0) 00378 { 00379 /* Loop for each surface */ 00380 ptmpDdSurfaceGlobal = pDdSurfaceGlobal; 00381 ptmpDdSurfaceLocal = pDdSurfaceLocal; 00382 ptmpDdSurfaceMore = pDdSurfaceMore; 00383 pSurfaceDesc = pCreateSurface->lpDDSurfaceDesc; 00384 00385 for (i = 0; i < SurfaceCount; i++) 00386 { 00387 LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i]; 00388 LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl; 00389 00390 phSurface[i] = (HANDLE)lcl->hDDSurface; 00391 ptmpDdSurfaceLocal->ddsCaps.dwCaps = lcl->ddsCaps.dwCaps; 00392 00393 ptmpDdSurfaceLocal->dwFlags = (ptmpDdSurfaceLocal->dwFlags & 00394 (0xB0000000 | DDRAWISURF_INMASTERSPRITELIST | 00395 DDRAWISURF_HELCB | DDRAWISURF_FRONTBUFFER | 00396 DDRAWISURF_BACKBUFFER | DDRAWISURF_INVALID | 00397 DDRAWISURF_DCIBUSY | DDRAWISURF_DCILOCK)) | 00398 (lcl->dwFlags & DDRAWISURF_DRIVERMANAGED); 00399 00400 ptmpDdSurfaceGlobal->wWidth = gpl->wWidth; 00401 ptmpDdSurfaceGlobal->wHeight = gpl->wHeight; 00402 ptmpDdSurfaceGlobal->lPitch = gpl->lPitch; 00403 ptmpDdSurfaceGlobal->fpVidMem = gpl->fpVidMem; 00404 ptmpDdSurfaceGlobal->dwBlockSizeX = gpl->dwBlockSizeX; 00405 ptmpDdSurfaceGlobal->dwBlockSizeY = gpl->dwBlockSizeY; 00406 00407 if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT) 00408 { 00409 RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface , 00410 &gpl->ddpfSurface, 00411 sizeof(DDPIXELFORMAT)); 00412 00413 ptmpDdSurfaceGlobal->ddpfSurface.dwSize = sizeof(DDPIXELFORMAT); 00414 } 00415 else 00416 { 00417 RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface , 00418 &gpl->lpDD->vmiData.ddpfDisplay, 00419 sizeof(DDPIXELFORMAT)); 00420 } 00421 00422 /* Note if lcl->lpSurfMore is NULL zero out 00423 * ptmpDdSurfaceMore->ddsCapsEx.dwCaps2, 00424 * dwCaps3, dwCaps4, ptmpDdSurfaceMore->dwSurfaceHandle 00425 */ 00426 if (lcl->lpSurfMore) 00427 { 00428 ptmpDdSurfaceMore->ddsCapsEx.dwCaps2 = lcl->lpSurfMore->ddsCapsEx.dwCaps2; 00429 ptmpDdSurfaceMore->ddsCapsEx.dwCaps3 = lcl->lpSurfMore->ddsCapsEx.dwCaps3; 00430 ptmpDdSurfaceMore->ddsCapsEx.dwCaps4 = lcl->lpSurfMore->ddsCapsEx.dwCaps4; 00431 ptmpDdSurfaceMore->dwSurfaceHandle = lcl->lpSurfMore->dwSurfaceHandle; 00432 } 00433 00434 00435 /* count to next SurfaceCount */ 00436 ptmpDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceGlobal)) + sizeof(DD_SURFACE_GLOBAL)); 00437 ptmpDdSurfaceLocal = (PDD_SURFACE_LOCAL) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceLocal)) + sizeof(DD_SURFACE_LOCAL)); 00438 ptmpDdSurfaceMore = (PDD_SURFACE_MORE) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceMore)) + sizeof(DD_SURFACE_MORE)); 00439 } 00440 } 00441 00442 /* Call win32k now */ 00443 pCreateSurface->ddRVal = DDERR_GENERIC; 00444 00445 Return = NtGdiDdCreateSurface(GetDdHandle(pCreateSurface->lpDD->hDD), 00446 (HANDLE *)phSurface, 00447 pSurfaceDesc, 00448 pDdSurfaceGlobal, 00449 pDdSurfaceLocal, 00450 pDdSurfaceMore, 00451 (PDD_CREATESURFACEDATA)pCreateSurface, 00452 puhSurface); 00453 00454 if (SurfaceCount == 0) 00455 { 00456 pCreateSurface->ddRVal = DDERR_GENERIC; 00457 } 00458 else 00459 { 00460 ptmpDdSurfaceMore = pDdSurfaceMore; 00461 ptmpDdSurfaceGlobal = pDdSurfaceGlobal; 00462 ptmpDdSurfaceLocal = pDdSurfaceLocal; 00463 00464 for (i=0; i<SurfaceCount; i++) 00465 { 00466 LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i]; 00467 LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl; 00468 00469 gpl->lPitch = ptmpDdSurfaceGlobal->lPitch; 00470 gpl->fpVidMem = ptmpDdSurfaceGlobal->fpVidMem; 00471 gpl->dwBlockSizeX = ptmpDdSurfaceGlobal->dwBlockSizeX; 00472 gpl->dwBlockSizeY = ptmpDdSurfaceGlobal->dwBlockSizeY; 00473 00474 if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT) 00475 { 00476 RtlCopyMemory( &gpl->ddpfSurface, &ptmpDdSurfaceGlobal->ddpfSurface , sizeof(DDPIXELFORMAT)); 00477 } 00478 00479 if (pCreateSurface->ddRVal != DD_OK) 00480 { 00481 gpl->fpVidMem = 0; 00482 if (lcl->hDDSurface) 00483 { 00484 NtGdiDdDeleteSurfaceObject( (HANDLE)lcl->hDDSurface); 00485 } 00486 lcl->hDDSurface = 0; 00487 } 00488 else 00489 { 00490 00491 lcl->hDDSurface = (ULONG_PTR) puhSurface[i]; 00492 } 00493 00494 lcl->ddsCaps.dwCaps = ptmpDdSurfaceLocal->ddsCaps.dwCaps; 00495 if (lcl->lpSurfMore) 00496 { 00497 lcl->lpSurfMore->ddsCapsEx.dwCaps2 = ptmpDdSurfaceMore->ddsCapsEx.dwCaps2; 00498 lcl->lpSurfMore->ddsCapsEx.dwCaps3 = ptmpDdSurfaceMore->ddsCapsEx.dwCaps3; 00499 lcl->lpSurfMore->ddsCapsEx.dwCaps4 = ptmpDdSurfaceMore->ddsCapsEx.dwCaps4; 00500 } 00501 00502 /* count to next SurfaceCount */ 00503 ptmpDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceGlobal)) + sizeof(DD_SURFACE_GLOBAL)); 00504 ptmpDdSurfaceLocal = (PDD_SURFACE_LOCAL) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceLocal)) + sizeof(DD_SURFACE_LOCAL)); 00505 ptmpDdSurfaceMore = (PDD_SURFACE_MORE) (((PBYTE) ((ULONG_PTR) ptmpDdSurfaceMore)) + sizeof(DD_SURFACE_MORE)); 00506 } 00507 } 00508 00509 /* Check if we have to free all our local allocations */ 00510 if (SurfaceCount > 1) 00511 { 00512 if ( pDdSurfaceLocal != NULL ) 00513 { 00514 HeapFree(GetProcessHeap(), 0, pDdSurfaceLocal); 00515 } 00516 00517 if ( pDdSurfaceMore != NULL ) 00518 { 00519 HeapFree(GetProcessHeap(), 0, pDdSurfaceMore); 00520 } 00521 00522 if ( pDdSurfaceGlobal != NULL ) 00523 { 00524 HeapFree(GetProcessHeap(), 0, pDdSurfaceGlobal); 00525 } 00526 00527 if ( phSurface != NULL ) 00528 { 00529 HeapFree(GetProcessHeap(), 0, phSurface); 00530 } 00531 00532 if ( puhSurface != NULL ) 00533 { 00534 HeapFree(GetProcessHeap(), 0, puhSurface); 00535 } 00536 } 00537 00538 /* Return */ 00539 return Return; 00540 } 00541 00542 /* 00543 * @implemented 00544 * 00545 * DdSetColorKey 00546 */ 00547 DWORD 00548 WINAPI 00549 DdSetColorKey(LPDDHAL_SETCOLORKEYDATA pSetColorKey) 00550 { 00551 /* Call win32k */ 00552 return NtGdiDdSetColorKey((HANDLE)pSetColorKey->lpDDSurface->hDDSurface, 00553 (PDD_SETCOLORKEYDATA)pSetColorKey); 00554 } 00555 00556 /* 00557 * @implemented 00558 * 00559 * DdGetScanLine 00560 */ 00561 DWORD 00562 WINAPI 00563 DdGetScanLine(LPDDHAL_GETSCANLINEDATA pGetScanLine) 00564 { 00565 /* Call win32k */ 00566 return NtGdiDdGetScanLine(GetDdHandle(pGetScanLine->lpDD->hDD), 00567 (PDD_GETSCANLINEDATA)pGetScanLine); 00568 } 00569 00570 00571 /* 00572 * @implemented 00573 * 00574 * DvpCreateVideoPort 00575 */ 00576 BOOL 00577 WINAPI 00578 DvpCreateVideoPort(LPDDHAL_CREATEVPORTDATA pDvdCreatePort) 00579 { 00580 pDvdCreatePort->lpVideoPort->hDDVideoPort = 00581 NtGdiDvpCreateVideoPort(GetDdHandle(pDvdCreatePort->lpDD->lpGbl->hDD), 00582 (PDD_CREATEVPORTDATA) pDvdCreatePort); 00583 00584 return TRUE; 00585 } 00586 00587 /* 00588 * @implemented 00589 * 00590 * DvpCreateVideoPort 00591 */ 00592 DWORD 00593 WINAPI 00594 DvpDestroyVideoPort(LPDDHAL_DESTROYVPORTDATA pDvdDestoryPort) 00595 { 00596 return NtGdiDvpDestroyVideoPort(pDvdDestoryPort->lpVideoPort->hDDVideoPort, (PDD_DESTROYVPORTDATA)pDvdDestoryPort); 00597 } 00598 00599 /* 00600 * @implemented 00601 * 00602 * DvpCreateVideoPort 00603 */ 00604 DWORD 00605 WINAPI 00606 DvpFlipVideoPort(LPDDHAL_FLIPVPORTDATA pDvdPortFlip) 00607 { 00608 return NtGdiDvpFlipVideoPort(pDvdPortFlip->lpVideoPort->hDDVideoPort, 00609 (HANDLE)pDvdPortFlip->lpSurfCurr->hDDSurface, 00610 (HANDLE)pDvdPortFlip->lpSurfTarg->hDDSurface, 00611 (PDD_FLIPVPORTDATA) pDvdPortFlip); 00612 } 00613 00614 /* 00615 * @implemented 00616 * 00617 * DvpGetVideoPortBandwidth 00618 */ 00619 DWORD 00620 WINAPI 00621 DvpGetVideoPortBandwidth(LPDDHAL_GETVPORTBANDWIDTHDATA pDvdPortBandWidth) 00622 { 00623 return NtGdiDvpGetVideoPortBandwidth(pDvdPortBandWidth->lpVideoPort->hDDVideoPort, (PDD_GETVPORTBANDWIDTHDATA)pDvdPortBandWidth); 00624 } 00625 00626 /* 00627 * @implemented 00628 * 00629 * DvpColorControl 00630 */ 00631 DWORD 00632 WINAPI 00633 DvpColorControl(LPDDHAL_VPORTCOLORDATA pDvdPortColorControl) 00634 { 00635 return NtGdiDvpColorControl(pDvdPortColorControl->lpVideoPort->hDDVideoPort, (PDD_VPORTCOLORDATA) pDvdPortColorControl); 00636 } 00637 00638 /* 00639 * @implemented 00640 * 00641 * DvpGetVideoSignalStatus 00642 */ 00643 DWORD 00644 WINAPI 00645 DvpGetVideoSignalStatus(LPDDHAL_GETVPORTSIGNALDATA pDvdPortVideoSignalStatus) 00646 { 00647 return NtGdiDvpGetVideoSignalStatus(pDvdPortVideoSignalStatus->lpVideoPort->hDDVideoPort, (PDD_GETVPORTSIGNALDATA) pDvdPortVideoSignalStatus); 00648 } 00649 00650 /* 00651 * @implemented 00652 * 00653 * DvpGetVideoPortFlipStatus 00654 */ 00655 DWORD 00656 WINAPI 00657 DvpGetVideoPortFlipStatus(LPDDHAL_GETVPORTFLIPSTATUSDATA pDvdPortVideoPortFlipStatus) 00658 { 00659 return NtGdiDvpGetVideoPortFlipStatus(GetDdHandle(pDvdPortVideoPortFlipStatus->lpDD->lpGbl->hDD), (PDD_GETVPORTFLIPSTATUSDATA) pDvdPortVideoPortFlipStatus); 00660 00661 } 00662 00663 /* 00664 * @implemented 00665 * 00666 * DvpCanCreateVideoPort 00667 */ 00668 DWORD 00669 WINAPI 00670 DvpCanCreateVideoPort(LPDDHAL_CANCREATEVPORTDATA pDvdCanCreateVideoPort) 00671 { 00672 return NtGdiDvpCanCreateVideoPort(GetDdHandle(pDvdCanCreateVideoPort->lpDD->lpGbl->hDD), (PDD_CANCREATEVPORTDATA) pDvdCanCreateVideoPort); 00673 } 00674 /* 00675 * @implemented 00676 * 00677 * DvpWaitForVideoPortSync 00678 */ 00679 DWORD 00680 WINAPI 00681 DvpWaitForVideoPortSync(LPDDHAL_WAITFORVPORTSYNCDATA pDvdWaitForVideoPortSync) 00682 { 00683 return NtGdiDvpWaitForVideoPortSync(pDvdWaitForVideoPortSync->lpVideoPort->hDDVideoPort, (PDD_WAITFORVPORTSYNCDATA) pDvdWaitForVideoPortSync); 00684 } 00685 00686 /* 00687 * @implemented 00688 * 00689 * DvpUpdateVideoPort 00690 */ 00691 DWORD 00692 WINAPI 00693 DvpUpdateVideoPort(LPDDHAL_UPDATEVPORTDATA pDvdUpdateVideoPort) 00694 { 00695 /* 00696 * Windows XP limit to max 10 handles of videoport surface and Vbi 00697 * ReactOS doing same to keep compatible, if it is more that 10 00698 * videoport surface or vbi the stack will be curpted in windows xp 00699 * ReactOS safe guard againts that 00700 * 00701 */ 00702 00703 HANDLE phSurfaceVideo[10]; 00704 HANDLE phSurfaceVbi[10]; 00705 00706 if (pDvdUpdateVideoPort->dwFlags != DDRAWI_VPORTSTOP) 00707 { 00708 DWORD dwNumAutoflip; 00709 DWORD dwNumVBIAutoflip; 00710 00711 /* Take copy of lplpDDSurface for the handle value will be modify in dxg */ 00712 dwNumAutoflip = pDvdUpdateVideoPort->dwNumAutoflip; 00713 if ((dwNumAutoflip == 0) && 00714 (pDvdUpdateVideoPort->lplpDDSurface == 0)) 00715 { 00716 dwNumAutoflip++; 00717 } 00718 00719 if (dwNumAutoflip != 0) 00720 { 00721 if (dwNumAutoflip>10) 00722 { 00723 dwNumAutoflip = 10; 00724 } 00725 memcpy(phSurfaceVideo,pDvdUpdateVideoPort->lplpDDSurface,dwNumAutoflip*sizeof(HANDLE)); 00726 } 00727 00728 /* Take copy of lplpDDVBISurface for the handle value will be modify in dxg */ 00729 dwNumVBIAutoflip = pDvdUpdateVideoPort->dwNumVBIAutoflip; 00730 if ( (dwNumVBIAutoflip == 0) && 00731 (pDvdUpdateVideoPort->lplpDDVBISurface == 0) ) 00732 { 00733 dwNumVBIAutoflip++; 00734 } 00735 00736 if (dwNumVBIAutoflip != 0) 00737 { 00738 if (dwNumVBIAutoflip>10) 00739 { 00740 dwNumVBIAutoflip = 10; 00741 } 00742 memcpy(phSurfaceVbi,pDvdUpdateVideoPort->lplpDDVBISurface,dwNumVBIAutoflip*sizeof(HANDLE)); 00743 } 00744 } 00745 00746 /* Call Win32k */ 00747 return NtGdiDvpUpdateVideoPort(pDvdUpdateVideoPort->lpVideoPort->hDDVideoPort,phSurfaceVideo,phSurfaceVbi, (PDD_UPDATEVPORTDATA)pDvdUpdateVideoPort); 00748 } 00749 00750 /* 00751 * @implemented 00752 * 00753 * DvpWaitForVideoPortSync 00754 */ 00755 DWORD 00756 WINAPI 00757 DvpGetVideoPortField(LPDDHAL_FLIPVPORTDATA pDvdGetVideoPortField) 00758 { 00759 return NtGdiDvpGetVideoPortField(pDvdGetVideoPortField->lpVideoPort->hDDVideoPort, (PDD_GETVPORTFIELDDATA)pDvdGetVideoPortField); 00760 } 00761 00762 /* 00763 * @implemented 00764 * 00765 * DvpWaitForVideoPortSync 00766 */ 00767 DWORD 00768 WINAPI 00769 DvpGetVideoPortInputFormats(LPDDHAL_GETVPORTINPUTFORMATDATA pDvdGetVideoPortInputFormat) 00770 { 00771 return NtGdiDvpGetVideoPortInputFormats(pDvdGetVideoPortInputFormat->lpVideoPort->hDDVideoPort, (PDD_GETVPORTINPUTFORMATDATA) pDvdGetVideoPortInputFormat); 00772 } 00773 00774 /* 00775 * @implemented 00776 * 00777 * DvpGetVideoPortLine 00778 */ 00779 DWORD 00780 WINAPI 00781 DvpGetVideoPortLine(LPDDHAL_GETVPORTLINEDATA pDvdGetVideoPortLine) 00782 { 00783 return NtGdiDvpGetVideoPortLine(pDvdGetVideoPortLine->lpVideoPort->hDDVideoPort, (PDD_GETVPORTLINEDATA)pDvdGetVideoPortLine); 00784 } 00785 00786 /* 00787 * @implemented 00788 * 00789 * DvpGetVideoPortOutputFormats 00790 */ 00791 DWORD 00792 WINAPI 00793 DvpGetVideoPortOutputFormats(LPDDHAL_GETVPORTLINEDATA pDvdGetVideoPortOutputFormat) 00794 { 00795 return NtGdiDvpGetVideoPortLine(pDvdGetVideoPortOutputFormat->lpVideoPort->hDDVideoPort, (PDD_GETVPORTLINEDATA)pDvdGetVideoPortOutputFormat); 00796 } 00797 00798 /* 00799 * @implemented 00800 * 00801 * DvpGetVideoPortConnectInfo 00802 */ 00803 DWORD 00804 WINAPI 00805 DvpGetVideoPortConnectInfo(LPDDHAL_GETVPORTCONNECTDATA pDvdGetVideoPortInfo) 00806 { 00807 return NtGdiDvpGetVideoPortConnectInfo( GetDdHandle( pDvdGetVideoPortInfo->lpDD->lpGbl->hDD) , (PDD_GETVPORTCONNECTDATA) pDvdGetVideoPortInfo); 00808 } 00809 00810 /* 00811 * @implemented 00812 * 00813 * DdGetAvailDriverMemory 00814 */ 00815 DWORD 00816 WINAPI 00817 DdGetAvailDriverMemory(LPDDHAL_GETAVAILDRIVERMEMORYDATA pDdGetAvailDriverMemory) 00818 { 00819 return NtGdiDdGetAvailDriverMemory(GetDdHandle( pDdGetAvailDriverMemory->lpDD->hDD), (PDD_GETAVAILDRIVERMEMORYDATA) pDdGetAvailDriverMemory); 00820 } 00821 00822 /* 00823 * @implemented 00824 * 00825 * DdAlphaBlt 00826 */ 00827 DWORD 00828 WINAPI 00829 DdAlphaBlt(LPDDHAL_BLTDATA pDdAlphaBlt) 00830 { 00831 HANDLE hDDSrcSurface = 0; 00832 00833 if (pDdAlphaBlt->lpDDSrcSurface != 0) 00834 { 00835 hDDSrcSurface = (HANDLE) pDdAlphaBlt->lpDDSrcSurface->hDDSurface; 00836 } 00837 00838 return NtGdiDdAlphaBlt((HANDLE)pDdAlphaBlt->lpDDDestSurface->hDDSurface, hDDSrcSurface, (PDD_BLTDATA)&pDdAlphaBlt); 00839 } 00840 00841 /* 00842 * @implemented 00843 * 00844 * DdCreateSurfaceEx 00845 */ 00846 DWORD 00847 WINAPI 00848 DdCreateSurfaceEx(LPDDHAL_CREATESURFACEEXDATA pDdCreateSurfaceEx) 00849 { 00850 pDdCreateSurfaceEx->ddRVal = NtGdiDdCreateSurfaceEx( GetDdHandle(pDdCreateSurfaceEx->lpDDLcl->lpGbl->hDD), 00851 (HANDLE)pDdCreateSurfaceEx->lpDDSLcl->hDDSurface, 00852 pDdCreateSurfaceEx->lpDDSLcl->lpSurfMore->dwSurfaceHandle); 00853 return TRUE; 00854 } 00855 00856 /* 00857 * @implemented 00858 * 00859 * DdColorControl 00860 */ 00861 DWORD 00862 WINAPI 00863 DdColorControl(LPDDHAL_COLORCONTROLDATA pDdColorControl) 00864 { 00865 return NtGdiDdColorControl( (HANDLE) pDdColorControl->lpDDSurface->hDDSurface, (PDD_COLORCONTROLDATA) &pDdColorControl); 00866 } 00867 00868 /* 00869 * @implemented 00870 * 00871 * DdSetExclusiveMode 00872 */ 00873 DWORD 00874 WINAPI 00875 DdSetExclusiveMode(LPDDHAL_SETEXCLUSIVEMODEDATA pDdSetExclusiveMode) 00876 { 00877 return NtGdiDdSetExclusiveMode( GetDdHandle(pDdSetExclusiveMode->lpDD->hDD), (PDD_SETEXCLUSIVEMODEDATA) &pDdSetExclusiveMode); 00878 } 00879 00880 /* 00881 * @implemented 00882 * 00883 * DdFlipToGDISurface 00884 */ 00885 DWORD 00886 WINAPI 00887 DdFlipToGDISurface(LPDDHAL_FLIPTOGDISURFACEDATA pDdFlipToGDISurface) 00888 { 00889 return NtGdiDdFlipToGDISurface( GetDdHandle(pDdFlipToGDISurface->lpDD->hDD), (PDD_FLIPTOGDISURFACEDATA) &pDdFlipToGDISurface); 00890 } 00891 00892 /* TODO */ 00893 DWORD 00894 WINAPI 00895 DdGetDriverInfo(LPDDHAL_GETDRIVERINFODATA pData) 00896 { 00897 DDHAL_GETDRIVERINFODATA pDrvInfoData; 00898 DWORD retValue = DDHAL_DRIVER_NOTHANDLED; 00899 HANDLE hDD; 00900 00901 /* FIXME add SEH around this functions */ 00902 00903 RtlZeroMemory(&pDrvInfoData, sizeof (DDHAL_GETDRIVERINFODATA)); 00904 RtlCopyMemory(&pDrvInfoData.guidInfo, &pData->guidInfo, sizeof(GUID)); 00905 00906 hDD = GetDdHandle(pData->dwContext); 00907 00908 pDrvInfoData.dwSize = sizeof (DDHAL_GETDRIVERINFODATA); 00909 pDrvInfoData.ddRVal = DDERR_GENERIC; 00910 pDrvInfoData.dwContext = (ULONG_PTR)hDD; 00911 00912 00913 /* Videoport Callbacks check and setup for DirectX/ ReactX */ 00914 if (IsEqualGUID(&pData->guidInfo, &GUID_VideoPortCallbacks)) 00915 { 00916 DDHAL_DDVIDEOPORTCALLBACKS pDvdPort; 00917 DDHAL_DDVIDEOPORTCALLBACKS* pUserDvdPort = (DDHAL_DDVIDEOPORTCALLBACKS *)pData->lpvData; 00918 00919 /* Clear internal out buffer and set it up*/ 00920 RtlZeroMemory(&pDvdPort, DDVIDEOPORTCALLBACKSSIZE); 00921 pDvdPort.dwSize = DDVIDEOPORTCALLBACKSSIZE; 00922 00923 /* set up internal buffer */ 00924 pDrvInfoData.lpvData = (PVOID)&pDvdPort; 00925 pDrvInfoData.dwExpectedSize = DDVIDEOPORTCALLBACKSSIZE ; 00926 00927 /* Call win32k */ 00928 retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData); 00929 00930 /* Setup user out buffer and convert kmode callbacks to user mode */ 00931 pUserDvdPort->dwSize = DDVIDEOPORTCALLBACKSSIZE; 00932 pUserDvdPort->dwFlags = pDrvInfoData.dwFlags = 0; 00933 00934 pUserDvdPort->dwFlags = (pDrvInfoData.dwFlags & ~(DDHAL_VPORT32_CREATEVIDEOPORT | DDHAL_VPORT32_FLIP | 00935 DDHAL_VPORT32_DESTROY | DDHAL_VPORT32_UPDATE | DDHAL_VPORT32_WAITFORSYNC)) | 00936 (DDHAL_VPORT32_CREATEVIDEOPORT | DDHAL_VPORT32_FLIP | 00937 DDHAL_VPORT32_DESTROY | DDHAL_VPORT32_UPDATE); 00938 00939 pData->dwActualSize = DDVIDEOPORTCALLBACKSSIZE; 00940 pUserDvdPort->CreateVideoPort = (LPDDHALVPORTCB_CREATEVIDEOPORT) DvpCreateVideoPort; 00941 pUserDvdPort->FlipVideoPort = (LPDDHALVPORTCB_FLIP) DvpFlipVideoPort; 00942 pUserDvdPort->DestroyVideoPort = (LPDDHALVPORTCB_DESTROYVPORT) DvpDestroyVideoPort; 00943 pUserDvdPort->UpdateVideoPort = (LPDDHALVPORTCB_UPDATE) DvpUpdateVideoPort; 00944 00945 if (pDvdPort.CanCreateVideoPort) 00946 { 00947 pUserDvdPort->CanCreateVideoPort = (LPDDHALVPORTCB_CANCREATEVIDEOPORT) DvpCanCreateVideoPort; 00948 } 00949 00950 if (pDvdPort.GetVideoPortBandwidth) 00951 { 00952 pUserDvdPort->GetVideoPortBandwidth = (LPDDHALVPORTCB_GETBANDWIDTH) DvpGetVideoPortBandwidth; 00953 } 00954 00955 if (pDvdPort.GetVideoPortInputFormats) 00956 { 00957 pUserDvdPort->GetVideoPortInputFormats = (LPDDHALVPORTCB_GETINPUTFORMATS) DvpGetVideoPortInputFormats; 00958 } 00959 00960 if (pDvdPort.GetVideoPortOutputFormats) 00961 { 00962 pUserDvdPort->GetVideoPortOutputFormats = (LPDDHALVPORTCB_GETOUTPUTFORMATS) DvpGetVideoPortOutputFormats; 00963 } 00964 00965 if (pDvdPort.GetVideoPortField) 00966 { 00967 pUserDvdPort->GetVideoPortField = (LPDDHALVPORTCB_GETFIELD) DvpGetVideoPortField; 00968 } 00969 00970 if (pDvdPort.GetVideoPortLine) 00971 { 00972 pUserDvdPort->GetVideoPortLine = (LPDDHALVPORTCB_GETLINE) DvpGetVideoPortLine; 00973 } 00974 00975 if (pDvdPort.GetVideoPortConnectInfo) 00976 { 00977 pUserDvdPort->GetVideoPortConnectInfo = (LPDDHALVPORTCB_GETVPORTCONNECT) DvpGetVideoPortConnectInfo; 00978 } 00979 00980 if (pDvdPort.GetVideoPortFlipStatus) 00981 { 00982 pUserDvdPort->GetVideoPortFlipStatus = (LPDDHALVPORTCB_GETFLIPSTATUS) DvpGetVideoPortFlipStatus; 00983 } 00984 00985 if (pDvdPort.WaitForVideoPortSync) 00986 { 00987 pUserDvdPort->WaitForVideoPortSync = (LPDDHALVPORTCB_WAITFORSYNC) DvpWaitForVideoPortSync; 00988 } 00989 00990 if (pDvdPort.GetVideoSignalStatus) 00991 { 00992 pUserDvdPort->GetVideoSignalStatus = (LPDDHALVPORTCB_GETSIGNALSTATUS) DvpGetVideoSignalStatus; 00993 } 00994 00995 if (pDvdPort.ColorControl) 00996 { 00997 pUserDvdPort->ColorControl = (LPDDHALVPORTCB_COLORCONTROL) DvpColorControl; 00998 } 00999 01000 /* Windows XP never repot back the true return value, 01001 * it only report back if we have a driver or not 01002 * ReactOS keep this behoir to be compatible with 01003 * Windows XP 01004 */ 01005 pData->ddRVal = retValue; 01006 } 01007 01008 /* Color Control Callbacks check and setup for DirectX/ ReactX */ 01009 if (IsEqualGUID(&pData->guidInfo, &GUID_ColorControlCallbacks)) 01010 { 01011 DDHAL_DDCOLORCONTROLCALLBACKS pColorControl; 01012 DDHAL_DDCOLORCONTROLCALLBACKS* pUserColorControl = (DDHAL_DDCOLORCONTROLCALLBACKS *)pData->lpvData; 01013 01014 /* Clear internal out buffer and set it up*/ 01015 RtlZeroMemory(&pColorControl, DDCOLORCONTROLCALLBACKSSIZE); 01016 pColorControl.dwSize = DDCOLORCONTROLCALLBACKSSIZE; 01017 01018 /* set up internal buffer */ 01019 pDrvInfoData.lpvData = (PVOID)&pColorControl; 01020 pDrvInfoData.dwExpectedSize = DDCOLORCONTROLCALLBACKSSIZE ; 01021 01022 /* Call win32k */ 01023 retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData); 01024 01025 pData->dwActualSize = DDCOLORCONTROLCALLBACKSSIZE; 01026 pData->dwFlags = pDrvInfoData.dwFlags; 01027 01028 pUserColorControl->dwSize = DDCOLORCONTROLCALLBACKSSIZE; 01029 pUserColorControl->dwFlags = pUserColorControl->dwFlags; 01030 01031 if (pColorControl.ColorControl != NULL) 01032 { 01033 pUserColorControl->ColorControl = (LPDDHALCOLORCB_COLORCONTROL) DdColorControl; 01034 } 01035 01036 /* Windows XP never repot back the true return value, 01037 * it only report back if we have a driver or not 01038 * ReactOS keep this behoir to be compatible with 01039 * Windows XP 01040 */ 01041 pData->ddRVal = retValue; 01042 } 01043 01044 /* Misc Callbacks check and setup for DirectX/ ReactX */ 01045 else if (IsEqualGUID(&pData->guidInfo, &GUID_MiscellaneousCallbacks)) 01046 { 01047 DDHAL_DDMISCELLANEOUSCALLBACKS pMisc; 01048 DDHAL_DDMISCELLANEOUSCALLBACKS* pUserMisc = (DDHAL_DDMISCELLANEOUSCALLBACKS *)pData->lpvData; 01049 01050 /* Clear internal out buffer and set it up*/ 01051 RtlZeroMemory(&pMisc, DDMISCELLANEOUSCALLBACKSSIZE); 01052 pMisc.dwSize = DDMISCELLANEOUSCALLBACKSSIZE; 01053 01054 /* set up internal buffer */ 01055 pDrvInfoData.lpvData = (PVOID)&pMisc; 01056 pDrvInfoData.dwExpectedSize = DDMISCELLANEOUSCALLBACKSSIZE ; 01057 01058 /* Call win32k */ 01059 retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData); 01060 01061 pData->dwActualSize = DDMISCELLANEOUSCALLBACKSSIZE; 01062 01063 /* Only one callbacks are supported */ 01064 pUserMisc->dwFlags = pMisc.dwFlags & DDHAL_MISCCB32_GETAVAILDRIVERMEMORY; 01065 pUserMisc->GetAvailDriverMemory = (LPDDHAL_GETAVAILDRIVERMEMORY) DdGetAvailDriverMemory; 01066 01067 /* This callbacks are only for win9x and theirfor it is not longer use in NT or ReactOS 01068 * pUserMisc->UpdateNonLocalHeap; 01069 * pUserMisc->GetHeapAlignment; 01070 * pUserMisc->GetSysmemBltStatus; */ 01071 01072 /* Windows XP never repot back the true return value, 01073 * it only report back if we have a driver or not 01074 * ReactOS keep this behoir to be compatible with 01075 * Windows XP 01076 */ 01077 pData->ddRVal = retValue; 01078 } 01079 01080 /* Misc 2 Callbacks check and setup for DirectX/ ReactX */ 01081 else if (IsEqualGUID(&pData->guidInfo, &GUID_Miscellaneous2Callbacks)) 01082 { 01083 DDHAL_DDMISCELLANEOUS2CALLBACKS pMisc; 01084 DDHAL_DDMISCELLANEOUS2CALLBACKS* pUserMisc = (DDHAL_DDMISCELLANEOUS2CALLBACKS *)pData->lpvData; 01085 01086 /* Clear internal out buffer and set it up*/ 01087 RtlZeroMemory(&pMisc, DDMISCELLANEOUS2CALLBACKSSIZE); 01088 pMisc.dwSize = DDMISCELLANEOUS2CALLBACKSSIZE; 01089 01090 /* set up internal buffer */ 01091 pDrvInfoData.lpvData = (PVOID)&pMisc; 01092 pDrvInfoData.dwExpectedSize = DDMISCELLANEOUS2CALLBACKSSIZE ; 01093 01094 /* Call win32k */ 01095 retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData); 01096 01097 pData->dwActualSize = DDMISCELLANEOUS2CALLBACKSSIZE; 01098 01099 pUserMisc->dwFlags = pMisc.dwFlags; 01100 01101 /* This functions are not documneted in MSDN for this struct, here is directx/reactx alpha blend */ 01102 if ( pMisc.Reserved ) 01103 { 01104 pUserMisc->Reserved = (LPVOID) DdAlphaBlt; 01105 } 01106 01107 if ( pMisc.CreateSurfaceEx ) 01108 { 01109 pUserMisc->CreateSurfaceEx = (LPDDHAL_CREATESURFACEEX) DdCreateSurfaceEx; 01110 } 01111 01112 if ( pMisc.GetDriverState ) 01113 { 01114 pUserMisc->GetDriverState = (LPDDHAL_GETDRIVERSTATE) NtGdiDdGetDriverState; 01115 } 01116 01117 /* NOTE : pUserMisc->DestroyDDLocal is outdated and are not beign tuch */ 01118 01119 /* Windows XP never repot back the true return value, 01120 * it only report back if we have a driver or not 01121 * ReactOS keep this behoir to be compatible with 01122 * Windows XP 01123 */ 01124 pData->ddRVal = retValue; 01125 } 01126 01127 /* NT Callbacks check and setup for DirectX/ ReactX */ 01128 else if (IsEqualGUID(&pData->guidInfo, &GUID_NTCallbacks)) 01129 { 01130 /* MS does not have DHAL_* version of this callbacks 01131 * so we are force using PDD_* callbacks here 01132 */ 01133 DD_NTCALLBACKS pNtKernel; 01134 PDD_NTCALLBACKS pUserNtKernel = (PDD_NTCALLBACKS)pData->lpvData; 01135 01136 /* Clear internal out buffer and set it up*/ 01137 RtlZeroMemory(&pNtKernel, sizeof(DD_NTCALLBACKS)); 01138 pNtKernel.dwSize = sizeof(DD_NTCALLBACKS); 01139 01140 /* set up internal buffer */ 01141 pDrvInfoData.lpvData = (PVOID)&pNtKernel; 01142 pDrvInfoData.dwExpectedSize = sizeof(DD_NTCALLBACKS) ; 01143 01144 /* Call win32k */ 01145 retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData); 01146 01147 pData->dwActualSize = sizeof(DD_NTCALLBACKS); 01148 01149 pUserNtKernel->dwSize = sizeof(DD_NTCALLBACKS); 01150 pUserNtKernel->dwFlags = pNtKernel.dwFlags; 01151 pUserNtKernel->FreeDriverMemory = 0; 01152 01153 if (pNtKernel.SetExclusiveMode) 01154 { 01155 pUserNtKernel->SetExclusiveMode = (PDD_SETEXCLUSIVEMODE) DdSetExclusiveMode; 01156 } 01157 01158 if (pNtKernel.FlipToGDISurface) 01159 { 01160 pUserNtKernel->FlipToGDISurface = (PDD_FLIPTOGDISURFACE) DdFlipToGDISurface; 01161 } 01162 01163 /* Windows XP never repot back the true return value, 01164 * it only report back if we have a driver or not 01165 * ReactOS keep this behoir to be compatible with 01166 * Windows XP 01167 */ 01168 pData->ddRVal = retValue; 01169 } 01170 01171 /* D3D Callbacks version 2 check and setup for DirectX/ ReactX */ 01172 else if (IsEqualGUID(&pData->guidInfo, &GUID_D3DCallbacks2)) 01173 { 01174 // FIXME GUID_D3DCallbacks2 01175 } 01176 01177 /* D3D Callbacks version 3 check and setup for DirectX/ ReactX */ 01178 else if (IsEqualGUID(&pData->guidInfo, &GUID_D3DCallbacks3)) 01179 { 01180 // FIXME GUID_D3DCallbacks3 01181 } 01182 01183 /* D3DParseUnknownCommand Callbacks check and setup for DirectX/ ReactX */ 01184 else if (IsEqualGUID(&pData->guidInfo, &GUID_D3DParseUnknownCommandCallback)) 01185 { 01186 // FIXME GUID_D3DParseUnknownCommandCallback 01187 } 01188 01189 /* MotionComp Callbacks check and setup for DirectX/ ReactX */ 01190 else if (IsEqualGUID(&pData->guidInfo, &GUID_MotionCompCallbacks)) 01191 { 01192 // FIXME GUID_MotionCompCallbacks 01193 } 01194 01195 /* FIXME VPE2 Callbacks check and setup for DirectX/ ReactX */ 01196 //else if (IsEqualGUID(&pData->guidInfo, &GUID_VPE2Callbacks)) 01197 //{ 01198 // FIXME GUID_VPE2Callbacks 01199 //} 01200 else 01201 { 01202 /* set up internal buffer */ 01203 pDrvInfoData.dwExpectedSize = pData->dwExpectedSize; 01204 pDrvInfoData.lpvData = pData->lpvData; 01205 01206 /* We do not cover all callbacks for user mode, they are only cover by kmode */ 01207 retValue = NtGdiDdGetDriverInfo(hDD, (PDD_GETDRIVERINFODATA)&pDrvInfoData); 01208 01209 /* Setup return data */ 01210 pData->dwActualSize = pDrvInfoData.dwActualSize; 01211 pData->lpvData = pDrvInfoData.lpvData; 01212 /* Windows XP never repot back the true return value, 01213 * it only report back if we have a driver or not 01214 * ReactOS keep this behoir to be compatible with 01215 * Windows XP 01216 */ 01217 pData->ddRVal = retValue; 01218 } 01219 01220 return retValue; 01221 } 01222 01223 01224 /* 01225 * @implemented 01226 * 01227 * D3dContextCreate 01228 */ 01229 BOOL 01230 WINAPI 01231 D3dContextCreate(LPD3DHAL_CONTEXTCREATEDATA pdcci) 01232 { 01233 HANDLE hSurfZ = NULL; 01234 01235 if (pdcci->lpDDSZLcl) 01236 { 01237 hSurfZ = (HANDLE)pdcci->lpDDSZLcl->hDDSurface; 01238 } 01239 01240 return NtGdiD3dContextCreate(GetDdHandle(pdcci->lpDDLcl->hDD), 01241 (HANDLE)pdcci->lpDDSLcl->hDDSurface, 01242 hSurfZ, 01243 (D3DNTHAL_CONTEXTCREATEI *)pdcci); 01244 } 01245 01246 /* 01247 * @implemented 01248 * 01249 * DdCanCreateD3DBuffer 01250 */ 01251 DWORD 01252 WINAPI 01253 DdCanCreateD3DBuffer(LPDDHAL_CANCREATESURFACEDATA CanCreateD3DBuffer) 01254 { 01255 /* 01256 * Note : This functions are basic same, in win32k 01257 * NtGdiDdCanCreateD3DBuffer and NtGdiDdCanCreateSurface are mergs 01258 * toghter in win32k at end and retrurn same data, it is still sepreated 01259 * at user mode but in kmode it is not. 01260 */ 01261 01262 /* Call win32k */ 01263 return NtGdiDdCanCreateD3DBuffer(GetDdHandle(CanCreateD3DBuffer->lpDD->hDD), 01264 (PDD_CANCREATESURFACEDATA)CanCreateD3DBuffer); 01265 } 01266 01267 01268 /* 01269 * @implemented 01270 * 01271 * DdCreateD3DBuffer 01272 */ 01273 DWORD 01274 WINAPI 01275 DdCreateD3DBuffer(LPDDHAL_CREATESURFACEDATA pCreateSurface) 01276 { 01277 HANDLE puhSurface = 0; 01278 DDRAWI_DDRAWSURFACE_GBL *pSurfGBL; 01279 DDRAWI_DDRAWSURFACE_LCL *pSurfLcl; 01280 DD_SURFACE_GLOBAL puSurfaceGlobalData; 01281 DD_SURFACE_MORE puSurfaceMoreData; 01282 DD_SURFACE_LOCAL puSurfaceLocalData; 01283 DWORD retValue; 01284 01285 /* Zero all local memory pointer */ 01286 RtlZeroMemory(&puSurfaceGlobalData, sizeof(DD_SURFACE_GLOBAL) ); 01287 RtlZeroMemory(&puSurfaceMoreData, sizeof(DD_SURFACE_MORE) ) ; 01288 RtlZeroMemory(&puSurfaceLocalData, sizeof(DD_SURFACE_LOCAL) ); 01289 01290 pCreateSurface->dwSCnt = 1; 01291 pSurfLcl = pCreateSurface->lplpSList[0]; 01292 pSurfGBL = pSurfLcl->lpGbl; 01293 01294 /* Convert DDRAWI_DDRAWSURFACE_GBL to DD_SURFACE_GLOBAL */ 01295 puSurfaceGlobalData.wWidth = pSurfGBL->wWidth; 01296 puSurfaceGlobalData.wHeight = pSurfGBL->wHeight; 01297 puSurfaceGlobalData.dwLinearSize = pSurfGBL->dwLinearSize; 01298 puSurfaceGlobalData.fpVidMem = pSurfGBL->fpVidMem; 01299 puSurfaceGlobalData.dwBlockSizeX = pSurfGBL->dwBlockSizeX; 01300 puSurfaceGlobalData.dwBlockSizeY = pSurfGBL->dwBlockSizeY; 01301 01302 /* Convert DDRAWI_DDRAWSURFACE_MORE to DD_SURFACE_MORE */ 01303 puSurfaceMoreData.dwSurfaceHandle = pSurfLcl->lpSurfMore->dwSurfaceHandle; 01304 puSurfaceMoreData.ddsCapsEx.dwCaps2 = pSurfLcl->lpSurfMore->ddsCapsEx.dwCaps2; 01305 puSurfaceMoreData.ddsCapsEx.dwCaps3 = pSurfLcl->lpSurfMore->ddsCapsEx.dwCaps3; 01306 puSurfaceMoreData.ddsCapsEx.dwCaps4 = pSurfLcl->lpSurfMore->ddsCapsEx.dwCaps4; 01307 01308 /* Convert DDRAWI_DDRAWSURFACE_LCL to DD_SURFACE_LOCAL */ 01309 puSurfaceLocalData.dwFlags = pSurfLcl->dwFlags; 01310 puSurfaceLocalData.ddsCaps.dwCaps = pSurfLcl->ddsCaps.dwCaps; 01311 01312 /* Call win32k */ 01313 retValue = NtGdiDdCreateD3DBuffer( GetDdHandle(pCreateSurface->lpDD->hDD), 01314 (HANDLE*)&pSurfLcl->hDDSurface, 01315 pCreateSurface->lpDDSurfaceDesc, 01316 &puSurfaceGlobalData, 01317 &puSurfaceLocalData, 01318 &puSurfaceMoreData, 01319 (DD_CREATESURFACEDATA *) pCreateSurface, 01320 &puhSurface); 01321 01322 /* Setup surface handle if we got one back */ 01323 if ( puhSurface != NULL ) 01324 { 01325 pCreateSurface->lplpSList[0]->hDDSurface = (ULONG_PTR)puhSurface; 01326 } 01327 01328 /* Convert DD_SURFACE_GLOBAL to DDRAWI_DDRAWSURFACE_GBL */ 01329 pSurfGBL->dwLinearSize = puSurfaceGlobalData.dwLinearSize; 01330 pSurfGBL->fpVidMem = puSurfaceGlobalData.fpVidMem; 01331 pSurfGBL->dwBlockSizeX = puSurfaceGlobalData.dwBlockSizeX; 01332 pSurfGBL->dwBlockSizeY = puSurfaceGlobalData.dwBlockSizeY; 01333 01334 return retValue; 01335 } 01336 01337 /* 01338 * @implemented 01339 * 01340 * DdDestroyD3DBuffer 01341 */ 01342 DWORD 01343 WINAPI 01344 DdDestroyD3DBuffer(LPDDHAL_DESTROYSURFACEDATA pDestroySurface) 01345 { 01346 DWORD retValue = 0; 01347 if ( pDestroySurface->lpDDSurface->hDDSurface) 01348 { 01349 /* Call win32k */ 01350 retValue = NtGdiDdDestroyD3DBuffer((HANDLE)pDestroySurface->lpDDSurface->hDDSurface); 01351 } 01352 01353 return retValue; 01354 } 01355 01356 /* 01357 * @implemented 01358 * 01359 * DdLockD3D 01360 */ 01361 DWORD 01362 WINAPI 01363 DdLockD3D(LPDDHAL_LOCKDATA Lock) 01364 { 01365 01366 /* Call win32k */ 01367 return NtGdiDdLockD3D((HANDLE)Lock->lpDDSurface->hDDSurface, (PDD_LOCKDATA)Lock); 01368 } 01369 01370 /* 01371 * @implemented 01372 * 01373 * DdUnlockD3D 01374 */ 01375 DWORD 01376 WINAPI 01377 DdUnlockD3D(LPDDHAL_UNLOCKDATA Unlock) 01378 { 01379 /* Call win32k */ 01380 return NtGdiDdUnlock((HANDLE)Unlock->lpDDSurface->hDDSurface, 01381 (PDD_UNLOCKDATA)Unlock); 01382 } 01383 01384 01385 /* PRIVATE FUNCTIONS *********************************************************/ 01386 01387 BOOL 01388 WINAPI 01389 bDDCreateSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface, 01390 BOOL bComplete) 01391 { 01392 DD_SURFACE_LOCAL SurfaceLocal; 01393 DD_SURFACE_GLOBAL SurfaceGlobal; 01394 DD_SURFACE_MORE SurfaceMore; 01395 01396 /* Zero struct */ 01397 RtlZeroMemory(&SurfaceLocal, sizeof(DD_SURFACE_LOCAL)); 01398 RtlZeroMemory(&SurfaceGlobal, sizeof(DD_SURFACE_GLOBAL)); 01399 RtlZeroMemory(&SurfaceMore, sizeof(DD_SURFACE_MORE)); 01400 01401 /* Set up SurfaceLocal struct */ 01402 SurfaceLocal.ddsCaps.dwCaps = pSurface->ddsCaps.dwCaps; 01403 SurfaceLocal.dwFlags = pSurface->dwFlags; 01404 01405 /* Set up SurfaceMore struct */ 01406 RtlMoveMemory(&SurfaceMore.ddsCapsEx, 01407 &pSurface->ddckCKDestBlt, 01408 sizeof(DDSCAPSEX)); 01409 SurfaceMore.dwSurfaceHandle = (DWORD)pSurface->dbnOverlayNode.object_int->lpVtbl; 01410 01411 /* Set up SurfaceGlobal struct */ 01412 SurfaceGlobal.fpVidMem = pSurface->lpGbl->fpVidMem; 01413 SurfaceGlobal.dwLinearSize = pSurface->lpGbl->dwLinearSize; 01414 SurfaceGlobal.wHeight = pSurface->lpGbl->wHeight; 01415 SurfaceGlobal.wWidth = pSurface->lpGbl->wWidth; 01416 01417 /* Check if we have a pixel format */ 01418 if (pSurface->dwFlags & DDSD_PIXELFORMAT) 01419 { 01420 /* Use global one */ 01421 SurfaceGlobal.ddpfSurface = pSurface->lpGbl->lpDD->vmiData.ddpfDisplay; 01422 SurfaceGlobal.ddpfSurface.dwSize = sizeof(DDPIXELFORMAT); 01423 } 01424 else 01425 { 01426 /* Use local one */ 01427 SurfaceGlobal.ddpfSurface = pSurface->lpGbl->lpDD->vmiData.ddpfDisplay; 01428 } 01429 01430 /* Create the object */ 01431 pSurface->hDDSurface = (DWORD)NtGdiDdCreateSurfaceObject(GetDdHandle(pSurface->lpGbl->lpDD->hDD), 01432 (HANDLE)pSurface->hDDSurface, 01433 &SurfaceLocal, 01434 &SurfaceMore, 01435 &SurfaceGlobal, 01436 bComplete); 01437 01438 /* Return status */ 01439 if (pSurface->hDDSurface) return TRUE; 01440 return FALSE; 01441 } 01442 01443 /* PUBLIC FUNCTIONS **********************************************************/ 01444 01445 /* 01446 * @implemented 01447 * 01448 * GDIEntry 1 01449 */ 01450 BOOL 01451 WINAPI 01452 DdCreateDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, 01453 HDC hdc) 01454 { 01455 BOOL Return = FALSE; 01456 01457 /* Check if the global hDC (hdc == 0) is being used */ 01458 if (!hdc) 01459 { 01460 /* We'll only allow this if the global object doesn't exist yet */ 01461 if (!ghDirectDraw) 01462 { 01463 /* Create the DC */ 01464 if ((hdc = CreateDCW(L"Display", NULL, NULL, NULL))) 01465 { 01466 /* Create the DDraw Object */ 01467 ghDirectDraw = NtGdiDdCreateDirectDrawObject(hdc); 01468 01469 /* Delete our DC */ 01470 DeleteDC(hdc); 01471 } 01472 } 01473 01474 /* If we created the object, or had one ...*/ 01475 if (ghDirectDraw) 01476 { 01477 /* Increase count and set success */ 01478 gcDirectDraw++; 01479 Return = TRUE; 01480 } 01481 01482 /* Zero the handle */ 01483 pDirectDrawGlobal->hDD = 0; 01484 } 01485 else 01486 { 01487 /* Using the per-process object, so create it */ 01488 pDirectDrawGlobal->hDD = (ULONG_PTR)NtGdiDdCreateDirectDrawObject(hdc); 01489 01490 /* Set the return value */ 01491 Return = pDirectDrawGlobal->hDD ? TRUE : FALSE; 01492 } 01493 01494 /* Return to caller */ 01495 return Return; 01496 } 01497 01498 /* 01499 * @implemented 01500 * 01501 * GDIEntry 2 01502 */ 01503 BOOL 01504 WINAPI 01505 DdQueryDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, 01506 LPDDHALINFO pHalInfo, 01507 LPDDHAL_DDCALLBACKS pDDCallbacks, 01508 LPDDHAL_DDSURFACECALLBACKS pDDSurfaceCallbacks, 01509 LPDDHAL_DDPALETTECALLBACKS pDDPaletteCallbacks, 01510 LPD3DHAL_CALLBACKS pD3dCallbacks, 01511 LPD3DHAL_GLOBALDRIVERDATA pD3dDriverData, 01512 LPDDHAL_DDEXEBUFCALLBACKS pD3dBufferCallbacks, 01513 LPDDSURFACEDESC pD3dTextureFormats, 01514 LPDWORD pdwFourCC, 01515 LPVIDMEM pvmList) 01516 { 01517 PVIDEOMEMORY VidMemList = NULL; 01518 DD_HALINFO HalInfo; 01519 D3DNTHAL_CALLBACKS D3dCallbacks; 01520 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData; 01521 DD_D3DBUFCALLBACKS D3dBufferCallbacks; 01522 DWORD CallbackFlags[3]; 01523 DWORD dwNumHeaps=0, FourCCs=0; 01524 DWORD Flags; 01525 BOOL retVal = TRUE; 01526 01527 /* Clear the structures */ 01528 RtlZeroMemory(&HalInfo, sizeof(DD_HALINFO)); 01529 RtlZeroMemory(&D3dCallbacks, sizeof(D3DNTHAL_CALLBACKS)); 01530 RtlZeroMemory(&D3dDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA)); 01531 RtlZeroMemory(&D3dBufferCallbacks, sizeof(DD_D3DBUFCALLBACKS)); 01532 RtlZeroMemory(CallbackFlags, sizeof(DWORD)*3); 01533 01534 /* Note : XP always alloc 24*sizeof(VIDEOMEMORY) of pvmlist so we change it to it */ 01535 if ( (pvmList != NULL) && 01536 (pHalInfo->vmiData.dwNumHeaps != 0) ) 01537 { 01538 VidMemList = (PVIDEOMEMORY) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(VIDEOMEMORY) * 24 ) * pHalInfo->vmiData.dwNumHeaps); 01539 } 01540 01541 01542 /* Do the query */ 01543 if (!NtGdiDdQueryDirectDrawObject(GetDdHandle(pDirectDrawGlobal->hDD), 01544 &HalInfo, 01545 CallbackFlags, 01546 &D3dCallbacks, 01547 &D3dDriverData, 01548 &D3dBufferCallbacks, 01549 pD3dTextureFormats, 01550 &dwNumHeaps, 01551 VidMemList, 01552 &FourCCs, 01553 pdwFourCC)) 01554 { 01555 /* We failed, free the memory and return */ 01556 retVal = FALSE; 01557 goto cleanup; 01558 } 01559 01560 /* Clear the incoming pointer */ 01561 RtlZeroMemory(pHalInfo, sizeof(DDHALINFO)); 01562 01563 /* Convert all the data */ 01564 pHalInfo->dwSize = sizeof(DDHALINFO); 01565 pHalInfo->lpDDCallbacks = pDDCallbacks; 01566 pHalInfo->lpDDSurfaceCallbacks = pDDSurfaceCallbacks; 01567 pHalInfo->lpDDPaletteCallbacks = pDDPaletteCallbacks; 01568 01569 /* Check for NT5+ D3D Data */ 01570 if ( (D3dCallbacks.dwSize != 0) && 01571 (D3dDriverData.dwSize != 0) ) 01572 { 01573 /* Write these down */ 01574 pHalInfo->lpD3DGlobalDriverData = (ULONG_PTR)pD3dDriverData; 01575 pHalInfo->lpD3DHALCallbacks = (ULONG_PTR)pD3dCallbacks; 01576 01577 /* Check for Buffer Callbacks */ 01578 if (D3dBufferCallbacks.dwSize) 01579 { 01580 /* Write this one too */ 01581 pHalInfo->lpDDExeBufCallbacks = pD3dBufferCallbacks; 01582 } 01583 } 01584 01585 /* Continue converting the rest */ 01586 pHalInfo->vmiData.dwFlags = HalInfo.vmiData.dwFlags; 01587 pHalInfo->vmiData.dwDisplayWidth = HalInfo.vmiData.dwDisplayWidth; 01588 pHalInfo->vmiData.dwDisplayHeight = HalInfo.vmiData.dwDisplayHeight; 01589 pHalInfo->vmiData.lDisplayPitch = HalInfo.vmiData.lDisplayPitch; 01590 pHalInfo->vmiData.fpPrimary = 0; 01591 01592 RtlCopyMemory( &pHalInfo->vmiData.ddpfDisplay, 01593 &HalInfo.vmiData.ddpfDisplay, 01594 sizeof(DDPIXELFORMAT)); 01595 01596 pHalInfo->vmiData.dwOffscreenAlign = HalInfo.vmiData.dwOffscreenAlign; 01597 pHalInfo->vmiData.dwOverlayAlign = HalInfo.vmiData.dwOverlayAlign; 01598 pHalInfo->vmiData.dwTextureAlign = HalInfo.vmiData.dwTextureAlign; 01599 pHalInfo->vmiData.dwZBufferAlign = HalInfo.vmiData.dwZBufferAlign; 01600 pHalInfo->vmiData.dwAlphaAlign = HalInfo.vmiData.dwAlphaAlign; 01601 01602 pHalInfo->vmiData.dwNumHeaps = dwNumHeaps; 01603 pHalInfo->vmiData.pvmList = pvmList; 01604 01605 RtlCopyMemory( &pHalInfo->ddCaps, 01606 &HalInfo.ddCaps, 01607 sizeof(DDCORECAPS )); 01608 01609 pHalInfo->ddCaps.dwNumFourCCCodes = FourCCs; 01610 pHalInfo->lpdwFourCC = pdwFourCC; 01611 01612 /* always force rope 0x1000 for hal it mean only source copy is supported */ 01613 pHalInfo->ddCaps.dwRops[6] = 0x1000; 01614 01615 /* Set the HAL flags what ReactX got from the driver 01616 * Windows XP force setting DDHALINFO_GETDRIVERINFOSET if the driver does not set it 01617 * and ReactX doing same to keep compatible with drivers, but the driver are 01618 * force support DdGetDriverInfo acoriding MSDN but it seam some driver do not set 01619 * this flag even it is being supported. that is mean. It is small hack to keep 01620 * bad driver working, that trust this is always being setting by it self at end 01621 */ 01622 pHalInfo->dwFlags = (HalInfo.dwFlags & ~DDHALINFO_GETDRIVERINFOSET) | DDHALINFO_GETDRIVERINFOSET; 01623 pHalInfo->GetDriverInfo = (LPDDHAL_GETDRIVERINFO) DdGetDriverInfo; 01624 01625 /* Now check if we got any DD callbacks */ 01626 if (pDDCallbacks) 01627 { 01628 /* Zero the structure */ 01629 RtlZeroMemory(pDDCallbacks, sizeof(DDHAL_DDCALLBACKS)); 01630 pDDCallbacks->dwSize = sizeof(DDHAL_DDCALLBACKS); 01631 01632 /* Set the flags for this structure 01633 * Windows XP force setting DDHAL_CB32_CREATESURFACE if the driver does not set it 01634 * and ReactX doing same to keep compatible with drivers, but the driver are 01635 * force support pDDCallbacks acoriding MSDN but it seam some driver do not set 01636 * this flag even it is being supported. that is mean. It is small hack to keep 01637 * bad driver working, that trust this is always being setting by it self at end 01638 */ 01639 Flags = (CallbackFlags[0] & ~DDHAL_CB32_CREATESURFACE) | DDHAL_CB32_CREATESURFACE; 01640 pDDCallbacks->dwFlags = Flags; 01641 01642 /* Write the always-on functions */ 01643 pDDCallbacks->CreateSurface = DdCreateSurface; 01644 01645 /* Now write the pointers, if applicable */ 01646 if (Flags & DDHAL_CB32_WAITFORVERTICALBLANK) 01647 { 01648 pDDCallbacks->WaitForVerticalBlank = DdWaitForVerticalBlank; 01649 } 01650 if (Flags & DDHAL_CB32_CANCREATESURFACE) 01651 { 01652 pDDCallbacks->CanCreateSurface = DdCanCreateSurface; 01653 } 01654 if (Flags & DDHAL_CB32_GETSCANLINE) 01655 { 01656 pDDCallbacks->GetScanLine = DdGetScanLine; 01657 } 01658 } 01659 01660 /* Check for DD Surface Callbacks */ 01661 if (pDDSurfaceCallbacks) 01662 { 01663 /* Zero the structures */ 01664 RtlZeroMemory(pDDSurfaceCallbacks, sizeof(DDHAL_DDSURFACECALLBACKS)); 01665 pDDSurfaceCallbacks->dwSize = sizeof(DDHAL_DDSURFACECALLBACKS); 01666 01667 /* Set the flags for this structure 01668 * Windows XP force setting DDHAL_SURFCB32_LOCK, DDHAL_SURFCB32_UNLOCK, 01669 * DDHAL_SURFCB32_SETCOLORKEY, DDHAL_SURFCB32_DESTROYSURFACE if the driver 01670 * does not set it and ReactX doing same to keep compatible with drivers, 01671 * but the driver are force support pDDSurfaceCallbacks acoriding MSDN but it seam 01672 * some driver do not set this flag even it is being supported. that is mean. 01673 * It is small hack to keep bad driver working, that trust this is always being 01674 * setting by it self at end 01675 */ 01676 01677 Flags = (CallbackFlags[1] & ~(DDHAL_SURFCB32_LOCK | DDHAL_SURFCB32_UNLOCK | 01678 DDHAL_SURFCB32_SETCOLORKEY | DDHAL_SURFCB32_DESTROYSURFACE)) | 01679 (DDHAL_SURFCB32_LOCK | DDHAL_SURFCB32_UNLOCK | 01680 DDHAL_SURFCB32_SETCOLORKEY | DDHAL_SURFCB32_DESTROYSURFACE); 01681 01682 pDDSurfaceCallbacks->dwFlags = Flags; 01683 01684 /* Write the always-on functions */ 01685 pDDSurfaceCallbacks->Lock = DdLock; 01686 pDDSurfaceCallbacks->Unlock = DdUnlock; 01687 pDDSurfaceCallbacks->SetColorKey = DdSetColorKey; 01688 pDDSurfaceCallbacks->DestroySurface = DdDestroySurface; 01689 01690 /* Write the optional ones */ 01691 if (Flags & DDHAL_SURFCB32_FLIP) 01692 { 01693 pDDSurfaceCallbacks->Flip = DdFlip; 01694 } 01695 if (Flags & DDHAL_SURFCB32_BLT) 01696 { 01697 pDDSurfaceCallbacks->Blt = DdBlt; 01698 } 01699 if (Flags & DDHAL_SURFCB32_GETBLTSTATUS) 01700 { 01701 pDDSurfaceCallbacks->GetBltStatus = DdGetBltStatus; 01702 } 01703 if (Flags & DDHAL_SURFCB32_GETFLIPSTATUS) 01704 { 01705 pDDSurfaceCallbacks->GetFlipStatus = DdGetFlipStatus; 01706 } 01707 if (Flags & DDHAL_SURFCB32_UPDATEOVERLAY) 01708 { 01709 pDDSurfaceCallbacks->UpdateOverlay = DdUpdateOverlay; 01710 } 01711 if (Flags & DDHAL_SURFCB32_SETOVERLAYPOSITION) 01712 { 01713 pDDSurfaceCallbacks->SetOverlayPosition = DdSetOverlayPosition; 01714 } 01715 if (Flags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) 01716 { 01717 pDDSurfaceCallbacks->AddAttachedSurface = DdAddAttachedSurface; 01718 } 01719 } 01720 01721 /* Check for DD Palette Callbacks, This interface are dead for user mode, 01722 * only what it can support are being report back. 01723 */ 01724 if (pDDPaletteCallbacks) 01725 { 01726 /* Zero the struct */ 01727 RtlZeroMemory(pDDPaletteCallbacks, sizeof(DDHAL_DDPALETTECALLBACKS)); 01728 01729 /* Write the header */ 01730 pDDPaletteCallbacks->dwSize = sizeof(DDHAL_DDPALETTECALLBACKS); 01731 pDDPaletteCallbacks->dwFlags = CallbackFlags[2]; 01732 } 01733 01734 if (pD3dCallbacks) 01735 { 01736 /* Zero the struct */ 01737 RtlZeroMemory(pD3dCallbacks, sizeof(DDHAL_DDEXEBUFCALLBACKS)); 01738 01739 /* Check if we have one */ 01740 if (D3dCallbacks.dwSize) 01741 { 01742 /* Write the header */ 01743 pD3dCallbacks->dwSize = sizeof(DDHAL_DDEXEBUFCALLBACKS); 01744 01745 /* Now check for each callback */ 01746 if (D3dCallbacks.ContextCreate) 01747 { 01748 pD3dCallbacks->ContextCreate = (LPD3DHAL_CONTEXTCREATECB) D3dContextCreate; 01749 } 01750 if (D3dCallbacks.ContextDestroy) 01751 { 01752 pD3dCallbacks->ContextDestroy = (LPD3DHAL_CONTEXTDESTROYCB) NtGdiD3dContextDestroy; 01753 } 01754 if (D3dCallbacks.ContextDestroyAll) 01755 { 01756 pD3dCallbacks->ContextDestroyAll = (LPD3DHAL_CONTEXTDESTROYALLCB) NtGdiD3dContextDestroyAll; 01757 } 01758 } 01759 } 01760 01761 /* Check for D3D Driver Data */ 01762 if (pD3dDriverData) 01763 { 01764 /* Copy the struct */ 01765 RtlMoveMemory(pD3dDriverData, &D3dDriverData, sizeof(D3DHAL_GLOBALDRIVERDATA)); 01766 01767 /* Write the pointer to the texture formats */ 01768 pD3dDriverData->lpTextureFormats = pD3dTextureFormats; 01769 } 01770 01771 /* Check for D3D Buffer Callbacks */ 01772 if (pD3dBufferCallbacks) 01773 { 01774 /* Zero the struct */ 01775 RtlZeroMemory(pD3dBufferCallbacks, sizeof(DDHAL_DDEXEBUFCALLBACKS)); 01776 01777 if ( D3dBufferCallbacks.dwSize) 01778 { 01779 pD3dBufferCallbacks->dwSize = D3dBufferCallbacks.dwSize; 01780 01781 pD3dBufferCallbacks->dwFlags = D3dBufferCallbacks.dwFlags; 01782 if ( D3dBufferCallbacks.CanCreateD3DBuffer) 01783 { 01784 pD3dBufferCallbacks->CanCreateExecuteBuffer = (LPDDHALEXEBUFCB_CANCREATEEXEBUF)DdCanCreateD3DBuffer; 01785 } 01786 01787 if (D3dBufferCallbacks.CreateD3DBuffer) 01788 { 01789 pD3dBufferCallbacks->CreateExecuteBuffer = (LPDDHALEXEBUFCB_CREATEEXEBUF) DdCreateD3DBuffer; 01790 } 01791 01792 if ( D3dBufferCallbacks.DestroyD3DBuffer ) 01793 { 01794 pD3dBufferCallbacks->DestroyExecuteBuffer = (LPDDHALEXEBUFCB_DESTROYEXEBUF) DdDestroyD3DBuffer; 01795 } 01796 01797 if ( D3dBufferCallbacks.LockD3DBuffer ) 01798 { 01799 pD3dBufferCallbacks->LockExecuteBuffer = (LPDDHALEXEBUFCB_LOCKEXEBUF) DdLockD3D; 01800 } 01801 01802 if ( D3dBufferCallbacks.UnlockD3DBuffer ) 01803 { 01804 pD3dBufferCallbacks->UnlockExecuteBuffer = (LPDDHALEXEBUFCB_UNLOCKEXEBUF) DdUnlockD3D; 01805 } 01806 01807 } 01808 } 01809 01810 /* FIXME VidMemList */ 01811 01812 cleanup: 01813 if (VidMemList) 01814 { 01815 HeapFree(GetProcessHeap(), 0, VidMemList); 01816 } 01817 01818 return retVal; 01819 } 01820 01821 /* 01822 * @implemented 01823 * 01824 * GDIEntry 3 01825 */ 01826 BOOL 01827 WINAPI 01828 DdDeleteDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal) 01829 { 01830 BOOL Return = FALSE; 01831 01832 /* If this is the global object */ 01833 if(pDirectDrawGlobal->hDD) 01834 { 01835 /* Free it */ 01836 Return = NtGdiDdDeleteDirectDrawObject((HANDLE)pDirectDrawGlobal->hDD); 01837 if (Return == TRUE) 01838 { 01839 pDirectDrawGlobal->hDD = 0; 01840 } 01841 } 01842 else if (ghDirectDraw) 01843 { 01844 /* Always success here */ 01845 Return = TRUE; 01846 01847 /* Make sure this is the last instance */ 01848 if (!(--gcDirectDraw)) 01849 { 01850 /* Delete the object */ 01851 Return = NtGdiDdDeleteDirectDrawObject(ghDirectDraw); 01852 if (Return == TRUE) 01853 { 01854 ghDirectDraw = 0; 01855 } 01856 } 01857 } 01858 01859 /* Return */ 01860 return Return; 01861 } 01862 01863 /* 01864 * @implemented 01865 * 01866 * GDIEntry 4 01867 */ 01868 BOOL 01869 WINAPI 01870 DdCreateSurfaceObject( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, 01871 BOOL bPrimarySurface) 01872 { 01873 return bDDCreateSurface(pSurfaceLocal, TRUE); 01874 } 01875 01876 01877 /* 01878 * @implemented 01879 * 01880 * GDIEntry 5 01881 */ 01882 BOOL 01883 WINAPI 01884 DdDeleteSurfaceObject(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal) 01885 { 01886 BOOL Return = FALSE; 01887 01888 /* Make sure there is one */ 01889 if (pSurfaceLocal->hDDSurface) 01890 { 01891 /* Delete it */ 01892 Return = NtGdiDdDeleteSurfaceObject((HANDLE)pSurfaceLocal->hDDSurface); 01893 pSurfaceLocal->hDDSurface = 0; 01894 } 01895 01896 return Return; 01897 } 01898 01899 /* 01900 * @implemented 01901 * 01902 * GDIEntry 6 01903 */ 01904 BOOL 01905 WINAPI 01906 DdResetVisrgn(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, 01907 HWND hWnd) 01908 { 01909 /* Call win32k directly */ 01910 return NtGdiDdResetVisrgn((HANDLE) pSurfaceLocal->hDDSurface, hWnd); 01911 } 01912 01913 /* 01914 * @implemented 01915 * 01916 * GDIEntry 7 01917 */ 01918 HDC 01919 WINAPI 01920 DdGetDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal, 01921 LPPALETTEENTRY pColorTable) 01922 { 01923 /* Call win32k directly */ 01924 return NtGdiDdGetDC(pColorTable, (HANDLE) pSurfaceLocal->hDDSurface); 01925 } 01926 01927 /* 01928 * @implemented 01929 * 01930 * GDIEntry 8 01931 */ 01932 BOOL 01933 WINAPI 01934 DdReleaseDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal) 01935 { 01936 /* Call win32k directly */ 01937 return NtGdiDdReleaseDC((HANDLE) pSurfaceLocal->hDDSurface); 01938 } 01939 01940 /* 01941 * @unimplemented 01942 * GDIEntry 9 01943 */ 01944 HBITMAP 01945 WINAPI 01946 DdCreateDIBSection(HDC hdc, 01947 CONST BITMAPINFO *pbmi, 01948 UINT iUsage, 01949 VOID **ppvBits, 01950 HANDLE hSectionApp, 01951 DWORD dwOffset) 01952 { 01953 SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 01954 return 0; 01955 } 01956 01957 /* 01958 * @implemented 01959 * 01960 * GDIEntry 10 01961 */ 01962 BOOL 01963 WINAPI 01964 DdReenableDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, 01965 BOOL *pbNewMode) 01966 { 01967 /* Call win32k directly */ 01968 return NtGdiDdReenableDirectDrawObject(GetDdHandle(pDirectDrawGlobal->hDD), 01969 pbNewMode); 01970 } 01971 01972 01973 /* 01974 * @implemented 01975 * 01976 * GDIEntry 11 01977 */ 01978 BOOL 01979 WINAPI 01980 DdAttachSurface( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceFrom, 01981 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceTo) 01982 { 01983 /* Create Surface if it does not exits one */ 01984 if (!pSurfaceFrom->hDDSurface) 01985 { 01986 if (!bDDCreateSurface(pSurfaceFrom, FALSE)) 01987 { 01988 return FALSE; 01989 } 01990 } 01991 01992 /* Create Surface if it does not exits one */ 01993 if (!pSurfaceTo->hDDSurface) 01994 { 01995 if (!bDDCreateSurface(pSurfaceTo, FALSE)) 01996 { 01997 return FALSE; 01998 } 01999 } 02000 02001 /* Call win32k */ 02002 return NtGdiDdAttachSurface((HANDLE)pSurfaceFrom->hDDSurface, 02003 (HANDLE)pSurfaceTo->hDDSurface); 02004 } 02005 02006 /* 02007 * @implemented 02008 * 02009 * GDIEntry 12 02010 */ 02011 VOID 02012 WINAPI 02013 DdUnattachSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface, 02014 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceAttached) 02015 { 02016 /* Call win32k */ 02017 NtGdiDdUnattachSurface((HANDLE)pSurface->hDDSurface, 02018 (HANDLE)pSurfaceAttached->hDDSurface); 02019 } 02020 02021 /* 02022 * @implemented 02023 * 02024 * GDIEntry 13 02025 */ 02026 ULONG 02027 WINAPI 02028 DdQueryDisplaySettingsUniqueness() 02029 { 02030 return GdiSharedHandleTable->flDeviceUniq; 02031 } 02032 02033 /* 02034 * @implemented 02035 * 02036 * GDIEntry 14 02037 */ 02038 HANDLE 02039 WINAPI 02040 DdGetDxHandle(LPDDRAWI_DIRECTDRAW_LCL pDDraw, 02041 LPDDRAWI_DDRAWSURFACE_LCL pSurface, 02042 BOOL bRelease) 02043 { 02044 HANDLE hDD = NULL; 02045 HANDLE hSurface = NULL; 02046 02047 /* Check if we already have a surface */ 02048 if (!pSurface) 02049 { 02050 /* We don't have one, use the DirectDraw Object handle instead */ 02051 hDD = GetDdHandle(pDDraw->lpGbl->hDD); 02052 } 02053 else 02054 { 02055 hSurface = (HANDLE)pSurface->hDDSurface; 02056 } 02057 02058 /* Call the API */ 02059 return (HANDLE)NtGdiDdGetDxHandle(hDD, hSurface, bRelease); 02060 } 02061 02062 /* 02063 * @implemented 02064 * 02065 * GDIEntry 15 02066 */ 02067 BOOL 02068 WINAPI 02069 DdSetGammaRamp(LPDDRAWI_DIRECTDRAW_LCL pDDraw, 02070 HDC hdc, 02071 LPVOID lpGammaRamp) 02072 { 02073 /* Call win32k directly */ 02074 return NtGdiDdSetGammaRamp(GetDdHandle(pDDraw->lpGbl->hDD), 02075 hdc, 02076 lpGammaRamp); 02077 } 02078 02079 02080 02081 02082 Generated on Sat May 26 2012 04:37:10 for ReactOS by
1.7.6.1
|