CreateDevice¶
#include "device.h"
namespace gorilla {
template <typename T> using ComPtr = Microsoft::WRL::ComPtr<T>;
ComPtr<ID3D11Device> create_device(const ComPtr<IDXGIAdapter> &adapter) {
D3D_DRIVER_TYPE dtype = D3D_DRIVER_TYPE_HARDWARE;
UINT flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; // for D2D
#ifdef _DEBUG
flags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
D3D_FEATURE_LEVEL featureLevels[] = {D3D_FEATURE_LEVEL_11_0};
UINT numFeatureLevels = sizeof(featureLevels) / sizeof(D3D_FEATURE_LEVEL);
UINT sdkVersion = D3D11_SDK_VERSION;
D3D_FEATURE_LEVEL validFeatureLevel;
ComPtr<ID3D11Device> device;
HRESULT hr = D3D11CreateDevice(adapter.Get(), dtype, nullptr, flags,
featureLevels, numFeatureLevels, sdkVersion,
&device, &validFeatureLevel, nullptr);
if (FAILED(hr)) {
return nullptr;
}
if (validFeatureLevel != featureLevels[0]) {
return nullptr;
}
return device;
}
} // namespace gorilla
CreateDevice flag¶
D3D11_CREATE_DEVICE_DEBUG
があるとアプリケーション終了時に COM の Release 忘れが Console に表示されるD3D11_CREATE_DEVICE_BGRA_SUPPORT
は、D2D デバイスを作る場合は必要
Microsoft::WRL::ComPtr¶
IUnknown を std::shared_ptr のように扱えるようにする。
#include <wrl/client.h>
template <typename T> using ComPtr = Microsoft::WRL::ComPtr<T>;
->
経由でポインタのように扱えばよいが、初期化、生ポインタへの変換、COM Interface の取得などで固有の操作がある。
初期化¶
課題
ComPtr init