日別アーカイブ: 2009年5月13日

Direct3D10/11 DXGI1.1 とリモート GPU (アダプタ)

DXGI1.1 のアダプタ列挙を試します。

●EeePC901-X で実行した場合 (Windows7 RC x86)

// EeePC 901-X
[Mobile Intel(R) 945 Express Chipset Family (Microsoft Corporation - WDDM 1.0)]
   vmem:0MB sysmem:64MB shmem:192MB
   flag=0 

945 内蔵 GPU が列挙できています。
実際に Direct3D10 / 11 デバイスを作るとエラーなので、ドライバがまだ D3D10 Level9
に対応していないことがわかります。

●デスクトップ PC で実行した場合 (Windows7 RC x64)

// Desktop PC
[ATI Radeon HD 4800 Series ]
   vmem:504MB sysmem:0MB shmem:2811MB
   flag=0 
  (Direct3D11)
   *HARDWARE  = 10.1 (a100)
[ATI Radeon HD 4670]
   vmem:504MB sysmem:0MB shmem:2811MB
   flag=0 
  (Direct3D11)
   *HARDWARE  = 10.1 (a100)

2枚差したビデオカードが両方とも列挙されています。
それぞれ 10.1 でデバイスの作成ができます。

●リモートデスクトップ経由で実行した場合

[Mobile Intel(R) 945 Express Chipset Family (Microsoft Corporation - WDDM 1.0)]
   vmem:0MB sysmem:64MB shmem:192MB
   flag=1 REMOTE
[ATI Radeon HD 4800 Series ]
   vmem:504MB sysmem:0MB shmem:2811MB
   flag=0 
  (Direct3D11)
   *HARDWARE  = 10.1 (a100)
[ATI Radeon HD 4670]
   vmem:504MB sysmem:0MB shmem:2811MB
   flag=0 
  (Direct3D11)
   *HARDWARE  = 10.1 (a100)

EeePC 901 からデスクトップ PC に接続しています。

予想通り両方のマシン、すべてのアダプタが見えていることがわかります。
EeePC の 945 では DXGI_ADAPTER_DESC1 の Flags に DXGI_ADAPTER_FLAG_REMOTE bit が立っており、このデバイスを区別することが可能です。
プログラム自体はホスト側のデスクトップ PC で走っているので、プログラムから見れば
クライアントである EeePC の方がリモートです。

もし Remote のアダプタが Command Remoting に対応していれば
ネットワークを経由していてもクライアント側の PC でリアルタイムに
レンダリングすることが可能となります。

ちなみに DXGI1.0 で列挙するとホスト側の最初のアダプタ “RADEON HD4850” しか
見えませんでした。

● Feature

各アダプタの詳細を調べると下記の通り。
いわば Direct3D11 における caps です。

[DEFAULT]
  (Direct3D11)
   *HARDWARE  = 10.1 (a100)
     feature threading  DriverConcurrentCreates=0
     feature threading  DriverCommandLists=0
     feature d3d10_x ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x=0
     feature doubles  DoublePrecisionFloatShaderOps=0
   *REFERENCE = 11.0 (b000)
     feature threading  DriverConcurrentCreates=0
     feature threading  DriverCommandLists=0
     feature d3d10_x ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x=1
     feature doubles  DoublePrecisionFloatShaderOps=1
   *WARP      = 10.1 (a100)
     feature threading  DriverConcurrentCreates=0
     feature threading  DriverCommandLists=0
     feature d3d10_x ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x=0
     feature doubles  DoublePrecisionFloatShaderOps=0

[ATI Radeon HD 4800 Series ] (V:4098 D:37954 S:84021250 R:0)
   luid:000097b2 00000000
   vmem:504MB sysmem:0MB shmem:2811MB
   flag=0 
  (Direct3D11)
   *HARDWARE  = 10.1 (a100)
     feature threading  DriverConcurrentCreates=0
     feature threading  DriverCommandLists=0
     feature d3d10_x ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x=0
     feature doubles  DoublePrecisionFloatShaderOps=0

[ATI Radeon HD 4670] (V:4098 D:38032 S:625086466 R:0)
   luid:0000b18e 00000000
   vmem:504MB sysmem:0MB shmem:2811MB
   flag=0 
  (Direct3D11)
   *HARDWARE  = 10.1 (a100)
     feature threading  DriverConcurrentCreates=0
     feature threading  DriverCommandLists=0
     feature d3d10_x ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x=0
     feature doubles  DoublePrecisionFloatShaderOps=0

以前 DirectX SDK Nov2008 時点で調べた結果はこちら
ほとんどのオプションは 0 のままですが、よく見ると REFERENCE で
DoublePrecisionFloatShaderOps が 1 になっていました。
REFERENCE を使えばシェーダーの double 演算命令もテストできるようになったということです。

同記事 でも触れていますが ComputeShader 4.0/4.1 については November の時点ですでに対応していますね。

関連エントリ
Direct3D DXGI とマルチ GPU (アダプタ)
Windows7 リモートデスクトップと Direct3D
Direct3D11/DirectX11 (4) FeatureLevel と旧 GPU の互換性、テクスチャ形式など