使用相同的 HWND 时,D3D11CreateDeviceAndSwapChain 失败并出现 E_ACCESSDENIED

问题描述 投票:0回答:1

如果我创建一个窗口并将 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();
    }
c++ directx
1个回答
3
投票

虽然

D3D11CreateDeviceAndSwapChain
没有在文档中提及为什么会发生这种情况,但它本质上只是创建
D3D11Device
和交换链的包装。 IDXGIFactory2::CreateSwapChainForHwnd 的文档详细说明了为什么会发生这种情况。

由于您一次只能将一个翻转演示模型交换链与 HWND 关联,因此,如果您尝试销毁翻转演示模型交换链并将其替换为另一个交换链,则延迟对象销毁的 Microsoft Direct3D 11 策略可能会导致问题链。有关这种情况的更多信息,请参阅翻转演示交换链的延迟销毁问题

有关翻转演示交换链的延迟销毁问题的文档建议先调用

ID3D11DeviceContext::ClearState
,然后调用
ID3D11DeviceContext::Flush

但是,如果应用程序实际上必须销毁旧的交换链并创建新的交换链,则应用程序必须强制销毁应用程序释放的所有对象。要强制销毁,请调用 ID3D11DeviceContext::ClearState(或以其他方式确保没有视图绑定到管道状态),然后对直接上下文调用 Flush。在再次调用 IDXGIFactory2::CreateSwapChainForHwnd、IDXGIFactory2::CreateSwapChainForCoreWindow 或 IDXGIFactory2::CreateSwapChainForComposition 来创建新的交换链之前,必须强制销毁。

© www.soinside.com 2019 - 2024. All rights reserved.