2016-03-02 339 views
1

我在調用CreateSwapChain時收到DXGI_ERROR_INVALID_CALL。 這裏是我的代碼來創建命令隊列。無法修復DXGI_ERROR_INVALID_CALL - DX12

D3D12_COMMAND_QUEUE_DESC cqDesc = {}; 
cqDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; 
cqDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; 

hr = g_pDevice->CreateCommandQueue(&cqDesc, IID_PPV_ARGS(&g_pCommandQueue)); 
if (FAILED(hr)) { 
    return false; 
} 

這裏是我打電話給CreateSwapChain的地方。

DXGI_MODE_DESC bBuffDesc = {}; //To describe the display model. 
SecureZeroMemory(&bBuffDesc, sizeof(bBuffDesc)); 
bBuffDesc.Height = Height; // ** Might have to give condition for windowed mode 
bBuffDesc.Width = Width; 
bBuffDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
bBuffDesc.RefreshRate.Denominator = Denominator; 
bBuffDesc.RefreshRate.Numerator = Numerator; 
bBuffDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; 
bBuffDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; 
DXGI_SAMPLE_DESC sampleDesc; //To describe multi-sampling preference. 
sampleDesc.Count = 1; //We are not using multi-sampling. We take 1 sample per pixel. 
sampleDesc.Quality = 0; // no antialiasing 
DXGI_SWAP_CHAIN_DESC swapChainDesc = {}; //To describe the swap chain. 
swapChainDesc.BufferCount = g_cnFrameBufferCount; 
swapChainDesc.BufferDesc = bBuffDesc; 
swapChainDesc.SampleDesc = sampleDesc; 
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; //Tells the pipeline that this is a remder target and not a shader input. 
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; //Discard the buffer after calling present. 
swapChainDesc.OutputWindow = hwnd; 
//swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY; 
//swapChainDesc.Windowed = false; 

if (g_bWindowed) { // Windowed mode 
    swapChainDesc.Windowed = true; 
} 
else { //Full-Screen mode 
    swapChainDesc.Windowed = false; 
} 


IDXGISwapChain * tempSwapChain = nullptr; 

hr = dxgiFactory->CreateSwapChain(g_pCommandQueue, &swapChainDesc, &tempSwapChain); 

小時返回上述錯誤。任何幫助,將不勝感激。

更新(問題仍然存在)

  • 移除作爲在註釋
  • 指出的亞當研究發現,小時返回S_OK窗口模式不必要地使用SecureZeroMemory的。好像這個問題已經做全屏模式
+0

爲什麼在您調用CreateSwapChain之前SecureZeroMemory正在處理您的swapChainDesc? –

+0

感謝您指出Adam Miles。我只是發現這是完全沒有必要的。反正這個問題不是因爲那個。 – ngub05

回答

3

東西首先,你應該使用D3D12GetDebugInterface打開調試層上更有意義的消息的機會,還可以設置標誌DXGI_CREATE_FACTORY_DEBUG當您創建的工廠。

您還應該試試CreateSwapChainForHwnd,因爲CreateSwapChain已接近棄用。對於全屏模式,它有一個單獨的參數。在這兩種情況下,您需要標記DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH才能成功。推薦的做法是創建一個交換鏈窗口,然後使用SetFullScreenState,因爲無論如何windows都可以拒絕你,並且必須處理。