HRESULT Initialize3DEnvironment(HWND hWnd) { HRESULT hr; D3DAdapterInfo* pAdapterInfo = &g_Adapters[g_dwAdapter]; D3DDeviceInfo* pDeviceInfo = &pAdapterInfo->devices[pAdapterInfo->dwCurrentDevice]; D3DModeInfo* pModeInfo = &pDeviceInfo->modes[pDeviceInfo->dwCurrentMode]; // デバイスパラメータの設定 ZeroMemory( &g_d3dprm, sizeof(g_d3dprm) ); g_d3dprm.Windowed = pDeviceInfo->bWindowed; g_d3dprm.BackBufferCount = 1; g_d3dprm.MultiSampleType = pDeviceInfo->MultiSampleType; g_d3dprm.SwapEffect = D3DSWAPEFFECT_DISCARD; g_d3dprm.EnableAutoDepthStencil = g_bUseDepthBuffer; g_d3dprm.AutoDepthStencilFormat = pModeInfo->DepthStencilFormat; g_d3dprm.hDeviceWindow = hWnd; if( g_d3dprm.Windowed ) { g_d3dprm.BackBufferWidth = g_rcWindowClient.right - g_rcWindowClient.left; g_d3dprm.BackBufferHeight = g_rcWindowClient.bottom - g_rcWindowClient.top; g_d3dprm.BackBufferFormat = pAdapterInfo->d3ddmDesktop.Format; g_bWindowed = true; } else { g_d3dprm.BackBufferWidth = pModeInfo->Width; g_d3dprm.BackBufferHeight = pModeInfo->Height; g_d3dprm.BackBufferFormat = pModeInfo->Format; g_bWindowed = false; } // 指定されたパラメータによりデバイス生成 hr = g_lpD3D->CreateDevice( g_dwAdapter, pDeviceInfo->DeviceType, hWnd, pModeInfo->dwBehavior, &g_d3dprm, &g_lpD3DDEV ); if( SUCCEEDED(hr) ){ if( g_bWindowed ) { SetWindowPos( hWnd, HWND_NOTOPMOST, g_rcWindowBounds.left, g_rcWindowBounds.top, ( g_rcWindowBounds.right - g_rcWindowBounds.left ), ( g_rcWindowBounds.bottom - g_rcWindowBounds.top ), SWP_SHOWWINDOW ); } hr = InitDeviceObjects(); if( SUCCEEDED(hr) ){ hr = RestoreDeviceObjects(); if( SUCCEEDED(hr) ){ g_bReady = TRUE; return S_OK; } } // 再試行の為、デバイス依存オブジェクト開放 InvalidateDeviceObjects(); DeleteDeviceObjects(); SAFE_RELEASE( g_lpD3DDEV ); return hr; } // REF ラスタライザへ変更 if( pDeviceInfo->DeviceType == D3DDEVTYPE_HAL ) { // メッセージ表示 TCHAR strMsg[512]; _tcscpy( strMsg, _T("ソフトウェアラスタライザを使用します。\n") _T("ソフトウェアラスタライザでは、動作が非常に\n") _T("低速になります。") ); MessageBox(NULL,strMsg,"Direct3D warning",MB_ICONERROR|MB_OK); // アダプタの選択 g_dwAdapter = 0L; pAdapterInfo = &g_Adapters[g_dwAdapter]; // 使用可能なアダプタの検索 for( UINT i=0L; idwNumDevices; i++ ) { if( pAdapterInfo->devices[i].DeviceType == D3DDEVTYPE_REF ) { pAdapterInfo->dwCurrentDevice = i; pDeviceInfo = &pAdapterInfo->devices[i]; g_bWindowed = pDeviceInfo->bWindowed; break; } } // REF ラスタライザを指定して再設定 if( pAdapterInfo->devices[pAdapterInfo->dwCurrentDevice].DeviceType == D3DDEVTYPE_REF ) { hr = Initialize3DEnvironment(hWnd); } } return hr; }
冒頭部分つまり、下のリストの部分は、クラス CDeviceInformation の所で解説している
典型的な初期化とほぼ同様の処理である。
HRESULT hr; D3DAdapterInfo* pAdapterInfo = &g_Adapters[g_dwAdapter]; D3DDeviceInfo* pDeviceInfo = &pAdapterInfo->devices[pAdapterInfo->dwCurrentDevice]; D3DModeInfo* pModeInfo = &pDeviceInfo->modes[pDeviceInfo->dwCurrentMode]; // デバイスパラメータの設定 ZeroMemory( &g_d3dprm, sizeof(g_d3dprm) ); g_d3dprm.Windowed = pDeviceInfo->bWindowed; g_d3dprm.BackBufferCount = 1; g_d3dprm.MultiSampleType = pDeviceInfo->MultiSampleType; g_d3dprm.SwapEffect = D3DSWAPEFFECT_DISCARD; g_d3dprm.EnableAutoDepthStencil = g_bUseDepthBuffer; g_d3dprm.AutoDepthStencilFormat = pModeInfo->DepthStencilFormat; g_d3dprm.hDeviceWindow = hWnd; if( g_d3dprm.Windowed ) { g_d3dprm.BackBufferWidth = g_rcWindowClient.right - g_rcWindowClient.left; g_d3dprm.BackBufferHeight = g_rcWindowClient.bottom - g_rcWindowClient.top; g_d3dprm.BackBufferFormat = pAdapterInfo->d3ddmDesktop.Format; g_bWindowed = true; } else { g_d3dprm.BackBufferWidth = pModeInfo->Width; g_d3dprm.BackBufferHeight = pModeInfo->Height; g_d3dprm.BackBufferFormat = pModeInfo->Format; g_bWindowed = false; } // 指定されたパラメータによりデバイス生成 hr = g_lpD3D->CreateDevice( g_dwAdapter, pDeviceInfo->DeviceType, hWnd, pModeInfo->dwBehavior, &g_d3dprm, &g_lpD3DDEV );
次の部分は、デバイス構築(CreateDevice)に成功したあとの処理である。
if( SUCCEEDED(hr) ){ if( g_bWindowed ) { SetWindowPos( hWnd, HWND_NOTOPMOST, g_rcWindowBounds.left, g_rcWindowBounds.top, ( g_rcWindowBounds.right - g_rcWindowBounds.left ), ( g_rcWindowBounds.bottom - g_rcWindowBounds.top ), SWP_SHOWWINDOW ); }
hr = InitDeviceObjects(); if( SUCCEEDED(hr) ){ hr = RestoreDeviceObjects(); if( SUCCEEDED(hr) ){ g_bReady = TRUE; return S_OK; } }
InitDeviceObject(); | デバイス使用権依存オブジェクトの構築 |
RestoreDeviceObject(); | デバイス使用権依存オブジェクトの再構築 |
InitDeviceObject(); | RestoreDeviceObject() を行うのに必要なメインメモリ上のデータを構築する。 |
RestoreDeviceObject(); | 実際のビデオメモリ上のデータを構築する。 |
HRESULT InitDeviceObjects() { return S_OK; }
HRESULT RestoreDeviceObjects() { LPDIRECT3DSURFACE8 pBackBuffer; g_lpD3DDEV->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ); pBackBuffer->GetDesc( &g_d3dsdBackBuffer ); pBackBuffer->Release(); return S_OK; }