IDXGISwapChain :: ResizeBuffers вызывает точку останова при переключении с полноэкранного на оконный

Всякий раз, когда мое приложение Direct3D 11 переключается из полноэкранного в оконный режим, IDXGISwapChain :: ResizeBuffers вызывает точку останова. В консоли Visual Studio выводится сообщение «Критическая ошибка 0xc0000374» без другой информации. По-видимому, это означает, что произошло повреждение кучи. Тогда ладно. Я не могу получить больше информации о том, почему это произошло, потому что окно неприятно затемняет мой вид и мешает мне контролировать окно визуальной студии.

Я следую за предложениями, сделанными на эта страница MSDN. Я имею в виду, что скопировал и вставил код.

Это мой установочный код (игнорируйте отсутствие проверки ошибок):

DXGI_SWAP_CHAIN_DESC swap_chain_desc = { 0 };
swap_chain_desc.BufferCount = 2;
swap_chain_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swap_chain_desc.OutputWindow = window::get();
swap_chain_desc.SampleDesc.Count = 1;
swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swap_chain_desc.Windowed = TRUE;
swap_chain_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

if (fullscreen == 1) {
swap_chain_desc.BufferDesc.Width = window::desktop_width();
swap_chain_desc.BufferDesc.Height = window::desktop_height();
} else {
swap_chain_desc.BufferDesc.Width = window::width();
swap_chain_desc.BufferDesc.Height = window::height();
}

HRESULT hr = D3D11CreateDeviceAndSwapChain (
NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
NULL,
NULL,
NULL,
D3D11_SDK_VERSION,
&swap_chain_desc,
&m_swap_chain,
&m_device,
NULL,
&m_context
);

ID3D11Texture2D* back_buffer;
hr = m_swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&back_buffer);

hr = m_device->CreateRenderTargetView(back_buffer, NULL, &m_view);

back_buffer->Release();

m_context->OMSetRenderTargets(1, &m_view, NULL);

D3D11_VIEWPORT viewport = { 0 };
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;

if (fullscreen == 1) {
viewport.Width = window::desktop_width();
viewport.Height = window::desktop_height();
} else {
viewport.Width = window::width();
viewport.Height = window::height();
}

m_context->RSSetViewports(1, &viewport);

if (fullscreen == 1) {
m_swap_chain->SetFullscreenState(TRUE, NULL);
}

Есть ли что-нибудь, что могло вызвать эту проблему? Код рендеринга — это просто ClearRenderTargetView и присутствует после цикла PeekMessage, ничего важного.

0

Решение

Эта проблема была исправлена ​​путем отображения окна перед установкой полноэкранного состояния цепочки обмена. Либо позвони UpdateWindow(hwnd) а также ShowWindow(hwnd, SW_SHOW) или установите стиль окна на WS_VISIBLE при звонке CreateWindow() или же CreateWindowEx()предпочтительно перед тем, как делать что-либо, связанное с DirectX

0

Другие решения


По вопросам рекламы [email protected]