Я следую за примером DX & Ссылка на MSDN, но я врезался в стену.
Я получаю HRESULT E_InvalidArg от D3D11CreateDeviceAndSwapChain ().
Я знаю, что это IDXGIAdapter, который я передал, так как он работает, если я изменяю его на ноль.
Я не могу понять, что не так с моей инициализацией. Может быть, кто-то с лучшими знаниями знает, что я сделал не так. Вот:
Вары:
vector<IDXGIAdapter1*> vAdapters;
IDXGIAdapter1* selectedVAdapter; // Constructor inits this to null
Методы:
void refreshVideoAdapters(){
IDXGIAdapter1* pAdapter;
IDXGIFactory1* pFactory=NULL;
uint lastID=0;
if(selectedVAdapter){
DXGI_ADAPTER_DESC1* desc=NULL;
selectedVAdapter->GetDesc1(desc);
lastID=desc->DeviceId;
releaseVideoAdapter();
}
if(FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory))) return;
for(uint i=0; pFactory->EnumAdapters1(i, &pAdapter)!=DXGI_ERROR_NOT_FOUND; i++){
vAdapters.push_back(pAdapter);
if(lastID){
DXGI_ADAPTER_DESC1* desc=NULL;
pAdapter->GetDesc1(desc);
if(lastID==desc->DeviceId){
selectedVAdapter=pAdapter;
lastID=0;
}
}
}
if(pFactory) pFactory->Release();
}
void releaseVideoAdapter(){
for(uint i=0; i<vAdapters.size(); i++){
vAdapters[i]->Release();
vAdapters[i]=NULL;
}
vAdapters.clear();
selectedVAdapter=NULL;
}
IDXGIAdapter1* getVideoAdapter(){return selectedVAdapter;}
bool setVideoAdapter(uint num=0){
if(num<vAdapters.size()){
selectedVAdapter=vAdapters[num];
return 1;
}
return 0;
}
Соответствующая часть звонка:
...
D3D_FEATURE_LEVEL featureLevels[]={
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_9_3,
};
uint featuresSize=ARRAYSIZE(featureLevels);
D3D_DRIVER_TYPE driverTypes[]={
D3D_DRIVER_TYPE_HARDWARE,
D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE,
};
uint driversSize=ARRAYSIZE(driverTypes);
refreshVideoAdapters();
setVideoAdapter();
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory( &sd, sizeof( sd ) );
sd.BufferCount = 1;
sd.BufferDesc.Width = 42;
sd.BufferDesc.Height = 42;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
HRESULT success=D3D11CreateDeviceAndSwapChain(
selectedVAdapter, driver, NULL, flag, featureLevels, featuresSize,
D3D11_SDK_VERSION, &sd, &swapChain, &deviceInterface,
&selectedFeatureLevel, &deviceContext);
...
Вы не показали весь вызов D3D11CXreateDeviceAndSwapChain (), поэтому я могу только догадываться — вы прислушались к этому абзацу из документы?
Если вы установите для параметра pAdapter значение, отличное от NULL, вы также должны установить DriverType
параметр к значению D3D_DRIVER_TYPE_UNKNOWN. Если вы установите параметр pAdapter в
ненулевое значение и параметр DriverType для значения D3D_DRIVER_TYPE_HARDWARE,
D3D11CreateDeviceAndSwapChain возвращает HRESULT E_INVALIDARG.
Это легко поймать в ловушку, поскольку «эй, я хочу, чтобы устройство использовало аппаратную поддержку» 🙂
Других решений пока нет …