首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法修复DXGI_ERROR_INVALID_CALL - DX12

无法修复DXGI_ERROR_INVALID_CALL - DX12
EN

Stack Overflow用户
提问于 2016-03-02 07:42:25
回答 1查看 1.8K关注 0票数 1

我打电话给DXGI_ERROR_INVALID_CALL时正在接CreateSwapChain。下面是我创建命令queque的代码。

代码语言:javascript
复制
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打电话的地方。

代码语言:javascript
复制
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);

我的hr返回上述错误。任何帮助都将不胜感激。

更新(问题仍然存在)

  • 删除了亚当在评论中指出的对SecureZeroMemory不必要的使用
  • 发现hr返回S_OK窗口模式。似乎这个问题必须用全屏模式来解决。
EN

回答 1

Stack Overflow用户

发布于 2016-03-02 18:38:37

首先,您应该打开调试层,以便使用D3D12GetDebugInterface获得更有意义的消息,并在创建工厂时设置标志DXGI_CREATE_FACTORY_DEBUG

您还应该尝试使用CreateSwapChainForHwnd,因为CreateSwapChain接近弃用。对于全屏模式,它有一个单独的参数。在这两种情况下,您需要标志DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH才能成功。重复的做法是创建一个带窗口的交换链,然后使用SetFullScreenState,因为windows无论如何都会拒绝您的开关,这必须处理。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35741201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档