#include "basetype.h"Go to the source code of this file.
|
|
Definition at line 1455 of file dmodes.c. References bActive, lpDDSBack, and NULL. Referenced by BeginScene().
|
|
||||||||||||||||||||
|
Definition at line 1287 of file dmodes.c. References tagRECT::bottom, ErrorPrintf(), FALSE, tagRECT::left, lpDDSBack, MyErrorToString(), NULL, RestoreAll(), tagRECT::right, tagRECT::top, TRUE, U32, and y.
01288 {
01289 HRESULT ddrval;
01290 DDSURFACEDESC2 ddsd;
01291 RECT rDest;
01292 char szTemp[256];
01293
01294 //make sure the back buffer is unlocked (for stretch)
01295 /* if(bBackLocked)
01296 {
01297 ddrval =lpDDSBack->lpVtbl->Unlock(lpDDSBack, NULL);
01298 if(ddrval!=DD_OK && ddrval!=DDERR_NOTLOCKED)
01299 {
01300 ErrorPrintf(MyErrorToString(ddrval));
01301 return TRUE;
01302 }
01303 }
01304 bBackLocked =FALSE;
01305 */
01306
01307 if(SRect)
01308 {
01309 rDest.left =x;
01310 rDest.top =y;
01311 rDest.right =x + (SRect->right - SRect->left);
01312 rDest.bottom=y + (SRect->bottom- SRect->top);
01313 }
01314 else
01315 {
01316 memset(&ddsd, 0, sizeof(DDSCAPS2));
01317 ddsd.dwSize =sizeof(ddsd);
01318 ddsd.dwFlags=DDSD_HEIGHT | DDSD_WIDTH;
01319 lpDDSDecal->lpVtbl->GetSurfaceDesc(lpDDSDecal, &ddsd);
01320
01321 rDest.left =x;
01322 rDest.top =y;
01323 rDest.right =x + ddsd.dwWidth;
01324 rDest.bottom=y + ddsd.dwHeight;
01325 }
01326
01327 ddrval =DD_OK;
01328 while(1)
01329 {
01330 if(SRect)
01331 {
01332 ddrval =lpDDSBack->lpVtbl->Blt(lpDDSBack, &rDest, lpDDSDecal, SRect, DDBLT_WAIT | DDBLT_KEYSRC, NULL);
01333 }
01334 else
01335 {
01336 ddrval =lpDDSBack->lpVtbl->Blt(lpDDSBack, &rDest, lpDDSDecal, NULL, DDBLT_WAIT | DDBLT_KEYSRC, NULL);
01337 }
01338 if(ddrval==DD_OK)
01339 break;
01340
01341 if(ddrval==DDERR_SURFACELOST)
01342 {
01343 ddrval =RestoreAll();
01344 if(ddrval!=DD_OK)
01345 {
01346 ErrorPrintf("Error During Blt() in DDrawBltDecal()...\n");
01347 ErrorPrintf("DirectDraw Surfaces were lost and could not be restored : %s\n", MyErrorToString(ddrval));
01348 return FALSE;
01349 }
01350 }
01351 else if(ddrval!=DDERR_WASSTILLDRAWING)
01352 {
01353 ErrorPrintf("Error During Blt() in DDrawBltDecal() : %s\n", MyErrorToString(ddrval));
01354 if(SRect)
01355 {
01356 sprintf(szTemp, "SLeft:%d, STop:%d, SRight:%d, SBottom:%d\n", SRect->left, SRect->top, SRect->right, SRect->bottom);
01357 ErrorPrintf(szTemp);
01358 }
01359 sprintf(szTemp, "DLeft:%d, DTop:%d, DRight:%d, DBottom:%d\n%x", rDest.left, rDest.top, rDest.right, rDest.bottom, (U32)lpDDSDecal);
01360 ErrorPrintf(szTemp);
01361 return FALSE;
01362 }
01363 }
01364 return TRUE;
01365 }
|
|
||||||||||||||||||||
|
Definition at line 1434 of file dmodes.c. References DecalQ, NumDecalsQd, TRUE, and y.
01435 {
01436 DecalQ[NumDecalsQd].surf =lpDDSDecal;
01437 if(SRect)
01438 {
01439 DecalQ[NumDecalsQd].srect =*SRect;
01440 }
01441 else
01442 {
01443 DecalQ[NumDecalsQd].srect.left =-1;
01444 }
01445 DecalQ[NumDecalsQd].x =x;
01446 DecalQ[NumDecalsQd].y =y;
01447
01448 if(NumDecalsQd < 8191)
01449 {
01450 NumDecalsQd++;
01451 }
01452 return TRUE;
01453 }
|
|
||||||||||||||||||||
|
Definition at line 1367 of file dmodes.c. References tagRECT::bottom, ErrorPrintf(), FALSE, tagRECT::left, lpDDSPrimary, MyErrorToString(), NULL, RestoreAll(), tagRECT::right, tagRECT::top, TRUE, U32, and y.
01368 {
01369 HRESULT ddrval;
01370 DDSURFACEDESC2 ddsd;
01371 RECT rDest;
01372 char szTemp[256];
01373
01374 if(SRect)
01375 {
01376 rDest.left =x;
01377 rDest.top =y;
01378 rDest.right =x + (SRect->right - SRect->left);
01379 rDest.bottom=y + (SRect->bottom- SRect->top);
01380 }
01381 else
01382 {
01383 memset(&ddsd, 0, sizeof(DDSCAPS2));
01384 ddsd.dwSize =sizeof(ddsd);
01385 ddsd.dwFlags=DDSD_HEIGHT | DDSD_WIDTH;
01386 lpDDSDecal->lpVtbl->GetSurfaceDesc(lpDDSDecal, &ddsd);
01387
01388 rDest.left =x;
01389 rDest.top =y;
01390 rDest.right =x + ddsd.dwWidth;
01391 rDest.bottom=y + ddsd.dwHeight;
01392 }
01393
01394 ddrval =DD_OK;
01395 while(1)
01396 {
01397 if(SRect)
01398 {
01399 ddrval =lpDDSPrimary->lpVtbl->Blt(lpDDSPrimary, &rDest, lpDDSDecal, SRect, DDBLT_WAIT | DDBLT_KEYSRC, NULL);
01400 }
01401 else
01402 {
01403 ddrval =lpDDSPrimary->lpVtbl->Blt(lpDDSPrimary, &rDest, lpDDSDecal, NULL, DDBLT_WAIT | DDBLT_KEYSRC, NULL);
01404 }
01405 if(ddrval==DD_OK)
01406 break;
01407
01408 if(ddrval==DDERR_SURFACELOST)
01409 {
01410 ddrval =RestoreAll();
01411 if(ddrval!=DD_OK)
01412 {
01413 ErrorPrintf("Error During Blt() in DDrawBltDecalToFront()...\n");
01414 ErrorPrintf("DirectDraw Surfaces were lost and could not be restored : %s\n", MyErrorToString(ddrval));
01415 return FALSE;
01416 }
01417 }
01418 else if(ddrval!=DDERR_WASSTILLDRAWING)
01419 {
01420 ErrorPrintf("Error During Blt() in DDrawBltDecalToFront() : %s\n", MyErrorToString(ddrval));
01421 if(SRect)
01422 {
01423 sprintf(szTemp, "SLeft:%d, STop:%d, SRight:%d, SBottom:%d\n", SRect->left, SRect->top, SRect->right, SRect->bottom);
01424 ErrorPrintf(szTemp);
01425 }
01426 sprintf(szTemp, "DLeft:%d, DTop:%d, DRight:%d, DBottom:%d\n%x", rDest.left, rDest.top, rDest.right, rDest.bottom, (U32)lpDDSDecal);
01427 ErrorPrintf(szTemp);
01428 return FALSE;
01429 }
01430 }
01431 return TRUE;
01432 }
|
|
||||||||||||||||||||
|
Definition at line 1045 of file dmodes.c. References lpDD4, NULL, S32, U32, and U8.
01046 {
01047 LPDIRECTDRAWSURFACE4 lpDDS;
01048 DDSURFACEDESC2 ddsd;
01049 HRESULT ddrval;
01050 int i;
01051
01052 memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
01053 ddsd.dwSize =sizeof(DDSURFACEDESC2);
01054 ddsd.dwFlags =DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_CKSRCBLT;
01055 ddsd.ddsCaps.dwCaps =DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
01056 ddsd.dwHeight =dwHeight;
01057 ddsd.dwWidth =dwWidth;
01058
01059 ddsd.ddckCKSrcBlt.dwColorSpaceLowValue =((((U8 *)pal)[765])<<16)
01060 |((((U8 *)pal)[766])<<8)
01061 |(((U8 *)pal)[767]);
01062 ddsd.ddckCKSrcBlt.dwColorSpaceHighValue =((((U8 *)pal)[765])<<16)
01063 |((((U8 *)pal)[766])<<8)
01064 |(((U8 *)pal)[767]);
01065
01066
01067 ddrval =lpDD4->lpVtbl->CreateSurface(lpDD4, &ddsd, &lpDDS, NULL);
01068
01069 if(ddrval != DD_OK)
01070 {
01071 return NULL;
01072 }
01073
01074 memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
01075 ddsd.dwSize =sizeof(DDSURFACEDESC2);
01076 ddrval =lpDDS->lpVtbl->Lock(lpDDS, NULL, &ddsd, DDLOCK_WAIT, NULL);
01077
01078 if(ddrval != DD_OK)
01079 {
01080 lpDDS->lpVtbl->Release(lpDDS);
01081 return NULL;
01082 }
01083
01084 for(i=0;i < (S32)(dwHeight * dwWidth);i++)
01085 {
01086 ((U32 *)ddsd.lpSurface)[i] =(((U8 *)pal)[(((U8 *)pixels)[i]) * 3])<<16
01087 |((((U8 *)pal)[((((U8 *)pixels)[i]) * 3)+1])<<8)
01088 |((((U8 *)pal)[((((U8 *)pixels)[i]) * 3)+2])<<0);
01089 }
01090
01091 lpDDS->lpVtbl->Unlock(lpDDS, NULL);
01092
01093 return lpDDS;
01094 }
|
|
||||||||||||
|
Definition at line 795 of file dmodes.c. References bInitDone, ddrawinst, ErrorPrintf(), FALSE, lpDD, lpDD4, LPDIRECTDRAWCREATE, mhWnd, MyErrorToString(), NULL, NumDecalsQd, SetDDrawWindow(), and TRUE. Referenced by DrvInit().
00796 {
00797 LPDIRECTDRAWCREATE lpDDCreate;
00798 HRESULT ddrval;
00799
00800 bInitDone =FALSE;
00801 ddrawinst =LoadLibrary("ddraw.dll");
00802
00803 if(!ddrawinst)
00804 {
00805 return FALSE;
00806 }
00807 SetDDrawWindow(hwnd);
00808
00809 lpDDCreate =(LPDIRECTDRAWCREATE)GetProcAddress(ddrawinst, "DirectDrawCreate");
00810 if(lpDDCreate)
00811 {
00812 ddrval =lpDDCreate(NULL, &lpDD, NULL);
00813 }
00814 else
00815 {
00816 return DDENUMRET_CANCEL;
00817 }
00818
00819 if(ddrval!=DD_OK)
00820 {
00821 ErrorPrintf("Non Fatal Error During DirectDrawCreate() in DoDDrawInit()\n%s\n", MyErrorToString(ddrval));
00822 return FALSE;
00823 }
00824
00825 ddrval = lpDD->lpVtbl->QueryInterface(lpDD, &IID_IDirectDraw4, (LPVOID *)&lpDD4);
00826 if(ddrval!=DD_OK)
00827 {
00828 ErrorPrintf("Non Fatal Error During QueryInterface() in DoDDrawInit()\n%s\n", MyErrorToString(ddrval));
00829 return FALSE;
00830 }
00831
00832 lpDD->lpVtbl->Release(lpDD);
00833 lpDD =NULL;
00834
00835 ddrval =lpDD4->lpVtbl->SetCooperativeLevel(lpDD4, mhWnd,
00836 DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
00837 if(ddrval!=DD_OK)
00838 {
00839 ErrorPrintf("Non Fatal Error During SetCooperativeLevel() in DoDDrawInit()\n%s\n", MyErrorToString(ddrval));
00840 return FALSE;
00841 }
00842 FreeLibrary(ddrawinst);
00843
00844 bInitDone =TRUE;
00845 NumDecalsQd =0;
00846 return TRUE;
00847 }
|
|
|
Definition at line 850 of file dmodes.c. References bInitDone, ddrawinst, VidEnumInfoTag::DeviceGuid, VidEnumInfoTag::DeviceInfo, VidEnumInfoTag::DeviceInfoHost, ErrorPrintf(), FALSE, LPDIRECTDRAWCREATE, MyErrorToString(), NULL, NumDevices, and TRUE. Referenced by DrvInit().
00851 {
00852 LPDIRECTDRAWCREATE lpDDCreate;
00853 LPDIRECTDRAW pDD;
00854 LPDIRECTDRAW4 pDD4 =NULL;
00855 HRESULT hRet;
00856 bInitDone =FALSE;
00857
00858
00859 ddrawinst =LoadLibrary("ddraw.dll");
00860
00861 if(!ddrawinst)
00862 {
00863 return FALSE;
00864 }
00865
00866 lpDDCreate =(LPDIRECTDRAWCREATE)GetProcAddress(ddrawinst, "DirectDrawCreate");
00867 if(lpDDCreate)
00868 {
00869 hRet =lpDDCreate(NULL, &pDD, NULL);
00870 }
00871 else
00872 {
00873 return DDENUMRET_CANCEL;
00874 }
00875
00876 vinfo->DeviceGuid =NULL;
00877
00878 if(hRet != DD_OK)
00879 {
00880 ErrorPrintf("Non Fatal Error During DirectDrawCreate() in DoEnumeration()\n%s\n", MyErrorToString(hRet));
00881 return DDENUMRET_CANCEL;
00882 }
00883 memset(&vinfo->DeviceInfo, 0, sizeof(vinfo->DeviceInfo));
00884 memset(&vinfo->DeviceInfoHost, 0, sizeof(vinfo->DeviceInfo));
00885
00886 hRet =pDD->lpVtbl->QueryInterface(pDD, &IID_IDirectDraw4, (LPVOID *)&pDD4);
00887 if(hRet != DD_OK)
00888 {
00889 ErrorPrintf("Non Fatal Error During QueryInterface() in DoEnumeration()\n%s\n", MyErrorToString(hRet));
00890 return DDENUMRET_CANCEL;
00891 }
00892
00893 hRet =pDD4->lpVtbl->GetDeviceIdentifier(pDD4, &vinfo->DeviceInfo,0);
00894 hRet =pDD4->lpVtbl->GetDeviceIdentifier(pDD4, &vinfo->DeviceInfoHost, DDGDI_GETHOSTIDENTIFIER);
00895
00896 if(pDD4)
00897 {
00898 pDD4->lpVtbl->Release(pDD4);
00899 }
00900
00901 FreeLibrary(ddrawinst);
00902
00903 if(NumDevices < 16)
00904 {
00905 NumDevices++;
00906 }
00907 else
00908 {
00909 return DDENUMRET_CANCEL;
00910 }
00911 return DDENUMRET_OK;
00912
00913 return TRUE;
00914 }
|
|
|
Definition at line 916 of file dmodes.c. References bDMA, bDMAPageLock, bHardBlt, bInitDone, ddrawinst, ErrorPrintf(), FALSE, lpDD, lpDD4, LPDIRECTDRAWCREATE, ModeCallback(), MyErrorToString(), NULL, and TRUE. Referenced by DrvInit(), and EnumModes().
00917 {
00918 LPDIRECTDRAWCREATE lpDDCreate;
00919 HRESULT ddrval;
00920 DDCAPS ddcaps;
00921
00922 bInitDone =FALSE;
00923
00924 ddrawinst =LoadLibrary("ddraw.dll");
00925
00926 if(!ddrawinst)
00927 {
00928 return FALSE;
00929 }
00930
00931 lpDDCreate =(LPDIRECTDRAWCREATE)GetProcAddress(ddrawinst, "DirectDrawCreate");
00932 if(lpDDCreate)
00933 {
00934 ddrval =lpDDCreate(NULL, &lpDD, NULL);
00935 }
00936 else
00937 {
00938 return DDENUMRET_CANCEL;
00939 }
00940
00941 if(ddrval != DD_OK)
00942 {
00943 ErrorPrintf("DirectDrawCreate FAILED : DoModeEnumeration\n%s\n", MyErrorToString(ddrval));
00944 return 0;
00945 }
00946
00947 ddrval = lpDD->lpVtbl->QueryInterface(lpDD, &IID_IDirectDraw4, (LPVOID *)&lpDD4);
00948 if(ddrval != DD_OK)
00949 {
00950 ErrorPrintf("QueryInterface FAILED : DoModeEnumeration\n%s\n", MyErrorToString(ddrval));
00951 return 0;
00952 }
00953
00954 lpDD->lpVtbl->Release(lpDD);
00955 lpDD =NULL;
00956
00957 //test for general dma support
00958 memset(&ddcaps, 0, sizeof(DDCAPS));
00959 ddcaps.dwSize =sizeof(ddcaps);
00960 lpDD4->lpVtbl->GetCaps(lpDD4, &ddcaps, NULL);
00961
00962 if(ddcaps.dwCaps & DDCAPS_CANBLTSYSMEM)
00963 {
00964 ErrorPrintf("System to video blits supported\n");
00965 if(ddcaps.dwVSBCaps & DDCAPS_BLTQUEUE)
00966 {
00967 ErrorPrintf("DMA Asynch Video to System blits supported\n");
00968 }
00969 if(ddcaps.dwSSBCaps & DDCAPS_BLTQUEUE)
00970 {
00971 ErrorPrintf("DMA Asynch System to System blits supported\n");
00972 }
00973 if(ddcaps.dwSVBCaps & DDCAPS_BLTQUEUE)
00974 {
00975 bDMA =TRUE;
00976
00977 ErrorPrintf("DMA Asynch System to Video blits supported\n");
00978 if(ddcaps.dwCaps & DDCAPS2_NOPAGELOCKREQUIRED)
00979 {
00980 ErrorPrintf("DMA Asynch page lock not required\n");
00981 }
00982 else
00983 {
00984 bDMAPageLock =TRUE;
00985 ErrorPrintf("DMA Asynch page lock required\n");
00986 }
00987 }
00988 }
00989 if(ddcaps.dwCaps2 & DDCAPS_BLT)
00990 {
00991 ErrorPrintf("Hardware Blt supported\n");
00992 bHardBlt =TRUE;
00993 }
00994
00995 //commented code below used for heavy mode testing
00996 // ddrval =lpDD4->lpVtbl->SetCooperativeLevel(lpDD4, ActiveWnd,
00997 // DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
00998 // if(ddrval != DD_OK)
00999 // {
01000 // return 0;
01001 // }
01002 lpDD4->lpVtbl->EnumDisplayModes(lpDD4, 0, NULL, (LPVOID)vinfo, ModeCallback);
01003
01004 // SortDDrawVideoModeList(vinfo);
01005
01006 lpDD4->lpVtbl->Release(lpDD4);
01007 lpDD4 =NULL;
01008
01009 FreeLibrary(ddrawinst);
01010
01011 return TRUE;
01012 }
|
|
|
Definition at line 186 of file GlideDrv.c. References bActive, bInitDone, DRIVERCC, ErrorPrintf(), GE_TRUE, geBoolean, lpDDSPrimary, mhWnd, and RestoreAll().
00187 {
00188 return GE_TRUE;
00189 }
|
|
|
Definition at line 146 of file dmodes.c. References VidEnumInfoTag::CurrentVidMode, ddrawinst, FLIP, lpDD4, lpDDSBack, lpDDSPrimary, NULL, and VidEnumInfoTag::VidModes. Referenced by DrvShutdown().
00147 {
00148 int x =0;
00149
00150 if(lpDD4)
00151 {
00152 if(vinfo->VidModes[vinfo->CurrentVidMode].current & FLIP)
00153 {
00154 lpDDSBack =NULL;
00155 }
00156 else
00157 {
00158 if(lpDDSBack)
00159 {
00160 lpDDSBack->lpVtbl->Release(lpDDSBack);
00161 lpDDSBack =NULL;
00162 }
00163 }
00164 if(lpDDSPrimary)
00165 {
00166 lpDDSPrimary->lpVtbl->Release(lpDDSPrimary);
00167 lpDDSPrimary =NULL;
00168 }
00169 lpDD4->lpVtbl->Release(lpDD4);
00170 lpDD4 =NULL;
00171 }
00172 FreeLibrary(ddrawinst);
00173 }
|
|
|
Definition at line 1014 of file dmodes.c. References DRV_Window::B_mask, DRV_Window::B_shift, DRV_Window::B_width, DRV_Window::BytesPerPixel, DRV_Window::G_mask, DRV_Window::G_shift, DRV_Window::G_width, lpDDSPrimary, DRV_Window::R_mask, DRV_Window::R_shift, DRV_Window::R_width, and U32. Referenced by SysInit().
01015 {
01016 DDPIXELFORMAT ddpf;
01017 U32 i, j;
01018
01019 ddpf.dwSize =sizeof(ddpf);
01020 lpDDSPrimary->lpVtbl->GetPixelFormat(lpDDSPrimary, &ddpf);
01021
01022 if(!(ddpf.dwFlags & DDPF_RGB))
01023 {
01024 return;
01025 }
01026 cwnd->BytesPerPixel =ddpf.dwRGBBitCount / 8;
01027 cwnd->R_mask =ddpf.dwRBitMask;
01028 cwnd->G_mask =ddpf.dwGBitMask;
01029 cwnd->B_mask =ddpf.dwBBitMask;
01030
01031 for(j=0,i=ddpf.dwRBitMask;!(i & 1);i>>=1,j++);
01032 cwnd->R_shift =j;
01033
01034 for(j=0,i=ddpf.dwGBitMask;!(i & 1);i>>=1,j++);
01035 cwnd->G_shift =j;
01036
01037 for(j=0,i=ddpf.dwBBitMask;!(i & 1);i>>=1,j++);
01038 cwnd->B_shift =j;
01039
01040 for(i=(ddpf.dwRBitMask>>cwnd->R_shift),cwnd->R_width=0;i;i >>= 1, cwnd->R_width++);
01041 for(i=(ddpf.dwGBitMask>>cwnd->G_shift),cwnd->G_width=0;i;i >>= 1, cwnd->G_width++);
01042 for(i=(ddpf.dwBBitMask>>cwnd->B_shift),cwnd->B_width=0;i;i >>= 1, cwnd->B_width++);
01043 }
|
|
||||||||||||
|
Definition at line 206 of file dmodes.c.
00207 {
00208 HRESULT ddrval;
00209 DDSURFACEDESC2 ddsd;
00210
00211 if(!bActive)
00212 return TRUE;
00213
00214 memset(&ddsd, 0, sizeof(DDSCAPS2));
00215 ddsd.dwSize =sizeof(ddsd);
00216 ddsd.dwFlags=DDSD_HEIGHT | DDSD_WIDTH;
00217
00218 lpDDSBack->lpVtbl->GetSurfaceDesc(lpDDSBack, &ddsd);
00219 if(((int)ddsd.dwWidth < wrect->right) || ((int)ddsd.dwHeight < wrect->bottom))
00220 {
00221 ErrorPrintf("ERROR: World render rect passed by the engine is larger than the drawing surface.\n");
00222 ErrorPrintf("WorldRect: %d, %d, %d, %d\n", wrect->left, wrect->top, wrect->right, wrect->bottom);
00223 ErrorPrintf("Surface: %d, %d\n", ddsd.dwWidth, ddsd.dwHeight);
00224 return FALSE;
00225 }
00226
00227 while(1)
00228 {
00229 ddrval =lpDDSBack->lpVtbl->Lock(lpDDSBack, wrect, &ddsd, DDLOCK_SURFACEMEMORYPTR, NULL);
00230 if(ddrval==DD_OK)
00231 {
00232 break;
00233 }
00234
00235 if(ddrval==DDERR_SURFACELOST)
00236 {
00237 ddrval =RestoreAll();
00238 if(ddrval!=DD_OK )
00239 {
00240 ErrorPrintf("Error During Lock() in LockDDrawBackBuffer()...\n");
00241 ErrorPrintf("DirectDraw Surfaces were lost and could not be restored : %s\n", MyErrorToString(ddrval));
00242 return FALSE;
00243 }
00244 }
00245 else if(ddrval!=DDERR_WASSTILLDRAWING)
00246 {
00247 ErrorPrintf("Error During Lock() in LockDDrawBackBuffer() : %s\n", MyErrorToString(ddrval));
00248 return FALSE;
00249 }
00250 SleepEx(5, FALSE);
00251 }
00252 cwnd->Buffer =(U8 *)ddsd.lpSurface;
00253 cwnd->PixelPitch=ddsd.lPitch;
00254 bBackLocked =TRUE;
00255 return TRUE;
00256 }
|
|
||||||||||||||||||||
|
Definition at line 292 of file dmodes.c. References bActive, tagRECT::bottom, cmode, VidModeListTag::current, ErrorPrintf(), FALSE, FASTBLT, FLIP, tagRECT::left, lpDDSBack, lpDDSPrimary, MyErrorToString(), NULL, RestoreAll(), tagRECT::right, STRETCHMODE, tagRECT::top, TRUE, and VIDEO. Referenced by EndScene().
00293 {
00294 HRESULT ddrval;
00295 DDSURFACEDESC2 ddsd;
00296 // int i;
00297 RECT rDest, rSrc;
00298
00299 if(!bActive)
00300 {
00301 return TRUE;
00302 }
00303
00304 memset(&ddsd, 0, sizeof(DDSCAPS2));
00305 ddsd.dwSize =sizeof(ddsd);
00306 ddsd.dwFlags=DDSD_HEIGHT | DDSD_WIDTH;
00307
00308 lpDDSBack->lpVtbl->GetSurfaceDesc(lpDDSBack, &ddsd);
00309 rDest.left =rDest.top =0;
00310 rDest.right =ddsd.dwWidth-1;
00311 rDest.bottom=ddsd.dwHeight-1;
00312
00313 memset(&ddsd, 0, sizeof(DDSCAPS2));
00314 ddsd.dwSize =sizeof(ddsd);
00315 ddsd.dwFlags=DDSD_HEIGHT | DDSD_WIDTH;
00316
00317 lpDDSPrimary->lpVtbl->GetSurfaceDesc(lpDDSPrimary, &ddsd);
00318 rSrc.left =rSrc.top =0;
00319 rSrc.right =ddsd.dwWidth-1;
00320 rSrc.bottom =ddsd.dwHeight-1;
00321
00322 ddrval =DD_OK;
00323 if((cmode->current & VIDEO) && (cmode->current & FASTBLT))
00324 {
00325 while(1)
00326 {
00327 ddrval =lpDDSPrimary->lpVtbl->BltFast(lpDDSPrimary, 0, 0, lpDDSBack, NULL, 0);
00328 if(ddrval==DD_OK)
00329 {
00330 break;
00331 }
00332
00333 if(ddrval==DDERR_SURFACELOST)
00334 {
00335 ddrval =RestoreAll();
00336 if(ddrval!=DD_OK)
00337 {
00338 ErrorPrintf("Error During BltFast() in RefreshDDraw()...\n");
00339 ErrorPrintf("DirectDraw Surfaces were lost and could not be restored : %s\n", MyErrorToString(ddrval));
00340 return FALSE;
00341 }
00342 }
00343 else if(ddrval!=DDERR_WASSTILLDRAWING)
00344 {
00345 ErrorPrintf("Error During BltFast() in RefreshDDraw() : %s\n", MyErrorToString(ddrval));
00346 return FALSE;
00347 }
00348 SleepEx(5, FALSE);
00349 }
00350 }
00351 else if(cmode->current & FLIP)
00352 {
00353 while(1)
00354 {
00355 ddrval =lpDDSPrimary->lpVtbl->Flip(lpDDSPrimary, lpDDSBack, DDFLIP_NOVSYNC);
00356 if(ddrval==DD_OK)
00357 {
00358 break;
00359 }
00360
00361 if(ddrval==DDERR_SURFACELOST)
00362 {
00363 ddrval =RestoreAll();
00364 if(ddrval!=DD_OK)
00365 {
00366 ErrorPrintf("Error During Flip() in RefreshDDraw()...\n");
00367 ErrorPrintf("DirectDraw Surfaces were lost and could not be restored : %s\n", MyErrorToString(ddrval));
00368 return FALSE;
00369 }
00370 }
00371 else if(ddrval!=DDERR_WASSTILLDRAWING)
00372 {
00373 ErrorPrintf("Error During Flip() in RefreshDDraw() : %s\n", MyErrorToString(ddrval));
00374 return FALSE;
00375 }
00376 SleepEx(5, FALSE);
00377 }
00378 }
00379 else //safe blt
00380 {
00381 if(cmode->current & STRETCHMODE)
00382 {
00383 while(1)
00384 {
00385 ddrval =lpDDSPrimary->lpVtbl->Blt(lpDDSPrimary, NULL, lpDDSBack, NULL, 0, NULL);
00386 if(ddrval==DD_OK)
00387 break;
00388
00389 if(ddrval==DDERR_SURFACELOST)
00390 {
00391 ddrval =RestoreAll();
00392 if(ddrval!=DD_OK)
00393 {
00394 ErrorPrintf("Error During StretchMode Blt() in RefreshDDraw()...\n");
00395 ErrorPrintf("DirectDraw Surfaces were lost and could not be restored : %s\n", MyErrorToString(ddrval));
00396 return FALSE;
00397 }
00398 }
00399 else if(ddrval!=DDERR_WASSTILLDRAWING)
00400 {
00401 ErrorPrintf("Error During StretchMode Blt() in RefreshDDraw() : %s\n", MyErrorToString(ddrval));
00402 return FALSE;
00403 }
00404 SleepEx(5, FALSE);
00405 }
00406 }
00407 else
00408 {
00409 while(1)
00410 {
00411 ddrval =lpDDSPrimary->lpVtbl->Blt(lpDDSPrimary, NULL, lpDDSBack, NULL, 0, NULL);
00412 if(ddrval==DD_OK)
00413 break;
00414
00415 if(ddrval==DDERR_SURFACELOST)
00416 {
00417 ddrval =RestoreAll();
00418 if(ddrval!=DD_OK)
00419 {
00420 ErrorPrintf("Error During Blt() in RefreshDDraw()...\n");
00421 ErrorPrintf("DirectDraw Surfaces were lost and could not be restored : %s\n", MyErrorToString(ddrval));
00422 return FALSE;
00423 }
00424 }
00425 else if(ddrval!=DDERR_WASSTILLDRAWING)
00426 {
00427 ErrorPrintf("Error During Blt() in RefreshDDraw() : %s\n", MyErrorToString(ddrval));
00428 return FALSE;
00429 }
00430 SleepEx(5, FALSE);
00431 }
00432 }
00433 }
00434 /* for(i=0;i < NumDecalsQd;i++)
00435 {
00436 if(DecalQ[i].srect.left == -1)
00437 {
00438 DDrawBlitDecalToFront(DecalQ[i].surf, NULL, DecalQ[i].x, DecalQ[i].y);
00439 }
00440 else
00441 {
00442 DDrawBlitDecalToFront(DecalQ[i].surf, &DecalQ[i].srect, DecalQ[i].x, DecalQ[i].y);
00443 }
00444 }
00445 NumDecalsQd =0;*/
00446 return TRUE;
00447 }
|
|
||||||||||||
|
Definition at line 453 of file dmodes.c. References VidModeListTag::bpp, VidModeListTag::current, CurrentModeDepth, CurrentModeHeight, CurrentModeWidth, FASTBLT, VidModeListTag::flags, FLIP, GE_FALSE, GE_TRUE, geBoolean, VidModeListTag::height, lpDD4, lpDDSBack, lpDDSPrimary, MODEXMODE, NULL, VidModeListTag::pitch, SAFEBLT, STRETCHMODE, SYSTEM, VIDEO, VidEnumInfoTag::VidModes, and VidModeListTag::width. Referenced by DrvInit().
00454 {
00455 HRESULT ddrval;
00456 DDSURFACEDESC2 ddsd;
00457 DDSCAPS2 ddscaps;
00458
00459 if(vinfo->VidModes[top].flags & STRETCHMODE)
00460 {
00461 if((vinfo->VidModes[top].width > 640)
00462 ||((vinfo->VidModes[top].width == 640)
00463 &&(vinfo->VidModes[top].height > 480)))
00464 {
00465 ddrval =lpDD4->lpVtbl->SetDisplayMode(lpDD4, vinfo->VidModes[top].width, vinfo->VidModes[top].height, vinfo->VidModes[top].bpp, 0, 0);
00466 }
00467 else
00468 {
00469 ddrval =lpDD4->lpVtbl->SetDisplayMode(lpDD4, 640, 480, vinfo->VidModes[top].bpp, 0, 0);
00470 }
00471 vinfo->VidModes[top].current |=STRETCHMODE;
00472 }
00473 else
00474 {
00475 ddrval =lpDD4->lpVtbl->SetDisplayMode(lpDD4, vinfo->VidModes[top].width, vinfo->VidModes[top].height, vinfo->VidModes[top].bpp, 0, 0);
00476 }
00477 if(ddrval != DD_OK)
00478 {
00479 return GE_FALSE;
00480 }
00481 CurrentModeHeight =vinfo->VidModes[top].height;
00482 CurrentModeWidth =vinfo->VidModes[top].width;
00483 CurrentModeDepth =vinfo->VidModes[top].bpp;
00484
00485 if(!(vinfo->VidModes[top].flags & MODEXMODE))
00486 {
00487 memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
00488 ddsd.dwSize =sizeof(ddsd);
00489 ddsd.dwFlags =DDSD_CAPS;
00490 ddsd.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY;
00491
00492 ddrval =lpDD4->lpVtbl->CreateSurface(lpDD4, &ddsd, &lpDDSPrimary, NULL);
00493 if(ddrval==DD_OK)
00494 {
00495 memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
00496 ddsd.dwSize =sizeof(ddsd);
00497 ddsd.dwFlags =DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
00498 ddsd.ddsCaps.dwCaps =DDSCAPS_SYSTEMMEMORY;
00499 if(vinfo->VidModes[top].flags & STRETCHMODE)
00500 {
00501 if((vinfo->VidModes[top].width > 640)
00502 ||((vinfo->VidModes[top].width == 640)
00503 &&(vinfo->VidModes[top].height > 480)))
00504 {
00505 ddsd.dwHeight =640;
00506 ddsd.dwWidth =480;
00507 }
00508 else
00509 {
00510 ddsd.dwHeight =vinfo->VidModes[top].height;
00511 ddsd.dwWidth =vinfo->VidModes[top].width;
00512 }
00513 }
00514 else
00515 {
00516 ddsd.dwHeight =vinfo->VidModes[top].height;
00517 ddsd.dwWidth =vinfo->VidModes[top].width;
00518 }
00519
00520 ddrval =lpDD4->lpVtbl->CreateSurface(lpDD4, &ddsd, &lpDDSBack, NULL);
00521 if(ddrval==DD_OK)
00522 {
00523 //need to grab pitch here since it can change
00524 //depending on where the surface is created
00525 memset(&ddsd, 0, sizeof(DDSCAPS2));
00526 ddsd.dwSize =sizeof(ddsd);
00527 ddsd.dwFlags=DDSD_HEIGHT | DDSD_WIDTH;
00528 lpDDSBack->lpVtbl->GetSurfaceDesc(lpDDSBack, &ddsd);
00529 vinfo->VidModes[top].pitch =ddsd.lPitch;
00530
00531 //both were created, make sure they are in vidram
00532 memset(&ddscaps, 0, sizeof(DDSCAPS2));
00533 lpDDSPrimary->lpVtbl->GetCaps(lpDDSPrimary, &ddscaps);
00534 if(ddscaps.dwCaps & DDSCAPS_VIDEOMEMORY)
00535 {
00536 memset(&ddscaps, 0, sizeof(DDSCAPS2));
00537 lpDDSBack->lpVtbl->GetCaps(lpDDSBack, &ddscaps);
00538 if(ddscaps.dwCaps & DDSCAPS_VIDEOMEMORY)
00539 {
00540 //both are good to go
00541 vinfo->VidModes[top].current |=VIDEO;
00542
00543 //mark fastblt unless it's stretching
00544 if(!(vinfo->VidModes[top].flags & STRETCHMODE))
00545 {
00546 vinfo->VidModes[top].current |=FASTBLT;
00547 }
00548 }
00549 }
00550 }
00551 }
00552 else if(!(vinfo->VidModes[top].current & VIDEO)
00553 && !(vinfo->VidModes[top].current & STRETCHMODE))
00554 {
00555 if(lpDDSBack) lpDDSBack->lpVtbl->Release(lpDDSBack);
00556 if(lpDDSPrimary) lpDDSPrimary->lpVtbl->Release(lpDDSPrimary);
00557
00558 memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
00559 ddsd.dwSize =sizeof(ddsd);
00560 ddsd.dwFlags =DDSD_CAPS;
00561 ddsd.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE;
00562
00563 ddrval =lpDD4->lpVtbl->CreateSurface(lpDD4, &ddsd, &lpDDSPrimary, NULL);
00564 if(ddrval==DD_OK)
00565 {
00566 memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
00567 ddsd.dwSize =sizeof(ddsd);
00568 ddsd.dwFlags =DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
00569 ddsd.dwHeight =vinfo->VidModes[top].height;
00570 ddsd.dwWidth =vinfo->VidModes[top].width;
00571
00572 ddrval =lpDD4->lpVtbl->CreateSurface(lpDD4, &ddsd, &lpDDSBack, NULL);
00573 if(ddrval==DD_OK)
00574 {
00575 //need to grab pitch here since it can change
00576 //depending on where the surface is created
00577 memset(&ddsd, 0, sizeof(DDSCAPS2));
00578 ddsd.dwSize =sizeof(ddsd);
00579 ddsd.dwFlags=DDSD_HEIGHT | DDSD_WIDTH;
00580 lpDDSBack->lpVtbl->GetSurfaceDesc(lpDDSBack, &ddsd);
00581 vinfo->VidModes[top].pitch =ddsd.lPitch;
00582
00583 //both were created good enough
00584 vinfo->VidModes[top].current |=SYSTEM|SAFEBLT;
00585 }
00586 }
00587 }
00588 } //flip
00589 if((vinfo->VidModes[top].flags & MODEXMODE) || lpDDSBack==NULL)
00590 {
00591 if(lpDDSBack) lpDDSBack->lpVtbl->Release(lpDDSBack);
00592 if(lpDDSPrimary) lpDDSPrimary->lpVtbl->Release(lpDDSPrimary);
00593
00594 //try flip
00595 memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
00596 ddsd.dwSize =sizeof(ddsd);
00597 ddsd.dwFlags =DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
00598 ddsd.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE |
00599 DDSCAPS_COMPLEX | DDSCAPS_FLIP;
00600 ddsd.dwBackBufferCount =1;
00601
00602 ddrval =lpDD4->lpVtbl->CreateSurface(lpDD4, &ddsd, &lpDDSPrimary, NULL);
00603 if(ddrval==DD_OK)
00604 {
00605 memset(&ddscaps, 0, sizeof(DDSCAPS2));
00606 ddscaps.dwCaps =DDSCAPS_BACKBUFFER;
00607 ddrval =lpDDSPrimary->lpVtbl->GetAttachedSurface(lpDDSPrimary, &ddscaps, &lpDDSBack);
00608 if(ddrval==DD_OK)
00609 {
00610 //need to grab pitch here since it can change
00611 //depending on where the surface is created
00612 memset(&ddsd, 0, sizeof(DDSCAPS2));
00613 ddsd.dwSize =sizeof(ddsd);
00614 ddsd.dwFlags=DDSD_HEIGHT | DDSD_WIDTH;
00615 lpDDSBack->lpVtbl->GetSurfaceDesc(lpDDSBack, &ddsd);
00616 vinfo->VidModes[top].pitch =ddsd.lPitch;
00617
00618 vinfo->VidModes[top].current |=SYSTEM|FLIP;
00619 }
00620 }
00621 }
00622
00623 return GE_TRUE;
00624 }
|
|
|
Definition at line 201 of file dmodes.c. References mhWnd. Referenced by DoDDrawInit().
00202 {
00203 mhWnd =hwnd;
00204 }
|
|
||||||||||||
|
Definition at line 258 of file dmodes.c. References bActive, bBackLocked, ErrorPrintf(), FALSE, lpDDSBack, MyErrorToString(), NULL, RestoreAll(), and TRUE. Referenced by EndScene().
00259 {
00260 HRESULT ddrval =DD_OK;
00261
00262 if(!bActive)
00263 return TRUE;
00264
00265 while(1)
00266 {
00267 ddrval =lpDDSBack->lpVtbl->Unlock(lpDDSBack, NULL);
00268 if(ddrval==DD_OK)
00269 break;
00270
00271 if(ddrval==DDERR_SURFACELOST)
00272 {
00273 ddrval =RestoreAll();
00274 if(ddrval!=DD_OK )
00275 {
00276 ErrorPrintf("Error During Unlock() in UnlockDDrawBackBuffer()...\n");
00277 ErrorPrintf("DirectDraw Surfaces were lost and could not be restored : %s\n", MyErrorToString(ddrval));
00278 return FALSE;
00279 }
00280 }
00281 else if(ddrval!=DDERR_WASSTILLDRAWING)
00282 {
00283 ErrorPrintf("Error During Unlock() in UnlockDDrawBackBuffer() : %s\n", MyErrorToString(ddrval));
00284 return FALSE;
00285 }
00286 SleepEx(5, FALSE);
00287 }
00288 bBackLocked =FALSE;
00289 return TRUE;
00290 }
|
|
|
Definition at line 42 of file dmodes.h. Referenced by ClearBackBuffer(), DrawDecal(), DrvSetActive(), geEngine_Activate(), LockDDrawBackBuffer(), RefreshDDraw(), RenderGouraudPoly(), RenderMiscTexturePoly(), RenderWorldPoly(), and UnlockDDrawBackBuffer(). |
|
|
|
|
|
Definition at line 42 of file dmodes.h. Referenced by BeginScene(), DrvInit(), DrvShutdown(), EndScene(), and SysInit(). |
1.3.2