今日は,ノートPCでの起動チェックを行いました。
で,早速DirectX周りでハマりました。
まず,当たり前ですがSwapChainの解像度がサポートされているものしか対応しないので,デスクトップと同じ解像度を指定したら,SwapChainが作成できなくて起動できないという問題にあたりました。
結局,画像出力用のレンダーターゲットを1つ用意して,そちらは高解像度にしてリードバックして,CPUからPNGに書き出し。SwapChainの方は,縮小して表示することにしました。
次のハマりポイントですが,EnumOutputs()がエラーを返すというのでハマりました。どうやらIDXGIAdapterの中には,EnumOutputs()の0番が失敗するものがいるようです。で,それを採用するように軽く実装したら,今度はAdapterが変わってDXRのチェックに通らないみたいなことが発生しました。結局,EnumOutputs()用にAdapterは別のものにするという対応で,ようやくサポート解像度がとれるようになりました。本当,こういうところがDirectXは面倒くさくて嫌いです。
コードは下記のような感じになりました。
// DXGIアダプター生成.
{
RefPtr<IDXGIAdapter1> pAdapter;
for(auto adapterId=0;
DXGI_ERROR_NOT_FOUND != m_pFactory->EnumAdapterByGpuPreference(adapterId, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(pAdapter.GetAddress()));
adapterId++)
{
DXGI_ADAPTER_DESC1 desc;
auto hr = pAdapter->GetDesc1(&desc);
if (FAILED(hr))
{ continue; }
hr = D3D12CreateDevice(pAdapter.GetPtr(), D3D_FEATURE_LEVEL_11_0, __uuidof(ID3D12Device), nullptr);
if (SUCCEEDED(hr))
{
if (m_pAdapter.GetPtr() == nullptr)
{
m_pAdapter = pAdapter.GetPtr();
m_pAdapter->AddRef();
}
RefPtr<IDXGIOutput> pOutput;
hr = pAdapter->EnumOutputs(0, pOutput.GetAddress());
if (FAILED(hr))
{ continue; }
hr = pOutput->QueryInterface(IID_PPV_ARGS(m_pOutput.GetAddress()));
if (SUCCEEDED(hr))
{ break; }
}
}
}
これで,一応ノートPCでプログラムが起動するようになりました。
今週末が,レギュレーションテストなので,明日はテスト用のアセット生成などをして本番と同じフローになるように大枠だけは整えたいなと思っています。




