2012-09-27 108 views
2

我正在關注DX示例& MSDN參考,但我現在碰壁了。創建交換鏈失敗

我從D3D11CreateDeviceAndSwapChain()獲取E_InvalidArg的HRESULT。 我知道這是我通過的IDXGIAdapter,因爲它工作,如果我將它更改爲null。

我無法弄清楚我的初始化有什麼問題。也許有更好知識的人知道我做錯了什麼。那就是:

的增值經銷商:

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); 

     ... 

回答

5

你沒有顯示整個D3D11CXreateDeviceAndSwapChain()電話,所以我只能猜測 - 你是否注意到the docs的那段話?

如果將pAdapter參數的非NULL值,還必須設置DriverType 參數的D3D_DRIVER_TYPE_UNKNOWN值。如果將pAdapter參數設置爲 非NULL值並將DriverType參數設置爲D3D_DRIVER_TYPE_HARDWARE值,則 D3D11CreateDeviceAndSwapChain返回E_INVALIDARG的HRESULT。

容易獲得通過一個被困,因爲「哎,我想用硬件支持設備」 :-)

+0

喔。我沒看到那個音符。那是什麼殺了我。 :D如果我理解正確,IDXGIAdapter代表一個視頻卡,對不對?如果手動選擇了視頻卡,爲什麼驅動程序不會設置爲硬件? – RandomClown

+0

這可能是有原因的,但我仍然在與其他所有人鬥爭,所以我從來沒有真正關心「do-s」背後的「爲什麼」:-)事實上,一個「做」總是一件好事,考慮到它意味着一個更少的選擇,我必須弄清楚:-) –