Check device format ビューア


~ Check device format viewer ~






■はじめに

とある人に、

今、RADEONとGeForceFXでそれぞれがサポートしている
サーフェースフォーマット(16f-16f-16f-16fをRADEONがサポートしているか?とか)
を調べようかと思ったのですがDX9 SDKのCaps Viewerでは出てないですね。
手っ取り早く調べる方法ってありますか?

ときかれたのですが(上の文章は一部修正済み)、知らないので作ってみました。

実行したら、右上の「Check device format!」のボタンを押してください。
ディフォルトでは、レンダリングターゲットとして使えるテクスチャの種類を検索します。
○が使えるフォーマットで、×がだめなフォーマットです。

usage 変更したり、リソースタイプを変更して調べることができます(あんまり意味ないですが、リファレンスラスタライザに切り替えて調べる事もできます)。
深度バッファをテストするときは、タイプはサーフェイス リソース(D3DRTYPE_SURFACE)にしてください。

ソースには、いつものように適当にファイルが入っています。
今回は、DirectXのAPPウィザードのMFCダイアログベースを使いました。
いやぁ~、なれないと疲れるよ。
大事なソースは次のようになります。

CheckDeviceFormatViewer.hアプリケーションのヘッダ
CheckDeviceFormatViewer.cppアプリケーションのソース

■何やってるの?

まぁ、いうことはないのですが、ボタンを押されたら、チェックボックス等と連動した変数を調べて、フォーマットごとにCheckDeviceFormatをした後に、結果を表示しています。
フォーマットには、頂点バッファやインデックスバッファなどのテクスチャと関係のないものは省いています。

CheckDeviceFormatViewer.cpp
0870: void CAppForm::OnBnClickedButtonCheckDeviceFormat()
0871: {
0872:     this->UpdateData();
0873: 
0874:     // usage の決定
0875:     DWORD usage = 0;
0876:     if(m_bCheckRenderTarget)    usage |= D3DUSAGE_RENDERTARGET;
0877:     if(m_bCheckDepthStencil)    usage |= D3DUSAGE_DEPTHSTENCIL;
0878:     if(m_bCheckDynamic)         usage |= D3DUSAGE_DYNAMIC;
0879:     if(m_bCheckAutoGenMipmap)   usage |= D3DUSAGE_AUTOGENMIPMAP;
0880:     if(m_bCheckDMap)            usage |= D3DUSAGE_DMAP;
0881: 
0882:     // リソース タイプの決定
0883:     D3DRESOURCETYPE source_type = D3DRTYPE_TEXTURE;
0884:     switch(m_iResourceType){
0885:     case 0: source_type = D3DRTYPE_TEXTURE; break;
0886:     case 1: source_type = D3DRTYPE_VOLUMETEXTURE; break;
0887:     case 2: source_type = D3DRTYPE_CUBETEXTURE; break;
0888:     case 3: source_type = D3DRTYPE_SURFACE; break;
0889:     default: source_type = D3DRTYPE_TEXTURE; break;
0890:     }
0891:     
0892:     // チェック!!
0893:     D3DFORMAT adapterFormat = m_d3dSettings.DisplayMode().Format;
0894: 
0895:     char buf[256];
0896:     char *strResult = new char[m_nFormat*256];
0897:     strResult[0] = '\0';
0898: 
0899:     for(int i = 0; i<m_nFormat; i++){
0900:         HRESULT hr;
0901:         hr = m_pD3D->CheckDeviceFormat( m_d3dCaps.AdapterOrdinal,
0902:                                         m_d3dCaps.DeviceType,
0903:                                         adapterFormat,
0904:                                         usage,
0905:                                         source_type,
0906:                                         this->m_Formats[i].val );
0907:         // 結果の解析
0908:         m_pbResult[i] = FALSE;
0909:         if(usage & D3DUSAGE_AUTOGENMIPMAP){
0910:             // こいつだけ返り値が特別
0911:             if(hr!=D3DOK_NOAUTOGEN){
0912:                 m_pbResult[i] = TRUE;
0913:             }
0914:         }else{
0915:             // 普通のやつ
0916:             if(SUCCEEDED(hr)){
0917:                 m_pbResult[i] = TRUE;
0918:             }
0919:         }
0920:         // 結果表示
0921:         wsprintf (buf, "%s %s\r\n", m_pbResult[i]?"":"×", this->m_Formats[i].text);
0922:         lstrcat(strResult, buf);
0923:     }
0924:     
0925:     CEdit *Edit = (CEdit *) GetDlgItem (IDC_EDIT_RESULT);
0926:     Edit->SetWindowText (strResult);
0927: 
0928:     SAFE_DELETE_ARRAY(strResult);
0929: }

■結果(RADEON 9700 PRO)

では、どんな結果になるでしょうか。
手持ちのRADEON 9700 PROで試した結果は次のようになりました。

まずは、レンダリングターゲット(D3DUSAGE_RENDERTARGET)にできるテクスチャ(D3DRTYPE_TEXTURE)です。
けっこう歯抜けですね。D3DFMT_L16ができないのが以外といえば以外かな。

× D3DFMT_R8G8B8
○ D3DFMT_A8R8G8B8
○ D3DFMT_X8R8G8B8
○ D3DFMT_R5G6B5
× D3DFMT_X1R5G5B5
○ D3DFMT_A1R5G5B5
○ D3DFMT_A4R4G4B4
× D3DFMT_R3G3B2
× D3DFMT_A8
× D3DFMT_A8R3G3B2
× D3DFMT_X4R4G4B4
○ D3DFMT_A2B10G10R10
× D3DFMT_A8B8G8R8
× D3DFMT_X8B8G8R8
○ D3DFMT_G16R16
○ D3DFMT_A2R10G10B10
○ D3DFMT_A16B16G16R16
× D3DFMT_A8P8
× D3DFMT_P8
× D3DFMT_L8
× D3DFMT_A8L8
× D3DFMT_A4L4
× D3DFMT_V8U8
× D3DFMT_L6V5U5
× D3DFMT_X8L8V8U8
× D3DFMT_Q8W8V8U8
× D3DFMT_V16U16
× D3DFMT_A2W10V10U10
× D3DFMT_UYVY
× D3DFMT_R8G8_B8G8
× D3DFMT_YUY2
× D3DFMT_G8R8_G8B8
× D3DFMT_DXT1
× D3DFMT_DXT2
× D3DFMT_DXT3
× D3DFMT_DXT4
× D3DFMT_DXT5
× D3DFMT_D16_LOCKABLE
× D3DFMT_D32
× D3DFMT_D15S1
× D3DFMT_D24S8
× D3DFMT_D24X8
× D3DFMT_D24X4S4
× D3DFMT_D16
× D3DFMT_D32F_LOCKABLE
× D3DFMT_D24FS8
× D3DFMT_L16
× D3DFMT_Q16W16V16U16
× D3DFMT_MULTI2_ARGB8
○ D3DFMT_R16F
○ D3DFMT_G16R16F
○ D3DFMT_A16B16G16R16F
○ D3DFMT_R32F
○ D3DFMT_G32R32F
○ D3DFMT_A32B32G32R32F
× D3DFMT_CxV8U8

次は、ボリュームテクスチャ(D3DRTYPE_VOLUMETEXTURE)です。
レンダリングターゲットではなく、普通に使えるかどうかです(レンダリングターゲットは全滅でした)。
ボリュームテクスチャは、普通に使えそうですね。

× D3DFMT_R8G8B8
○ D3DFMT_A8R8G8B8
○ D3DFMT_X8R8G8B8
○ D3DFMT_R5G6B5
○ D3DFMT_X1R5G5B5
○ D3DFMT_A1R5G5B5
○ D3DFMT_A4R4G4B4
× D3DFMT_R3G3B2
○ D3DFMT_A8
× D3DFMT_A8R3G3B2
× D3DFMT_X4R4G4B4
○ D3DFMT_A2B10G10R10
× D3DFMT_A8B8G8R8
× D3DFMT_X8B8G8R8
○ D3DFMT_G16R16
○ D3DFMT_A2R10G10B10
○ D3DFMT_A16B16G16R16
× D3DFMT_A8P8
× D3DFMT_P8
○ D3DFMT_L8
× D3DFMT_A8L8
× D3DFMT_A4L4
○ D3DFMT_V8U8
○ D3DFMT_L6V5U5
○ D3DFMT_X8L8V8U8
○ D3DFMT_Q8W8V8U8
○ D3DFMT_V16U16
○ D3DFMT_A2W10V10U10
○ D3DFMT_UYVY
× D3DFMT_R8G8_B8G8
○ D3DFMT_YUY2
× D3DFMT_G8R8_G8B8
○ D3DFMT_DXT1
○ D3DFMT_DXT2
○ D3DFMT_DXT3
○ D3DFMT_DXT4
○ D3DFMT_DXT5
○ D3DFMT_L16
○ D3DFMT_Q16W16V16U16
× D3DFMT_MULTI2_ARGB8
○ D3DFMT_R16F
○ D3DFMT_G16R16F
○ D3DFMT_A16B16G16R16F
○ D3DFMT_R32F
○ D3DFMT_G32R32F
○ D3DFMT_A32B32G32R32F
× D3DFMT_CxV8U8

深度バッファは次のものが使えました。
D3DFMT_D15S1が使えないのがチェックしたいポイントですかねぇ。

○ D3DFMT_D16_LOCKABLE
× D3DFMT_D32
× D3DFMT_D15S1
○ D3DFMT_D24S8
○ D3DFMT_D24X8
× D3DFMT_D24X4S4
○ D3DFMT_D16
× D3DFMT_D32F_LOCKABLE
× D3DFMT_D24FS8

■最後に

本当は、DirectX Info Lib.のようにきちんとまとめた方が良いのでしょうね(まずMSがまとめろ!)。
だれかやってくれないかなぁ…

追記(2003 Nov. 10):いくつかはDirectX Info Lib.でもあったね…





もどる

imagire@gmail.com