void DirectDrawDisplay::cleanup() { if(pDirectDraw != NULL) { if(ddsClipper != NULL) { ddsClipper->Release(); ddsClipper = NULL; } if(ddsFlip != NULL) { ddsFlip->Release(); ddsFlip = NULL; } if(ddsOffscreen != NULL) { ddsOffscreen->Release(); ddsOffscreen = NULL; } if(ddsPrimary != NULL) { ddsPrimary->Release(); ddsPrimary = NULL; } pDirectDraw->Release(); pDirectDraw = NULL; } if(ddrawDLL != NULL) { AfxFreeLibrary(ddrawDLL); ddrawDLL = NULL; } width = 0; height = 0; }
int DD_Shutdown(void) { // this function release all the resources directdraw // allocated, mainly to com objects // release the clipper first if (lpddclipper) lpddclipper->Release(); // release the palette if (lpddpal) lpddpal->Release(); // release the secondary surface if (lpddsback) lpddsback->Release(); // release the primary surface if (lpddsprimary) lpddsprimary->Release(); // finally, the main dd object if (lpdd) lpdd->Release(); // return success return(1); } // end DD_Shutdown
int Game_Shutdown(void *parms = NULL, int num_parms = 0) { // this is called after the game is exited and the main event // loop while is exited, do all you cleanup and shutdown here // kill all the surfaces // first the palette if (lpddpal) { lpddpal->Release(); lpddpal = NULL; } // end if // now the primary surface if (lpddsprimary) { lpddsprimary->Release(); lpddsprimary = NULL; } // end if // now blow away the IDirectDraw4 interface if (lpdd) { lpdd->Release(); lpdd = NULL; } // end if // return success or failure or your own return code here return(1); } // end Game_Shutdown
BOOL WINAPI DDEnumCallback( GUID *pGUID, LPSTR pDescription, LPSTR strName, LPVOID pContext ) { LPDIRECTDRAW7 pDD = NULL; HRESULT hr; if( FAILED( hr = DirectDrawCreateEx( pGUID, (VOID**)&pDD, IID_IDirectDraw7, NULL ) ) ) return DDENUMRET_CANCEL; pDD->GetDeviceIdentifier( &DeviceInfo[g_iMaxDevices], 0 ); if(pDD) { pDD->Release(); pDD = NULL; } if( g_iMaxDevices < MAX_DEVICES ) g_iMaxDevices++; else return DDENUMRET_CANCEL; return DDENUMRET_OK; }
/* * Helpers. */ static LPDIRECTDRAW7 getDDRAW (void) { LPDIRECTDRAW7 pDDRAW = NULL; LPDIRECTDRAW iface = NULL; HRESULT rc = DirectDrawCreate (NULL, &iface, NULL); if (rc != DD_OK) { LOGDDRAW(("DDRAW: Could not create DirectDraw interface rc= 0x%08X\n", rc)); } else { rc = iface->QueryInterface (IID_IDirectDraw7, (void**)&pDDRAW); if (rc != DD_OK) { LOGDDRAW(("DDRAW: Could not query DirectDraw 7 interface rc = 0x%08X\n", rc)); } else { rc = pDDRAW->SetCooperativeLevel (NULL, DDSCL_NORMAL); if (rc != DD_OK) { LOGDDRAW(("DDRAW: Could not set the DirectDraw cooperative level rc = 0x%08X\n", rc)); pDDRAW->Release (); } } iface->Release(); } return rc == DD_OK? pDDRAW: NULL; }
//----------------------------------------------------------------------------- // Name: ShutDown() // Desc: cleans up evreything. releases mem used //----------------------------------------------------------------------------- int ShutDown() { // now release the primary surface if (lpddsPrimary!=NULL) lpddsPrimary->Release(); // release the directdraw object if (lpddObj!=NULL) lpddObj->Release(); return(1); }
void CleanUp() { g_surfCar.Destroy(); if(g_pDDSBack) g_pDDSBack->Release(); if(g_pDDSFront) g_pDDSFront->Release(); if(g_pDD) g_pDD->Release(); }
int Game_Shutdown(void *parms = NULL, int num_parms = 0) { // this is called after the game is exited and the main event // loop while is exited, do all you cleanup and shutdown here // first the palette if (lpddpal) { lpddpal->Release(); lpddpal = NULL; } // end if // now the lpddsbackground surface if (lpddsbackground) { lpddsbackground->Release(); lpddsbackground = NULL; } // end if // now the lpddsback surface if (lpddsback) { lpddsback->Release(); lpddsback = NULL; } // end if // now the primary surface if (lpddsprimary) { lpddsprimary->Release(); lpddsprimary = NULL; } // end if // now blow away the IDirectDraw4 interface if (lpdd) { lpdd->Release(); lpdd = NULL; } // end if // unload the bitmap file, we no longer need it Unload_Bitmap_File(&bitmap); // return success or failure or your own return code here return(1); } // end Game_Shutdown
int Game_Shutdown(void *parms = NULL, int num_parms = 0) { // this is called after the game is exited and the main event // loop while is exited, do all you cleanup and shutdown here // simply blow away the IDirectDraw4 interface if (lpdd) { lpdd->Release(); lpdd = NULL; } // end if // return success or failure or your own return code here return(1); } // end Game_Shutdown
void DDEnd(void) { if (m_pDD) { if (m_pddsFrontBuffer != NULL) { if (m_pddsFrame) m_pddsFrame->Release(); m_pddsFrame = NULL; if (pcClipper) pcClipper->Release(); pcClipper = NULL; if (m_pddsFrontBuffer) m_pddsFrontBuffer->Release(); m_pddsFrontBuffer = NULL; } m_pDD->Release(); m_pDD = NULL; } }
/** * vdraw_ddraw_free_all(): Free all DirectDraw objects. * @param scl If true, sets the cooperative level of lpDD before freeing it. */ static void WINAPI vdraw_ddraw_free_all(bool scl) { if (lpDDC_Clipper) { lpDDC_Clipper->Release(); lpDDC_Clipper = NULL; } if (lpDDS_Back) { lpDDS_Back->Release(); lpDDS_Back = NULL; } if (lpDDS_Flip) { lpDDS_Flip->Release(); lpDDS_Flip = NULL; } if (lpDDS_Primary) { lpDDS_Primary->Release(); lpDDS_Primary = NULL; } if (lpDD) { if (scl) lpDD->SetCooperativeLevel(gens_window, DDSCL_NORMAL); lpDD->Release(); lpDD = NULL; } lpDDS_Blit = NULL; }
int Game_Shutdown(void *parms = NULL, int num_parms = 0) { // this is called after the game is exited and the main event // loop while is exited, do all you cleanup and shutdown here MessageBox(main_window_handle, "game shutdown...", "game shutdown...", MB_OK | MB_ICONEXCLAMATION ); if (lpddsprimary) { lpddsprimary->Release(); lpddsprimary = NULL; } // simply blow away the IDirectDraw4 interface if (lpdd) { lpdd->Release(); lpdd = NULL; } // end if if (g_ddStepFailure != DDSF_OK) { ostrstream txtout; txtout << "Critical Error in DirectX initialization!" << "("; switch (g_ddStepFailure) { case DDSF_DDACCESS: { txtout <<"DDSF_DDACCESS"; } break; case DDSF_DDPALETTECREATE: { txtout <<"DDSF_DDPALETTECREATE"; } break; case DDSF_DDPALETTEATTACH: { txtout <<"DDSF_DDPALETTEATTACH"; } break; case DDSF_SURFACECREATE: { txtout <<"DDSF_SURFACECREATE"; } break; case DDSF_CLIPPERCREATE: { txtout <<"DDSF_CLIPPERCREATE"; } break; case DDSF_SETDISPLAYMODE: { txtout <<"DDSF_SETDISPLAYMODE"; } break; default: { txtout <<"DDSF_UNKNOWN"; } break; } txtout << ")" << ends; MessageBox(main_window_handle, txtout.str(), "Critical Error in DirectX initialization, application is now ending!", MB_OK | MB_ICONEXCLAMATION ); txtout.freeze(0); } delete [] colors16; // return success or failure or your own return code here return(1); } // end Game_Shutdown
//************************************************************************************ // DriverEnumCallback() // Callback function for enumerating drivers. //************************************************************************************ static BOOL WINAPI DriverEnumCallback(GUID * pGUID, TCHAR * strDesc, TCHAR * strName, VOID *, HMONITOR) { D3DEnum_DeviceInfo d3dDeviceInfo; LPDIRECTDRAW7 pDD; LPDIRECT3D7 pD3D; HRESULT hr; // Use the GUID to create the DirectDraw object hr = DirectDrawCreateEx(pGUID, (VOID **)&pDD, IID_IDirectDraw7, NULL); if (FAILED(hr)) { DEBUG_MSG(_T("Can't create DDraw during enumeration!")); return D3DENUMRET_OK; } // Create a D3D object, to enumerate the d3d devices hr = pDD->QueryInterface(IID_IDirect3D7, (VOID **)&pD3D); if (FAILED(hr)) { pDD->Release(); DEBUG_MSG(_T("Can't query IDirect3D7 during enumeration!")); return D3DENUMRET_OK; } // Copy data to a device info structure ZeroMemory(&d3dDeviceInfo, sizeof(d3dDeviceInfo)); lstrcpyn(d3dDeviceInfo.strDesc, strDesc, 39); d3dDeviceInfo.ddDriverCaps.dwSize = sizeof(DDCAPS); d3dDeviceInfo.ddHELCaps.dwSize = sizeof(DDCAPS); pDD->GetCaps(&d3dDeviceInfo.ddDriverCaps, &d3dDeviceInfo.ddHELCaps); if (pGUID) { d3dDeviceInfo.guidDriver = (*pGUID); d3dDeviceInfo.pDriverGUID = &d3dDeviceInfo.guidDriver; } // Record whether the device can render into a desktop window if (d3dDeviceInfo.ddDriverCaps.dwCaps2 & DDCAPS2_CANRENDERWINDOWED) if (NULL == d3dDeviceInfo.pDriverGUID) d3dDeviceInfo.bDesktopCompatible = TRUE; // Enumerate the fullscreen display modes. pDD->EnumDisplayModes(0, NULL, &d3dDeviceInfo, ModeEnumCallback); // Sort list of display modes qsort(d3dDeviceInfo.pddsdModes, d3dDeviceInfo.dwNumModes, sizeof(DDSURFACEDESC2), SortModesCallback); // Now, enumerate all the 3D devices pD3D->EnumDevices(DeviceEnumCallback, &d3dDeviceInfo); // Clean up and return SAFE_DELETE(d3dDeviceInfo.pddsdModes); pD3D->Release(); pDD->Release(); return DDENUMRET_OK; }
void CleanUpDDraw() { logOutput << CurrentTimeString() << "Cleaning up" << endl; if (copyData) copyData->lastRendered = -1; if (hCopyThread) { bKillThread = true; SetEvent(hCopyEvent); if (WaitForSingleObject(hCopyThread, 500) != WAIT_OBJECT_0) TerminateThread(hCopyThread, -1); CloseHandle(hCopyThread); CloseHandle(hCopyEvent); hCopyThread = NULL; hCopyEvent = NULL; } ddrawSurfaceRelease.Unhook(); for (int i = 0; i < NUM_BUFFERS; i++) { if (ddCaptures[i]) { ddCaptures[i]->Release(); ddCaptures[i] = NULL; } } ddrawSurfaceRelease.Rehook(); DestroySharedMemory(); bHasTextures = false; curCapture = 0; curCPUTexture = 0; keepAliveTime = 0; resetCount++; copyWait = 0; lastTime = 0; g_frontSurface = NULL; g_bUseFlipMethod = false; bTargetAcquired = false; g_dwSize = 0; g_bUse32bitCapture = false; g_bConvert16to32 = false; g_bUsePalette = false; g_dwCaptureSize = 0; if (g_ddInterface) { g_ddInterface->Release(); g_ddInterface = NULL; } g_CurrentPalette.Free(); if (g_surfaceDesc) delete g_surfaceDesc; g_surfaceDesc = NULL; if (ddUnlockFctMutex) { CloseHandle(ddUnlockFctMutex); ddUnlockFctMutex = 0; } //UnhookAll(); logOutput << CurrentTimeString() << "---------------------- Cleared DirectDraw Capture ----------------------" << endl; }
HRESULT CTextureHolder::CopyBitmapToSurface(){ // Get a DDraw object to create a temporary surface LPDIRECTDRAW7 pDD; m_pddsSurface->GetDDInterface( (VOID**)&pDD ); // Get the bitmap structure (to extract width, height, and bpp) BITMAP bm; GetObject( m_hbmBitmap, sizeof(BITMAP), &bm ); // Setup the new surface desc DDSURFACEDESC2 ddsd; ddsd.dwSize = sizeof(ddsd); m_pddsSurface->GetSurfaceDesc( &ddsd ); ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT| DDSD_TEXTURESTAGE; ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY; ddsd.ddsCaps.dwCaps2 = 0L; ddsd.dwWidth = bm.bmWidth; ddsd.dwHeight = bm.bmHeight; // Create a new surface for the texture LPDIRECTDRAWSURFACE7 pddsTempSurface; HRESULT hr; if( FAILED( hr = pDD->CreateSurface( &ddsd, &pddsTempSurface, NULL ) ) ) { pDD->Release(); return hr; } // Get a DC for the bitmap HDC hdcBitmap = CreateCompatibleDC( NULL ); if( NULL == hdcBitmap ) { pddsTempSurface->Release(); pDD->Release(); return hr; // bug? return E_FAIL? } SelectObject( hdcBitmap, m_hbmBitmap ); // Handle palettized textures. Need to attach a palette if( ddsd.ddpfPixelFormat.dwRGBBitCount == 8 ) { LPDIRECTDRAWPALETTE pPalette; DWORD dwPaletteFlags = DDPCAPS_8BIT|DDPCAPS_ALLOW256; DWORD pe[256]; WORD wNumColors = GetDIBColorTable( hdcBitmap, 0, 256, (RGBQUAD*)pe ); // Create the color table for( WORD i=0; i<wNumColors; i++ ) { pe[i] = RGB( GetBValue(pe[i]), GetGValue(pe[i]), GetRValue(pe[i]) ); // Handle textures with transparent pixels if( m_dwFlags & (D3DTEXTR_TRANSPARENTWHITE|D3DTEXTR_TRANSPARENTBLACK) ) { // Set alpha for opaque pixels if( m_dwFlags & D3DTEXTR_TRANSPARENTBLACK ) { if( pe[i] != 0x00000000 ) pe[i] |= 0xff000000; } else if( m_dwFlags & D3DTEXTR_TRANSPARENTWHITE ) { if( pe[i] != 0x00ffffff ) pe[i] |= 0xff000000; } } } // Add DDPCAPS_ALPHA flag for textures with transparent pixels if( m_dwFlags & (D3DTEXTR_TRANSPARENTWHITE|D3DTEXTR_TRANSPARENTBLACK) ) dwPaletteFlags |= DDPCAPS_ALPHA; // Create & attach a palette pDD->CreatePalette( dwPaletteFlags, (PALETTEENTRY*)pe, &pPalette, NULL ); pddsTempSurface->SetPalette( pPalette ); m_pddsSurface->SetPalette( pPalette ); SAFE_RELEASE( pPalette ); } // Copy the bitmap image to the surface. HDC hdcSurface; if( SUCCEEDED( pddsTempSurface->GetDC( &hdcSurface ) ) ) { BitBlt( hdcSurface, 0, 0, bm.bmWidth, bm.bmHeight, hdcBitmap, 0, 0, SRCCOPY ); pddsTempSurface->ReleaseDC( hdcSurface ); } DeleteDC( hdcBitmap ); // Copy the temp surface to the real texture surface m_pddsSurface->Blt( NULL, pddsTempSurface, NULL, DDBLT_WAIT, NULL ); // Done with the temp surface pddsTempSurface->Release(); // For textures with real alpha (not palettized), set transparent bits if( ddsd.ddpfPixelFormat.dwRGBAlphaBitMask ) { if( m_dwFlags & (D3DTEXTR_TRANSPARENTWHITE|D3DTEXTR_TRANSPARENTBLACK) ) { // Lock the texture surface DDSURFACEDESC2 ddsd; ddsd.dwSize = sizeof(ddsd); while( m_pddsSurface->Lock( NULL, &ddsd, 0, NULL ) == DDERR_WASSTILLDRAWING ); DWORD dwAlphaMask = ddsd.ddpfPixelFormat.dwRGBAlphaBitMask; DWORD dwRGBMask = ( ddsd.ddpfPixelFormat.dwRBitMask | ddsd.ddpfPixelFormat.dwGBitMask | ddsd.ddpfPixelFormat.dwBBitMask ); DWORD dwColorkey = 0x00000000; // Colorkey on black if( m_dwFlags & D3DTEXTR_TRANSPARENTWHITE ) dwColorkey = dwRGBMask; // Colorkey on white // Add an opaque alpha value to each non-colorkeyed pixel for( DWORD y=0; y<ddsd.dwHeight; y++ ) { WORD* p16 = (WORD*)((BYTE*)ddsd.lpSurface + y*ddsd.lPitch); DWORD* p32 = (DWORD*)((BYTE*)ddsd.lpSurface + y*ddsd.lPitch); for( DWORD x=0; x<ddsd.dwWidth; x++ ) { if( ddsd.ddpfPixelFormat.dwRGBBitCount == 16 ) { if( ( *p16 &= dwRGBMask ) != dwColorkey ) *p16 |= dwAlphaMask; p16++; } if( ddsd.ddpfPixelFormat.dwRGBBitCount == 32 ) { if( ( *p32 &= dwRGBMask ) != dwColorkey ) *p32 |= dwAlphaMask; p32++; } } } m_pddsSurface->Unlock( NULL ); } else if( m_bHasMyAlpha ){ DDSURFACEDESC2 ddsd; ddsd.dwSize = sizeof(ddsd); while( m_pddsSurface->Lock( NULL, &ddsd, 0, NULL ) == DDERR_WASSTILLDRAWING ); DWORD dwRGBMask = ( ddsd.ddpfPixelFormat.dwRBitMask | ddsd.ddpfPixelFormat.dwGBitMask | ddsd.ddpfPixelFormat.dwBBitMask ); DWORD rMask = ddsd.ddpfPixelFormat.dwRBitMask; DWORD gMask = ddsd.ddpfPixelFormat.dwGBitMask; DWORD bMask = ddsd.ddpfPixelFormat.dwBBitMask; DWORD aMask = ddsd.ddpfPixelFormat.dwRGBAlphaBitMask; DWORD rShift = GetShift( rMask ); DWORD gShift = GetShift( gMask ); DWORD bShift = GetShift( bMask ); DWORD aShift = GetShift( aMask ); DWORD maxRVal = rMask >> rShift; DWORD maxGVal = gMask >> gShift; DWORD maxBVal = bMask >> bShift; DWORD maxAVal = aMask >> aShift; DWORD rVal, gVal, bVal, aVal; FLOAT min, max; // Add an opaque alpha value to each non-colorkeyed pixel for( DWORD y=0; y<ddsd.dwHeight; y++ ){ WORD* p16 = (WORD*)((BYTE*)ddsd.lpSurface + y*ddsd.lPitch); DWORD* p32 = (DWORD*)((BYTE*)ddsd.lpSurface + y*ddsd.lPitch); for( DWORD x=0; x<ddsd.dwWidth; x++ ){ if( ddsd.ddpfPixelFormat.dwRGBBitCount == 32 ){ *p32 &= dwRGBMask; // set alpha to zero if( *p32 == 0 ){} // black is 100% transparent, so leave alpha at 0% else if( *p32 == dwRGBMask ){ // white is opaque, so set alpha to 100% *p32 |= aMask; } else{ // set alpha to equal intensity of brightest hue rVal = ( *p32 & rMask ) >> rShift; gVal = ( *p32 & gMask ) >> gShift; bVal = ( *p32 & bMask ) >> bShift; max = max( (FLOAT)rVal / maxRVal, max( (FLOAT)gVal / maxGVal, (FLOAT)bVal / maxBVal ) ); // min = min( (FLOAT)rVal / maxRVal, min( (FLOAT)gVal / maxGVal, (FLOAT)bVal / maxBVal ) ); aVal = max * 255; //if( rVal == gVal && gVal == bVal ){ // white fading to black // *p32 = dwRGBMask; // set color to white //} // maximize luminosity and saturation rVal /= max; gVal /= max; bVal /= max; *p32 = ( aVal << aShift ) | ( rVal << rShift ) | ( gVal << gShift ) | ( bVal << bShift ); } p32++; } else if( ddsd.ddpfPixelFormat.dwRGBBitCount == 16 ){ *p16 &= dwRGBMask; // set alpha to zero if( *p16 == 0 ){} // black is 100% transparent, so leave alpha at 0% else if( *p16 == dwRGBMask ){ // white is opaque, so set alpha to 100% *p16 |= aMask; } else{ // set alpha to equal intensity of brightest hue rVal = ( *p16 & rMask ) >> rShift; gVal = ( *p16 & gMask ) >> gShift; bVal = ( *p16 & bMask ) >> bShift; aVal = STATSTEXTURE_ALPHA * max( (FLOAT)rVal / maxRVal, max( (FLOAT)gVal / maxGVal, (FLOAT)bVal / maxBVal ) ); if( aVal < STATSTEXTURE_ALPHA ){ // semi-tranparent white *p16 = dwRGBMask; } *p16 |= aVal << aShift; } p16++; } } }
int D3DM_InitDevices( HWND hwnd, int w, int h, int full, HMENU menu ) { char buf[256]; int i,j; LPDIRECTDRAW7 pDD = NULL; HRESULT hr; if( FAILED( hr = DirectDrawCreateEx( NULL, (VOID**)&pDD, IID_IDirectDraw7, NULL ) ) ) return DDENUMRET_CANCEL; D3DCapsStruct.m_ddCaps.dwSize = sizeof(DDCAPS); pDD->GetCaps( &D3DCapsStruct.m_ddCaps, NULL ); if(pDD) { pDD->Release(); pDD = NULL; } ZeroMemory( d3dTexture, sizeof(D3DD_TEXTURE)*D3DD_MAX_TEXTURE_AMOUNT ); ZeroMemory( d3dText, sizeof(D3DD_TEXT)*D3DD_MAX_TEXT_AMOUNT ); ZeroMemory( d3dDisp, sizeof(D3DD_DISP)*D3DD_MAX_DISP_AMOUNT ); pD3D = Direct3DCreate8(D3D_SDK_VERSION); if(pD3D == NULL){ MessageBox(NULL,"Direct3Dオブジェクトの生成に失敗しました。[DirectX8.1が入っていない?]","致命的なエラー", MB_OK | MB_ICONSTOP); return FALSE; } if( FAILED(pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &D3DCapsStruct.m_d3dCaps)) ){ MessageBox(NULL,"デバイス能力の取得に失敗しました","致命的なエラー", MB_OK | MB_ICONSTOP); return FALSE; } EnumAdapters(D3DADAPTER_DEFAULT); if( (int)D3DCapsStruct.m_d3dCaps.MaxTextureWidth < D3DD_TEXTURE_CONTROL_SIZE ){ DebugBox( NULL, "このビデオカードは、幅 %d pixel 以上のサイズのテクスチャを生成できません。[%s]", D3DD_TEXTURE_CONTROL_SIZE); return FALSE; }else if( (int)D3DCapsStruct.m_d3dCaps.MaxTextureHeight < D3DD_TEXTURE_CONTROL_SIZE ){ DebugBox( NULL, "このビデオカードは、高さ %d pixel 以上のサイズのテクスチャを生成できません。[%s]", D3DD_TEXTURE_CONTROL_SIZE ); return FALSE; } if( !(D3DCapsStruct.m_d3dCaps.ShadeCaps&D3DPSHADECAPS_ALPHAGOURAUDBLEND) ){ MessageBox(NULL,"このビデオデバイスはグーロブレンディングに対応していません。\nゲームの画像が乱れることがあります","警告", MB_OK | MB_ICONSTOP); } if( !(D3DCapsStruct.m_d3dCaps.ShadeCaps&D3DPSHADECAPS_COLORGOURAUDRGB) ){ MessageBox(NULL,"このビデオデバイスはグーロシェーディングに対応していません。\nゲームの画像が乱れることがあります","警告", MB_OK | MB_ICONSTOP); } if( D3DCapsStruct.m_d3dCaps.TextureCaps&D3DPTEXTURECAPS_SQUAREONLY ){ DebugBox( NULL, "このビデオカードは長方形テクスチャを生成できません。[デバッグ用ダイアログ]" ); } if( FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&D3DCapsStruct.m_NowDisplayMode)) ){ MessageBox(NULL,"ディスプレイモードの取得に失敗しました。[なにゆえ?]","致命的なエラー", MB_OK | MB_ICONSTOP); return FALSE; } D3DCapsStruct.m_WindowDisplayMode = D3DCapsStruct.m_NowDisplayMode; D3DMain.m_DrawHwnd = hwnd; D3DMain.m_MenuHwnd = menu; if( GetSystemMetrics(SM_CXFULLSCREEN)<=800 || GetSystemMetrics(SM_CYFULLSCREEN)<=600){ D3DMain.m_FullScreenOnly = TRUE; D3DMain.m_WindowMode = FALSE; }else{ D3DMain.m_FullScreenOnly = FALSE; D3DMain.m_WindowMode = !full; } ZeroMemory(&d3dppApp,sizeof(d3dppApp)); WinWidth = w; WinHeight = h; d3dppApp.SwapEffect = D3DSWAPEFFECT_COPY; d3dppApp.BackBufferFormat = D3DCapsStruct.m_NowDisplayMode.Format; d3dppApp.BackBufferCount = 1; d3dppApp.BackBufferWidth = WinWidth; d3dppApp.BackBufferHeight = WinHeight; d3dppApp.Windowed = TRUE; d3dppApp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; HRESULT ret; ret = pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dppApp,&pD3DDevice); if( FAILED(ret) ){ ret = pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dppApp,&pD3DDevice); if( FAILED(ret) ){ D3DMain.m_FullScreenOnly = TRUE; } } if(D3DMain.m_FullScreenOnly==TRUE){ RELEASE_3D(pD3DDevice); D3DMain.m_WindowMode = FALSE; ZeroMemory(&d3dppApp,sizeof(d3dppApp)); for(i=0;i<D3DCapsStruct.m_DisplayModeNum;i++){ if( D3DCapsStruct.m_DisplayMode[i].Width == 800 && D3DCapsStruct.m_DisplayMode[i].Height == 600 ){ switch( D3DCapsStruct.m_DisplayMode[i].Format ){ case D3DFMT_R5G6B5: case D3DFMT_X1R5G5B5: case D3DFMT_A1R5G5B5: case D3DFMT_A4R4G4B4: case D3DFMT_X4R4G4B4: D3DCapsStruct.m_FullModeNum=i; d3dppApp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; d3dppApp.Windowed = D3DMain.m_WindowMode; d3dppApp.SwapEffect = FULL_FLIP; d3dppApp.BackBufferFormat = D3DCapsStruct.m_DisplayMode[i].Format; d3dppApp.BackBufferCount = 1; d3dppApp.BackBufferWidth = WinWidth; d3dppApp.BackBufferHeight = WinHeight; break; } } if(d3dppApp.SwapEffect) break; } if(!full){ wsprintf( buf, "このビデオカードの現在のモードではゲームを実行できません。フルスクリーン化しますか?\n[%d]", D3DCapsStruct.m_DisplayMode[i].RefreshRate ); if( MessageBox( NULL, buf, "問い合わせ", MB_YESNO )==IDNO ){ RELEASE_3D(pD3D); return FALSE; } } ret = pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dppApp,&pD3DDevice); if( FAILED(ret) ){ ret = pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dppApp,&pD3DDevice); if( FAILED(ret) ){ switch(ret){ default: case D3DERR_OUTOFVIDEOMEMORY: DebugBox( NULL, "Direct3D が処理を行うのに十分なディスプレイ メモリがありません。" ); RELEASE_3D(pD3D); return FALSE; case D3DERR_INVALIDCALL: DebugBox( NULL, "Direct3Dの初期化に失敗しました[D3DERR_INVALIDCALL]\nこのグラフィックカードは必要な機能をサポートしていないか、\nあるいはDirectX8に対応したドライバが入っていません。" ); RELEASE_3D(pD3D); return FALSE; case D3DERR_NOTAVAILABLE: DebugBox( NULL, "Direct3Dの初期化に失敗しました[D3DERR_NOTAVAILABLE]\nこのグラフィックカードは必要な機能をサポートしていないか、\nあるいはDirectX8に対応したドライバが入っていません。" ); RELEASE_3D(pD3D); return FALSE; } } } }else{ if(D3DMain.m_WindowMode){ }else{ RELEASE_3D(pD3DDevice); ZeroMemory(&d3dppApp,sizeof(d3dppApp)); d3dppApp.SwapEffect = FULL_FLIP; d3dppApp.BackBufferCount = 1; d3dppApp.BackBufferWidth = WinWidth; d3dppApp.BackBufferHeight = WinHeight; d3dppApp.Windowed = FALSE; d3dppApp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; if(DrawSetting.full_16bit){ d3dppApp.BackBufferFormat=D3DFMT_UNKNOWN; for(i=0;i<D3DCapsStruct.m_DisplayModeNum;i++){ if( D3DCapsStruct.m_DisplayMode[i].Width == 800 && D3DCapsStruct.m_DisplayMode[i].Height == 600 ){ switch( D3DCapsStruct.m_DisplayMode[i].Format ){ case D3DFMT_R5G6B5: case D3DFMT_X1R5G5B5: case D3DFMT_A1R5G5B5: case D3DFMT_A4R4G4B4: case D3DFMT_X4R4G4B4: D3DCapsStruct.m_FullModeNum=i; d3dppApp.BackBufferFormat = D3DCapsStruct.m_DisplayMode[i].Format; break; } } if(d3dppApp.BackBufferFormat!=D3DFMT_UNKNOWN) break; } }else{ d3dppApp.BackBufferFormat = D3DCapsStruct.m_NowDisplayMode.Format; } ret = pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dppApp,&pD3DDevice); if( FAILED(ret) ){ ret = pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dppApp,&pD3DDevice); if( FAILED(ret) ){ switch(ret){ default: case D3DERR_OUTOFVIDEOMEMORY: DebugBox( NULL, "Direct3D が処理を行うのに十分なディスプレイ メモリがありません。" ); RELEASE_3D(pD3D); return FALSE; case D3DERR_INVALIDCALL: DebugBox( NULL, "Direct3Dの初期化に失敗しました[D3DERR_INVALIDCALL]\nこのグラフィックカードは必要な機能をサポートしていないか、\nあるいはDirectX8に対応したドライバが入っていません。" ); RELEASE_3D(pD3D); return FALSE; case D3DERR_NOTAVAILABLE: DebugBox( NULL, "Direct3Dの初期化に失敗しました[D3DERR_NOTAVAILABLE]\nこのグラフィックカードは必要な機能をサポートしていないか、\nあるいはDirectX8に対応したドライバが入っていません。" ); RELEASE_3D(pD3D); return FALSE; } } } } } if( FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&D3DCapsStruct.m_NowDisplayMode)) ){ MessageBox(NULL,"ディスプレイモードの取得に失敗しました。[なにゆえ?]","致命的なエラー", MB_OK | MB_ICONSTOP); RELEASE_3D(pD3D); return FALSE; } D3DCapsStruct.m_ttCaps.m_R8G8B8 = IsTextureFormatOk( D3DFMT_R8G8B8, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_X8R8G8B8 = IsTextureFormatOk( D3DFMT_X8R8G8B8, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_A8R8G8B8 = IsTextureFormatOk( D3DFMT_A8R8G8B8, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_R5G6B5 = IsTextureFormatOk( D3DFMT_R5G6B5, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_X1R5G5B5 = IsTextureFormatOk( D3DFMT_X1R5G5B5, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_A1R5G5B5 = IsTextureFormatOk( D3DFMT_A1R5G5B5, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_X4R4G4B4 = IsTextureFormatOk( D3DFMT_X4R4G4B4, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_A4R4G4B4 = IsTextureFormatOk( D3DFMT_A4R4G4B4, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_A8P8 = IsTextureFormatOk( D3DFMT_A8P8, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_P8 = IsTextureFormatOk( D3DFMT_P8, D3DCapsStruct.m_NowDisplayMode.Format); D3DCapsStruct.m_ttCaps.m_A8 = IsTextureFormatOk( D3DFMT_A8, D3DCapsStruct.m_NowDisplayMode.Format); D3DD_SetBackBuffer( WinWidth, WinHeight ); pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_ARGB(0,0,0,0),1.0,0); if(0){ char buf2[512]; wsprintf( buf, "実行ディスプレイモード[%s]\n", TxFmtMode[ LIM(d3dppApp.BackBufferFormat,0,D3DFMT_D3DD_MAX-1) ] ); MBS_CPY(buf2,buf); MBS_CAT(buf2,"使用可能テクスチャ列挙\n"); for(i=1;i<D3DFMT_D3DD_MAX-1;i++){ if( TxFmtMode[i] ){ j = IsTextureFormatOk( (D3DFORMAT)i, D3DCapsStruct.m_NowDisplayMode.Format); if(j){ wsprintf(buf,"%-15s[%s]\n", TxFmtMode[i], (j==2)?"OK":"OK(NotRenderTarget)" ); MBS_CAT(buf2,buf); }else{ wsprintf(buf,"%-15s[%s]\n", TxFmtMode[i], "--Not--" ); MBS_CAT(buf2,buf); } } } DebugBox(NULL,buf2); } D3DD_CreateTable(); return TRUE; }
int winVideoModeSelect(CWnd *pWnd, GUID **guid) { #ifdef _AFXDLL HINSTANCE h = AfxLoadLibrary("ddraw.dll"); #else HMODULE h = LoadLibrary( _T("ddraw.dll") ); #endif // If ddraw.dll doesn't exist in the search path, // then DirectX probably isn't installed, so fail. if (!h) return -1; gDriverCnt = 0; // Note that you must know which version of the // function to retrieve (see the following text). // For this example, we use the ANSI version. LPDIRECTDRAWENUMERATEEX lpDDEnumEx; lpDDEnumEx = (LPDIRECTDRAWENUMERATEEX) GetProcAddress(h,"DirectDrawEnumerateExA"); // If the function is there, call it to enumerate all display // devices attached to the desktop, and any non-display DirectDraw // devices. if (lpDDEnumEx) lpDDEnumEx(DDEnumCallbackEx, NULL, DDENUM_ATTACHEDSECONDARYDEVICES | DDENUM_NONDISPLAYDEVICES ); else { /* * We must be running on an old version of DirectDraw. * Therefore MultiMon isn't supported. Fall back on * DirectDrawEnumerate to enumerate standard devices on a * single-monitor system. */ BOOL (WINAPI *lpDDEnum)(LPDDENUMCALLBACK, LPVOID); lpDDEnum = (BOOL (WINAPI *)(LPDDENUMCALLBACK, LPVOID)) GetProcAddress(h, "DirectDrawEnumerateA"); if(lpDDEnum) lpDDEnum(DDEnumCallback,NULL); /* Note that it could be handy to let the OldCallback function * be a wrapper for a DDEnumCallbackEx. * * Such a function would look like: * BOOL FAR PASCAL OldCallback(GUID FAR *lpGUID, * LPSTR pDesc, * LPSTR pName, * LPVOID pContext) * { * return Callback(lpGUID,pDesc,pName,pContext,NULL); * } */ } int selected = 0; if(gDriverCnt > 1) { VideoDriverSelect d(pWnd); INT_PTR selected = d.DoModal(); if(selected == -1) { #ifdef _AFXDLL AfxFreeLibrary( h ); #else FreeLibrary( h ); #endif return -1; } } HRESULT (WINAPI *DDrawCreateEx)(GUID *,LPVOID *,REFIID,IUnknown *); DDrawCreateEx = (HRESULT (WINAPI *)(GUID *,LPVOID *,REFIID,IUnknown *)) GetProcAddress(h, "DirectDrawCreateEx"); LPDIRECTDRAW7 ddraw = NULL; if(DDrawCreateEx) { HRESULT hret = DDrawCreateEx(Drivers[selected].pGUID, (void **)&ddraw, IID_IDirectDraw7, NULL); if(hret != DD_OK) { systemMessage(0, "Error during DirectDrawCreateEx: %08x", hret); #ifdef _AFXDLL AfxFreeLibrary( h ); #else FreeLibrary( h ); #endif return -1; } } else { // should not happen.... systemMessage(0, "Error getting DirectDrawCreateEx"); #ifdef _AFXDLL AfxFreeLibrary( h ); #else FreeLibrary( h ); #endif return -1; } VideoMode dlg(ddraw, pWnd); INT_PTR res = dlg.DoModal(); if(res != -1) { *guid = Drivers[selected].pGUID; } ddraw->Release(); ddraw = NULL; // If the library was loaded by calling LoadLibrary(), // then you must use FreeLibrary() to let go of it. #ifdef _AFXDLL AfxFreeLibrary( h ); #else FreeLibrary( h ); #endif return (int)res; }
BOOL Test_GetAvailableVidMem (INT* passed, INT* failed) { LPDIRECTDRAW7 DirectDraw; /* Preparations */ if (DirectDrawCreateEx(NULL, (VOID**)&DirectDraw, IID_IDirectDraw7, NULL) != DD_OK) { printf("ERROR: Failed to set up ddraw\n"); return FALSE; } /* Here we go */ DWORD Total, Free; DDSCAPS2 Caps = { 0 }; TEST (DirectDraw->GetAvailableVidMem(&Caps, NULL, NULL) == DDERR_INVALIDPARAMS); TEST (DirectDraw->GetAvailableVidMem(NULL, &Total, &Free) == DDERR_INVALIDPARAMS); TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); /* testing caps */ memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_RESERVED1; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_ALPHA; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_BACKBUFFER; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDPARAMS ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_COMPLEX; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDPARAMS ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_FLIP; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDPARAMS ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_FRONTBUFFER; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDPARAMS ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_OFFSCREENPLAIN; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_OVERLAY; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_PALETTE; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDPARAMS ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_PRIMARYSURFACE; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_RESERVED3; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_SYSTEMMEMORY; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDPARAMS ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_TEXTURE; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_3DDEVICE; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_VIDEOMEMORY; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_VISIBLE; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDPARAMS ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_WRITEONLY; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDPARAMS ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_ZBUFFER; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_OWNDC; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDPARAMS ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_LIVEVIDEO; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_HWCODEC; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_MODEX; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_MIPMAP; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_RESERVED2; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_ALLOCONLOAD; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_VIDEOPORT; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK ); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_LOCALVIDMEM; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps = DDSCAPS_NONLOCALVIDMEM; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = 0x01; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDCAPS); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_RESERVED4; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_HINTDYNAMIC; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_HINTSTATIC; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_RESERVED1; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_RESERVED2; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_OPAQUE; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_HINTANTIALIASING; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_CUBEMAP; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_CUBEMAP_POSITIVEX; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_CUBEMAP_NEGATIVEX; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_CUBEMAP_POSITIVEY; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_CUBEMAP_NEGATIVEY; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_CUBEMAP_POSITIVEZ; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_CUBEMAP_NEGATIVEZ; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_MIPMAPSUBLEVEL; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_D3DTEXTUREMANAGE; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_DONOTPERSIST; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_STEREOSURFACELEFT; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_VOLUME; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_NOTUSERLOCKABLE; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_POINTS; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_RTPATCHES; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_NPATCHES; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_RESERVED3; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_DISCARDBACKBUFFER; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_ENABLEALPHACHANNEL; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_EXTENDEDFORMATPRIMARY; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps2 = DDSCAPS2_ADDITIONALPRIMARY; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps3 = ~(DDSCAPS3_MULTISAMPLE_QUALITY_MASK | DDSCAPS3_MULTISAMPLE_MASK | DDSCAPS3_RESERVED1 | DDSCAPS3_RESERVED2 | DDSCAPS3_LIGHTWEIGHTMIPMAP | DDSCAPS3_AUTOGENMIPMAP | DDSCAPS3_DMAP); TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDCAPS); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps3 = (DDSCAPS3_MULTISAMPLE_QUALITY_MASK | DDSCAPS3_MULTISAMPLE_MASK | DDSCAPS3_RESERVED1 | DDSCAPS3_RESERVED2 | DDSCAPS3_LIGHTWEIGHTMIPMAP | DDSCAPS3_AUTOGENMIPMAP | DDSCAPS3_DMAP); TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DD_OK); memset(&Caps,0,sizeof(DDSCAPS2)); Caps.dwCaps4 = 1; TEST (DirectDraw->GetAvailableVidMem(&Caps, &Total, &Free) == DDERR_INVALIDCAPS ); DirectDraw->Release(); return TRUE; }
HRESULT CTextureHolder::Restore( LPDIRECT3DDEVICE7 pd3dDevice ) { // Release any previously created objects SAFE_RELEASE( m_pddsSurface ); // Check params if( NULL == pd3dDevice ) return DDERR_INVALIDPARAMS; // Get the device caps D3DDEVICEDESC7 ddDesc; if( FAILED( pd3dDevice->GetCaps( &ddDesc) ) ) return E_FAIL; // Setup the new surface desc DDSURFACEDESC2 ddsd; D3DUtil_InitSurfaceDesc( ddsd ); ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH| DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE; ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd.dwTextureStage = 0; //m_dwStage; ddsd.dwWidth = m_dwWidth; ddsd.dwHeight = m_dwHeight; // Turn on texture management for hardware devices if( ddDesc.deviceGUID == IID_IDirect3DHALDevice ) ddsd.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE; else if( ddDesc.deviceGUID == IID_IDirect3DTnLHalDevice ) ddsd.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE; else ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; // Adjust width and height to be powers of 2, if the device requires it if( ddDesc.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_POW2 ) { for( ddsd.dwWidth=1; m_dwWidth>ddsd.dwWidth; ddsd.dwWidth<<=1 ); for( ddsd.dwHeight=1; m_dwHeight>ddsd.dwHeight; ddsd.dwHeight<<=1 ); } // Limit max texture sizes, if the driver can't handle large textures DWORD dwMaxWidth = ddDesc.dwMaxTextureWidth; DWORD dwMaxHeight = ddDesc.dwMaxTextureHeight; ddsd.dwWidth = min( ddsd.dwWidth, ( dwMaxWidth ? dwMaxWidth : 256 ) ); ddsd.dwHeight = min( ddsd.dwHeight, ( dwMaxHeight ? dwMaxHeight : 256 ) ); // Make the texture square, if the driver requires it if( ddDesc.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_SQUAREONLY ) { if( ddsd.dwWidth > ddsd.dwHeight ) ddsd.dwHeight = ddsd.dwWidth; else ddsd.dwWidth = ddsd.dwHeight; } // Setup the structure to be used for texture enumration. TEXTURESEARCHINFO tsi; tsi.bFoundGoodFormat = FALSE; tsi.pddpf = &ddsd.ddpfPixelFormat; tsi.dwDesiredBPP = m_dwBPP; tsi.bUsePalette = ( m_dwBPP <= 8 ); tsi.bUseAlpha = m_bHasMyAlpha; if( m_dwFlags & D3DTEXTR_16BITSPERPIXEL ) tsi.dwDesiredBPP = 16; else if( m_dwFlags & D3DTEXTR_32BITSPERPIXEL ) tsi.dwDesiredBPP = 32; if( m_dwFlags & (D3DTEXTR_TRANSPARENTWHITE|D3DTEXTR_TRANSPARENTBLACK) ) { if( tsi.bUsePalette ) { if( ddDesc.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_ALPHAPALETTE ) { tsi.bUseAlpha = TRUE; tsi.bUsePalette = TRUE; } else { tsi.bUseAlpha = TRUE; tsi.bUsePalette = FALSE; } } } // Enumerate the texture formats, and find the closest device-supported // texture pixel format pd3dDevice->EnumTextureFormats( TextureSearchCallback, &tsi ); // If we couldn't find a format, let's try a default format if( FALSE == tsi.bFoundGoodFormat ) { tsi.bUsePalette = FALSE; tsi.dwDesiredBPP = 16; pd3dDevice->EnumTextureFormats( TextureSearchCallback, &tsi ); // If we still fail, we cannot create this texture if( FALSE == tsi.bFoundGoodFormat ) return E_FAIL; } // Get the DirectDraw interface for creating surfaces LPDIRECTDRAW7 pDD; LPDIRECTDRAWSURFACE7 pddsRender; pd3dDevice->GetRenderTarget( &pddsRender ); pddsRender->GetDDInterface( (VOID**)&pDD ); pddsRender->Release(); // Create a new surface for the texture HRESULT hr = pDD->CreateSurface( &ddsd, &m_pddsSurface, NULL ); // Done with DDraw pDD->Release(); if( FAILED(hr) ) return hr; // For bitmap-based textures, copy the bitmap image. if( m_hbmBitmap ) return CopyBitmapToSurface(); // At this point, code can be added to handle other file formats (such as // .dds files, .jpg files, etc.). return S_OK; }