2014-07-13 6 views
0

내 Direct3D 11 응용 프로그램이 전체 화면 모드에서 창 모드로 전환 될 때마다 IDXGISwapChain :: ResizeBuffers가 중단 점을 트리거합니다. Visual Studio 콘솔에서 "중요 오류 0xc0000374"라는 메시지가 인쇄되고 다른 정보는 표시되지 않습니다. 분명히 이것은 힙 손상이 발생했음을 의미합니다. 좋아. 창문이 불쾌하게 내 견해를 가리고 Visual Studio 창을 제어 할 수 없기 때문에 왜 이런 일이 발생했는지에 대한 더 이상의 정보를 얻을 수 없습니다.IDXGISwapChain :: ResizeBuffers는 전체 화면에서 창으로 전환 할 때 중단 점을 트리거합니다.

저는 this MSDN page에서 제안했습니다. 그 말은 내가 코드를 복사하여 붙여 넣었다는 뜻입니다.

이 내 설정 코드 (오류 검사의 부족을 무시) :

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

장치 및 스왑 체인을 만들 때 디버그 플래그를 켜면 오류에 대한 자세한 정보를 얻을 수 있습니다. 'UINT flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; #if 정의 (DEBUG) || 정의 됨 (_DEBUG) \t flags | = D3D11_CREATE_DEVICE_DEBUG; #endif \t HRESULT hr; \t 경우 (실패 (시간 = D3D11CreateDeviceAndSwapChain (NULL, \t D3D_DRIVER_TYPE_HARDWARE, \t \t NULL, \t \t 플래그 ...'나는이 켜져, 내가 얻을 수있는 유일한 추가 정보가 할당되지 않은 것을 것을이 – zdd

+0

@zdd 힙의 일부가 작성되었습니다. 모든 코드를 추적하고 나에게주는 주소는 아무 것도 관련이 없습니다. 중단 점이 IDXGISwapChain :: ResizeBuffers에 의해 확실히 트리거되고 있습니다 (어떤 주소도 전달하지 않고 객체 자체 그 라인과 그 부양 가족을 제거하면 충돌을 없애기 때문에). – NmdMystery

+0

관련 코드를 더 게시 할 수 있습니까? – zdd

답변

0

이 문제는 스왑 체인의 전체 화면 상태를 설정하기 전에 창을 표시하여 해결되었습니다. 과 ShowWindow(hwnd, SW_SHOW)을 호출하거나 CreateWindow() 또는 CreateWindowEx()으로 전화 할 때 창 스타일을 WS_VISIBLE으로 설정하십시오. DirectX와 관련된 작업을 수행하기 전에 수행하는 것이 좋습니다.