2012-09-28 33 views
1

我的D3D11CreateDeviceAndSwapChain()有問題。我以爲我在prev線程中得到了一個解決方案,所以我已經將它標記爲已解決。 [Create Swap Chain Failed創建交換鏈失敗2.0

貌似我騙了自己,當我不小心返回HRESULT爲bool ...

我一直在爭取這個問題&整天還沒有計算出來。這裏有大量關於輸入輸出&調試信息...

1]以建議使用未知與非空vAdapter: Debug Pic http://content.wuala.com/contents/RandomClown/Public/RandomCrap/Debug%201.png

2]繼離開DX樣本它空&使用類型的硬件: Debug Pic http://content.wuala.com/contents/RandomClown/Public/RandomCrap/Debug%202.png

的圖片可能足以有人發現了這個問題,但如果是別的東西,代碼:

012從該代碼
//  This is some relevant stuff [anything referenced] in the class. 

Graphics(){ 
    selectedVAdapter=NULL; 
    deviceInterface=NULL; 
    deviceContext=NULL; 
    swapChain=NULL; 
} 

bool initDevice(HWND &hWnd){ 
    HRESULT success=S_OK; 

    D3D_FEATURE_LEVEL featureLevels[]={ 
     D3D_FEATURE_LEVEL_11_0, 
     D3D_FEATURE_LEVEL_10_1, 
     D3D_FEATURE_LEVEL_10_0, 
     D3D_FEATURE_LEVEL_9_3, 
    }; 
    uint featuresSize=ARRAYSIZE(featureLevels); 

    D3D_DRIVER_TYPE driverTypes[]={ 
     D3D_DRIVER_TYPE_UNKNOWN, // Needed for manual vid adapter setting 
     D3D_DRIVER_TYPE_HARDWARE, 
     D3D_DRIVER_TYPE_WARP, 
     D3D_DRIVER_TYPE_REFERENCE, 
    }; 
    uint driversSize=ARRAYSIZE(driverTypes); 

    refreshVideoAdapters(); 
    setVideoAdapter(); 

    //setSampleQuality(); 

    DXGI_SWAP_CHAIN_DESC sd; 
    ZeroMemory(&sd, sizeof(sd)); 
    sd.BufferCount = settings.bufferCount; 
    sd.BufferDesc.Width = settings.width; 
    sd.BufferDesc.Height = settings.height; 
    sd.BufferDesc.Format = settings.colorDepth; 
    sd.BufferDesc.RefreshRate.Numerator = settings.rateNumerator; 
    sd.BufferDesc.RefreshRate.Denominator = settings.rateDenominator; 
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 
    sd.OutputWindow = hWnd; 
    sd.SampleDesc.Count = settings.sampleCount; 
    sd.SampleDesc.Quality = settings.sampleQuality; 
    sd.Windowed = !settings.fullScreen; 

    uint flag=0; 
    #ifdef _DEBUG 
     flag|=D3D11_CREATE_DEVICE_DEBUG; 
    #endif 

    for(uint i=0; i<driversSize; i++){ // SwapChain: http://msdn.microsoft.com/en-us/library/ff476083%28v=vs.85%29.aspx 
     D3D_DRIVER_TYPE driver=driverTypes[i]; 
     success=D3D11CreateDeviceAndSwapChain(
      //NULL, 
      selectedVAdapter, driver, NULL, flag, 
      featureLevels, featuresSize, D3D11_SDK_VERSION, &sd, 
      &swapChain, &deviceInterface, &selectedFeatureLevel, &deviceContext); 
     if(SUCCEEDED(success)) break; 
    } 

    return SUCCEEDED(success); 
} 

//  Methods to manage video adapters 
void refreshVideoAdapters(){ 
    IDXGIAdapter1* pAdapter; 
    IDXGIFactory1* pFactory=NULL; 

    uint lastID=0; 
    if(selectedVAdapter){ 
     DXGI_ADAPTER_DESC1* desc=NULL; 
     selectedVAdapter->GetDesc1(desc); 
     lastID=desc->DeviceId; 
     releaseVideoAdapters(); 
    } 

    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 releaseVideoAdapters(){ 
    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; 
} 

// Member vars 
private: 
SettingsGraphicsDevice settings; 

D3D_FEATURE_LEVEL selectedFeatureLevel; 

vector<IDXGIAdapter1*> vAdapters; 
IDXGIAdapter1* selectedVAdapter; 

ID3D11Device* deviceInterface; 
ID3D11DeviceContext* deviceContext; 
IDXGISwapChain* swapChain; 

設置結構:

struct SettingsGraphicsDevice{ 
    uint width, height; 
    bool fullScreen, vsync; 
    uint rateNumerator; 
    uint rateDenominator; 
    uint bufferCount; 
    uint sampleCount, sampleQuality; 
    DXGI_FORMAT colorDepth; 
    float minDist, maxDist; 

    SettingsGraphicsDevice(){ 
     width=height=0; 
     fullScreen=0; 
     vsync=0; 

     rateNumerator=0; 
     rateDenominator=1; 
     bufferCount=1; 
     sampleCount=1, sampleQuality=0; 
     colorDepth=DXGI_FORMAT_R8G8B8A8_UINT; 

     minDist=0.1f; 
     maxDist=1000.0f; 
    } 

}; 

感謝閱讀。希望這次能找到解決方案。

+0

很抱歉聽到。您忽略了MSDN中某處提供的另一條建議:當您使用全屏時,您應該創建一個窗口化交換鏈並在之後將其設置爲全屏。無論哪種方式,因爲你沒有做全屏:你是否嘗試將刷新率值保持爲0?此外,快速瀏覽我的代碼表明我使用DXGI_FORMAT_R8G8B8A8_UNORM,但我目前不知道這是否是正確的模式。正在進行中:-) –

+0

是的,我處於窗口模式,並且我的刷新率爲0.我將嘗試該顏色模式。 – RandomClown

回答

1

從我的評論複製和粘貼:「另外,快速瀏覽我的代碼表明我使用DXGI_FORMAT_R8G8B8A8_UNORM,但我目前還不知道這是否是正確的模式。」好吧,現在是在回答:-)

是的,格式... DXGI_FORMAT是一個相當大的枚舉,但在許多情況下只允許某些格式。無論是全屏還是非全屏,只允許顯示某些格式,這應該不會太令人驚訝。

我從文檔中獲得了我使用的值(與往常一樣),特別是DXGI_MODE_DESC說明中的列表。我實際上並不知道自己是否創建了BLT塊轉移交換鏈,但確定這些值與任何開始時一樣好,即使我不關心功能級別9,它似乎很安全: - )

我不知道爲什麼你的代碼似乎適用於一個空適配器;我認爲這很令人困惑。也許調試運行時會抓住它?

+0

示例顯示它使用空適配器進行初始化。我認爲它默認爲第一個適配器。另外,說「適配器=視頻卡」是否正確? – RandomClown

0

切換到該顏色模式[DXGI_FORMAT_R8G8B8A8_UNORM]工作。我現在得到S_OK。爲什麼其他顏色模式存在,如果他們不工作?

+1

DXGI格式取決於資源(紋理/緩衝區)的使用情況,因此並不是所有這些格式都取決於您想要對它們執行的操作,請查看http://msdn.microsoft.com/en-us/library/windows/desktop /ff476498(v=vs.85).aspx格式支持 – catflier

+0

有趣。謝謝,這是很好的知道。 – RandomClown