summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorJøger Hansegård <joger.hansegard@qt.io>2024-04-10 12:44:08 +0200
committerJøger Hansegård <joger.hansegard@qt.io>2024-04-11 19:21:44 +0200
commit7f8463398608e3cd3b4b3bfed7b682e95f68de05 (patch)
tree7eaa100b879164caf1afc97d82cf99ec246506f9 /src/plugins
parent1f568e5933e4d60a1b15222f53448092aa6e83f0 (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.cpp12
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpeghwaccel_d3d11_p.h1
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;