diff options
author | Jøger Hansegård <joger.hansegard@qt.io> | 2024-04-10 12:44:08 +0200 |
---|---|---|
committer | Jøger Hansegård <joger.hansegard@qt.io> | 2024-04-11 19:21:44 +0200 |
commit | 7f8463398608e3cd3b4b3bfed7b682e95f68de05 (patch) | |
tree | 7eaa100b879164caf1afc97d82cf99ec246506f9 /src/plugins | |
parent | 1f568e5933e4d60a1b15222f53448092aa6e83f0 (diff) |
Recreate all Direct3D resources when FFmpeg device changed
When recalling a video file, FFmpeg recreates the underlying decoder
Direct3D device. All resources created on the previous device must
therefore be recreated.
Previously, we did not recreate all Direct3D resources if the opened
media file had the same size and format as previously loaded file.
This patch checks if the FFmpeg device has changed, and recreates
a temporary texture if needed.
Also, we add a check to recreate necessary resources if the RHI device
has changed.
Fixes: QTBUG-124253
Pick-to: 6.5 6.7
Change-Id: Ibe626c8dd6cdb8c05591a9b635e82647afa16042
Reviewed-by: Lars Sutterud <lars.sutterud@qt.io>
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Reviewed-by: Pavel Dubsky <pavel.dubsky@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11.cpp | 12 | ||||
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11_p.h | 1 |
2 files changed, 10 insertions, 3 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11.cpp b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11.cpp index ff0ca2dfc..d52fde79c 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11.cpp @@ -89,10 +89,16 @@ ComPtr<ID3D11Texture2D> TextureBridge::copyFromSharedTex(const ComPtr<ID3D11Devi bool TextureBridge::ensureDestTex(const ComPtr<ID3D11Device1> &dev) { + if (m_destDevice != dev) { + // Destination device changed. Recreate texture. + m_destTex = nullptr; + m_destDevice = dev; + } + if (m_destTex) return true; - if (dev->OpenSharedResource1(m_sharedHandle.get(), IID_PPV_ARGS(&m_destTex)) != S_OK) + if (m_destDevice->OpenSharedResource1(m_sharedHandle.get(), IID_PPV_ARGS(&m_destTex)) != S_OK) return false; CD3D11_TEXTURE2D_DESC desc{}; @@ -101,7 +107,7 @@ bool TextureBridge::ensureDestTex(const ComPtr<ID3D11Device1> &dev) desc.MiscFlags = 0; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - if (dev->CreateTexture2D(&desc, nullptr, m_outputTex.ReleaseAndGetAddressOf()) != S_OK) + if (m_destDevice->CreateTexture2D(&desc, nullptr, m_outputTex.ReleaseAndGetAddressOf()) != S_OK) return false; if (m_destTex.As(&m_destMutex) != S_OK) @@ -127,7 +133,7 @@ bool TextureBridge::isSrcInitialized(const ID3D11Device *dev, // Check if device has changed ComPtr<ID3D11Device> texDevice; - tex->GetDevice(texDevice.GetAddressOf()); + m_srcTex->GetDevice(texDevice.GetAddressOf()); if (dev != texDevice.Get()) return false; diff --git a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11_p.h b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11_p.h index 604e761c0..bfcc1f10c 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11_p.h +++ b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11_p.h @@ -73,6 +73,7 @@ private: ComPtr<IDXGIKeyedMutex> m_srcMutex; const UINT m_destKey = 1; + ComPtr<ID3D11Device1> m_destDevice; ComPtr<ID3D11Texture2D> m_destTex; ComPtr<IDXGIKeyedMutex> m_destMutex; |