0

Whenever my Direct3D 11 application switches from fullscreen to windowed mode, IDXGISwapChain::ResizeBuffers triggers a breakpoint. In Visual Studio's console, the message "Critical error 0xc0000374" is printed, with no other information. Apparently this means a heap corruption has occurred. Okay then. I can't get any more information about why this occurred because the window obnoxiously obscures my view and prevents me from controlling the visual studio window.

I'm following the suggestions made on this MSDN page. By that I mean I copied and pasted the code.

This is my setup code (ignore the lack of error checking):

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

Is there anything there that might have caused this problem? The rendering code is just a ClearRenderTargetView and Present after a PeekMessage loop, nothing important.

NmdMystery
  • 2,778
  • 3
  • 32
  • 60
  • Turn the debug flag on when creating device and swapchain, then you can get more details about the error. `UINT flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; #if defined( DEBUG ) || defined( _DEBUG ) flags |= D3D11_CREATE_DEVICE_DEBUG; #endif HRESULT hr; if (FAILED (hr = D3D11CreateDeviceAndSwapChain( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags,...` – zdd Jul 14 '14 at 01:32
  • @zdd I have that turned on, and the only extra info I get is that some unallocated part of the heap was written to. I traced all of my code and the address it gives me is completely unrelated to anything - the breakpoint is definitely being triggered by IDXGISwapChain::ResizeBuffers (to which I am passing no addresses, and the object itself is valid), though, since removing that line and its dependents gets rid of the crash. – NmdMystery Jul 14 '14 at 03:43
  • Can you post more related code please? – zdd Jul 17 '14 at 23:37

1 Answers1

1

This issue was fixed by showing the window before setting the swap chain's fullscreen state. Either call UpdateWindow(hwnd) and ShowWindow(hwnd, SW_SHOW) or set the window style to WS_VISIBLE when calling CreateWindow() or CreateWindowEx(), preferably before doing anything DirectX related.

NmdMystery
  • 2,778
  • 3
  • 32
  • 60