Если я создам окно и передам HWND в D3D11CreateDeviceAndSwapChain, оно сработает. Однако после того, как я освобождаю устройство, контекст, цепочку обмена и т. д. и пытаюсь повторить процесс с тем же HWND, D3D11CreateDeviceAndSwapChain завершается с ошибкой E_ACCESSDENIED. Это говорит мне о том, что что-то должно удерживать HWND, но что? Я освобождаю все свои глобальные переменные в деструкторе класса. Кто-нибудь знает, в чем проблема?
~decoder()
{
m_VertexShader->Release();
m_VertexShader = nullptr;
m_PixelShader->Release();
m_PixelShader = nullptr;
m_InputLayout->Release();
m_InputLayout = nullptr;
device->Release();
device = nullptr;
context->Release();
context = nullptr;
swapchain->Release();
swapchain = nullptr;
rendertargetview->Release();
rendertargetview = nullptr;
m_SamplerLinear->Release();
m_SamplerLinear = nullptr;
HRESULT hr = S_OK;
hr = decoder_transform->ProcessMessage(MFT_MESSAGE_NOTIFY_END_OF_STREAM, NULL);
hr = decoder_transform->ProcessMessage(MFT_MESSAGE_NOTIFY_END_STREAMING, NULL);
hr = decoder_transform->ProcessMessage(MFT_MESSAGE_COMMAND_FLUSH, NULL);
decoder_transform.Release();
color_transform.Release();
hr = MFShutdown();
}
Хотя D3D11CreateDeviceAbdSwapChain
не упоминает в документации, почему это происходит, по сути, это просто оболочка для создания цепочки D3D11Device
и обмена. В документации для IDXGIFactory2::CreateSwapChainForHwnd подробно описано, почему это происходит.
Because you can associate only one flip presentation model swap chain at a time with an HWND, the Microsoft Direct3D 11 policy of deferring the destruction of objects can cause problems if you attempt to destroy a flip presentation model swap chain and replace it with another swap chain. For more info about this situation, see Deferred Destruction Issues with Flip Presentation Swap Chains.
В документации по Проблемы с отложенным уничтожением в цепочках обмена презентациями с переворотом рекомендуется вызывать ID3D11DeviceContext::ClearState
, за которым следует ID3D11DeviceContext::Flush
.
However, if an application must actually destroy an old swap chain and create a new swap chain, the application must force the destruction of all objects that the application freed. To force the destruction, call ID3D11DeviceContext::ClearState (or otherwise ensure no views are bound to pipeline state), and then call Flush on the immediate context. You must force destruction before you call IDXGIFactory2::CreateSwapChainForHwnd, IDXGIFactory2::CreateSwapChainForCoreWindow, or IDXGIFactory2::CreateSwapChainForComposition again to create a new swap chain.
См. также walbourn.github.io/anatomy-of-direct3d-11-create-device
Можете ли вы опубликовать это как решение, чтобы я мог его принять? После выпуска m_SamplerLinear я добавил context->ClearState() и context->Flush() и переместил context->Release() после того, что исправило это. Большое спасибо!