#include #include #include #include #include"SelectDevice.h" static D3DFORMAT g_fmtDepthStencil=D3DFMT_D24S8; // D3DFMT_UNKNOWN で使用せず static D3DFORMAT g_fmtRenderTexterWnd,g_fmtRenderTexterFull; // デバイス能力のチェック static HRESULT CheckDeviceCaps(D3DCAPS9 caps) { if(caps.MaxStreams < 3) { return DXTRACE_ERR_MSGBOX(_T("CheckDeviceCaps MaxStreams<3"),E_FAIL); } if(caps.MaxPrimitiveCount < 0xFFFF) { return DXTRACE_ERR_MSGBOX(_T("CheckDeviceCaps MaxPrimitiveCount<0xFFFF"),E_FAIL); } if(caps.MaxVertexIndex < 0xFFFF) { return DXTRACE_ERR_MSGBOX(_T("CheckDeviceCaps MaxVertexIntex"),E_FAIL); } if(caps.VertexShaderVersion < D3DVS_VERSION(2,0)) { return DXTRACE_ERR_MSGBOX(_T("CheckDeviceCaps VertexShaderVersionCheckDeviceType(adapter,device,dmode.Format,c_fmtDisplay[i],TRUE); if(SUCCEEDED(hr)) { g_D3DPPWnd.BackBufferFormat=c_fmtDisplay[i]; break; } } if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("SelectAdapterFormat CheckDeviceType Window"),hr); } CopyMemory(&g_D3DPPFull,&g_D3DPPWnd,sizeof(D3DPRESENT_PARAMETERS)); g_D3DPPFull.Windowed = FALSE; for(i=0;iCheckDeviceType(adapter,device,c_fmtDisplay[i],c_fmtDisplay[i],FALSE); if(SUCCEEDED(hr)) { g_D3DPPFull.BackBufferFormat=c_fmtDisplay[i]; break; } } if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("SelectAdapterFormat CheckDeviceType Full"),hr); } return S_OK; } // 深度/ステンシル・バッファのフォーマットチェック static HRESULT CheckDepthStencilFormat(UINT adapter,D3DDEVTYPE device,D3DDISPLAYMODE dmode) { HRESULT hr=g_pD3D->CheckDeviceFormat(adapter,device, dmode.Format,D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,g_fmtDepthStencil); if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("CheckDepthStencilFormat CheckDeviceFormat Window"),hr); } hr=g_pD3D->CheckDepthStencilMatch(adapter,device, dmode.Format,g_D3DPPWnd.BackBufferFormat,g_fmtDepthStencil); if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("CheckDepthStencilFormat CheckDepthStencilMatch Window"),hr); } g_D3DPPWnd.EnableAutoDepthStencil=TRUE; g_D3DPPWnd.AutoDepthStencilFormat=g_fmtDepthStencil; hr=g_pD3D->CheckDeviceFormat(adapter,device, g_D3DPPFull.BackBufferFormat,D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,g_fmtDepthStencil); if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("CheckDepthStencilFormat CheckDeviceFormat Full"),hr); } hr=g_pD3D->CheckDepthStencilMatch(adapter,device, g_D3DPPFull.BackBufferFormat,g_D3DPPFull.BackBufferFormat,g_fmtDepthStencil); if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("CheckDepthStencilFormat CheckDepthStencilMatch Full"),hr); } g_D3DPPFull.EnableAutoDepthStencil=TRUE; g_D3DPPFull.AutoDepthStencilFormat=g_fmtDepthStencil; return S_OK; } // レンダリング・テクスチャのフォーマット選択 static HRESULT SelectRenderTexterFormat(UINT adapter,D3DDEVTYPE device,D3DDISPLAYMODE dmode) { D3DFORMAT c_fmtRenderTexter[]={ D3DFMT_X8R8G8B8,D3DFMT_X1R5G5B5,D3DFMT_R5G6B5 }; HRESULT hr=E_FAIL; g_fmtRenderTexterWnd=D3DFMT_UNKNOWN; for(int i=0;iCheckDeviceFormat(adapter,device, dmode.Format,D3DUSAGE_RENDERTARGET,D3DRTYPE_TEXTURE,c_fmtRenderTexter[i]); if(SUCCEEDED(hr)) { hr=g_pD3D->CheckDepthStencilMatch(adapter,device, dmode.Format,c_fmtRenderTexter[i],g_fmtDepthStencil); if(SUCCEEDED(hr)) { g_fmtRenderTexterWnd=c_fmtRenderTexter[i]; break; } } } if(FAILED(hr)) return DXTRACE_ERR_MSGBOX(_T("SelectRenderTexterFormat Window"),hr); g_fmtRenderTexterFull=D3DFMT_UNKNOWN; for(i=0;iCheckDeviceFormat(adapter,device, g_D3DPPFull.BackBufferFormat,D3DUSAGE_RENDERTARGET,D3DRTYPE_TEXTURE,c_fmtRenderTexter[i]); if(SUCCEEDED(hr)) { hr=g_pD3D->CheckDepthStencilMatch(adapter,device, g_D3DPPFull.BackBufferFormat,c_fmtRenderTexter[i],g_fmtDepthStencil); if(SUCCEEDED(hr)) { g_fmtRenderTexterFull=c_fmtRenderTexter[i]; break; } } } if(FAILED(hr)) return DXTRACE_ERR_MSGBOX(_T("SelectRenderTexterFormat Full"),hr); return S_OK; } // フルシーン・アンチエイリアシング選択 static HRESULT SelectMultiSampleType(UINT adapter,D3DDEVTYPE device) { const D3DMULTISAMPLE_TYPE c_mst[]= { D3DMULTISAMPLE_4_SAMPLES,D3DMULTISAMPLE_3_SAMPLES, D3DMULTISAMPLE_2_SAMPLES,D3DMULTISAMPLE_NONMASKABLE }; HRESULT hr=E_FAIL; for(int i=0;iCheckDeviceMultiSampleType(adapter,device, g_D3DPPWnd.BackBufferFormat,TRUE,c_mst[i],NULL); if(FAILED(hr)) continue; if(g_D3DPPWnd.EnableAutoDepthStencil==TRUE) { hr=g_pD3D->CheckDeviceMultiSampleType(adapter,device, g_D3DPPWnd.AutoDepthStencilFormat,TRUE,c_mst[i],NULL); if(FAILED(hr)) continue; } g_D3DPPWnd.MultiSampleType=c_mst[i]; g_D3DPPWnd.MultiSampleQuality=0; break; } if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("SelectMultiSampleType CheckDeviceMultiSampleType Window"),hr); } for(int i=0;iCheckDeviceMultiSampleType(adapter,device, g_D3DPPFull.BackBufferFormat,TRUE,c_mst[i],NULL); if(FAILED(hr)) continue; if(g_D3DPPFull.EnableAutoDepthStencil==TRUE) { hr=g_pD3D->CheckDeviceMultiSampleType(adapter,device, g_D3DPPFull.AutoDepthStencilFormat,TRUE,c_mst[i],NULL); if(FAILED(hr)) continue; } g_D3DPPFull.MultiSampleType=c_mst[i]; g_D3DPPFull.MultiSampleQuality=0; break; } if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("SelectMultiSampleType CheckDeviceMultiSampleType Full"),hr); } return S_OK; } // ディスプレイ・モード選択 static HRESULT SelectDisplayMode(UINT adapter) { D3DDISPLAYMODE dmode={0,0,0,D3DFMT_UNKNOWN}; unsigned int level=(unsigned int)-1; UINT sum=g_pD3D->GetAdapterModeCount(adapter,g_D3DPPFull.BackBufferFormat); for(UINT i=0;iEnumAdapterModes(adapter,g_D3DPPFull.BackBufferFormat,i,&dm); unsigned int l=abs(g_sizeFullMode.cx-dm.Width)+abs(g_sizeFullMode.cy-dm.Height); if(lGetDeviceCaps(*pAdapter,*pDevice,&caps); if(FAILED(hr) || FAILED(CheckDeviceCaps(caps))) { DXTRACE_ERR_MSGBOX(_T("SelectD3DDevice CheckDeviceCaps HAL"),E_FAIL); *pDevice=D3DDEVTYPE_REF; hr=g_pD3D->GetDeviceCaps(*pAdapter,*pDevice,&caps); if(FAILED(hr) || FAILED(CheckDeviceCaps(caps))) { return DXTRACE_ERR_MSGBOX(_T("SelectD3DDevice CheckDeviceCaps REF"),E_FAIL); } } D3DDISPLAYMODE dmode; hr=g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&dmode); if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("SelectD3DDevice GetAdapterDisplayMode"),hr); } hr=SelectAdapterFormat(*pAdapter,*pDevice,dmode); if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("SelectD3DDevice SelectAdapterFormat"),hr); } if(g_fmtDepthStencil != D3DFMT_UNKNOWN) { hr=CheckDepthStencilFormat(*pAdapter,*pDevice,dmode); if(FAILED(hr)) { return DXTRACE_ERR_MSGBOX(_T("SelectD3DDevice CheckDepthStencilFormat"),hr); } } hr=SelectRenderTexterFormat(*pAdapter,*pDevice,dmode); if(FAILED(hr)) return DXTRACE_ERR_MSGBOX(_T("SelectD3DDevice SelectRenderTexterFormat"),hr); hr=SelectMultiSampleType(*pAdapter,*pDevice); if(FAILED(hr)) return DXTRACE_ERR_MSGBOX(_T("SelectD3DDevice SelectMultiSampleType"),hr); hr=SelectDisplayMode(*pAdapter); if(FAILED(hr)) return DXTRACE_ERR_MSGBOX(_T("SelectD3DDevice SelectDisplayMode"),hr); return S_OK; }