[DirectX11] D3D11CreateDeviceAndSwapChain() E_INVALIDARG bei enumeriertem Device



  • Guten Tag, liebe MitC++ler :),

    Heute wollte ich mich ein wenig in DirectX11 einarbeiten. Dazu hab ich mir aus den Beschreibungen der MSDN ein kleines Progrämmchen zusammengeworfen. Funktioniert eigentlich recht gut. Was mich stutzig macht ist, dass der Aufruf von D3D11CreateDeviceAndSwapChain() nur funktioniert, wenn pAdapter = NULL ist, also, im meinem Fall:

    hr = D3D11CreateDeviceAndSwapChain(NULL, 
    		D3D_DRIVER_TYPE_REFERENCE, 
    		NULL, 
    		NULL, 
    		&FeatureLevels,
    		1,
    		D3D11_SDK_VERSION, 
    		&scDesc, 
    		&pDXGISwapChain, 
    		&pD3D11Device, 
    		&FeatureLevel,
    		&pD3D11ImmediateContext);
    

    Lasse ich mir zuvor von einer IDXGIFactory einen Pointer zu nem IDXGIAdapter/IDXGIAdapter1 zurückgeben, so liefert diese Funktion mit diesem Adapter als ersten Parameter aufgerufen den Return Code E_INVALIDARG zurück. Im ganzen sieht das bei mir so aus:

    hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1),reinterpret_cast<void**>(&pDXGIFactory));
    	if(FAILED(hr))
    	{
    		MessageBox(NULL, DXGetErrorDescription(hr), L"CreateDXGIFactory", MB_OK);
    		return -2;
    	}
    
    	hr = pDXGIFactory->EnumAdapters1(NULL, &pDXGIAdapter);
    	if(FAILED(hr))
    	{
    		MessageBox(NULL, DXGetErrorDescription(hr), L"IDXGIFactory::EnumAdapters", MB_OK);
    		return -3;
    	}
    	SAFE_RELEASE(pDXGIFactory);
    	pDXGIAdapter->GetDesc1(&adDesc);
    
    	hr = D3D11CreateDeviceAndSwapChain(pDXGIAdapter, 
    		D3D_DRIVER_TYPE_REFERENCE, 
    		NULL, 
    		NULL, 
    		&FeatureLevels,
    		1,
    		D3D11_SDK_VERSION, 
    		&scDesc, 
    		&pDXGISwapChain, 
    		&pD3D11Device, 
    		&FeatureLevel,
    		&pD3D11ImmediateContext);
    	if(FAILED(hr))
    	{
    		MessageBox(NULL, DXGetErrorDescription(hr), L"D3D11CreateDeviceAndSwapChain", MB_OK);
    		return -4;
    	}
    

    Die GetDesc1()-Funktion habe ich eingefügt um beim Debuggen zu schauen ob der Adapter wirklich gültig ist, scheint soweit in Ordnung zu sein.

    Theoretisch sollten die beiden Aufrufe nach MSDN ja identisch sein:

    pAdapter
    [in, optional] A pointer to the video adapter to use when creating a device (see IDXGIAdapter). Pass NULL to use the default adapter, which is the first adapter enumerated by IDXGIFactory::EnumAdapters.

    Hab ich da etwas nicht richtig verstanden oder sonst einen Fehler gemacht oder ist das Absicht? x)



  • Wenn du nen Adapter angibst musst du den Driver Type auf UNKNOWN setzen weil der sich dann ja schon aus dem Adapter ergibt 😉



  • Ups, danke schön!


Log in to reply