From f0821d9543b85c6acead185514c0dd4ec5a13f76 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 24 Nov 2025 18:49:19 -0600 Subject: [PATCH] Use D3D11_COPY_DISCARD when updating our video texture This ensures the driver knows it doesn't have to synchronize with the previous texture data. --- .../video/ffmpeg-renderers/d3d11va.cpp | 17 +++++++++++++++-- app/streaming/video/ffmpeg-renderers/d3d11va.h | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp index c8401c23..a4da3813 100644 --- a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp +++ b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp @@ -129,6 +129,7 @@ bool D3D11VARenderer::createDeviceByAdapterIndex(int adapterIndex, bool* adapter DXGI_ADAPTER_DESC1 adapterDesc; D3D_FEATURE_LEVEL featureLevel; HRESULT hr; + ComPtr deviceContext; SDL_assert(!m_Device); SDL_assert(!m_DeviceContext); @@ -178,7 +179,7 @@ bool D3D11VARenderer::createDeviceByAdapterIndex(int adapterIndex, bool* adapter D3D11_SDK_VERSION, &m_Device, &featureLevel, - &m_DeviceContext); + &deviceContext); if (FAILED(hr)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "D3D11CreateDevice() failed: %x", @@ -198,6 +199,16 @@ bool D3D11VARenderer::createDeviceByAdapterIndex(int adapterIndex, bool* adapter m_DevicesWithFL11Support++; } + hr = deviceContext.As(&m_DeviceContext); + if (FAILED(hr)) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "ID3D11DeviceContext::QueryInterface(ID3D11DeviceContext1) failed: %x", + hr); + m_DeviceContext.Reset(); + m_Device.Reset(); + goto Exit; + } + bool ok; m_BindDecoderOutputTextures = !!qEnvironmentVariableIntValue("D3D11VA_FORCE_BIND", &ok); if (!ok) { @@ -805,7 +816,9 @@ void D3D11VARenderer::renderVideo(AVFrame* frame) } else { // Copy this frame into our video texture - m_DeviceContext->CopySubresourceRegion(m_VideoTexture.Get(), 0, 0, 0, 0, (ID3D11Resource*)frame->data[0], (int)(intptr_t)frame->data[1], nullptr); + m_DeviceContext->CopySubresourceRegion1(m_VideoTexture.Get(), 0, 0, 0, 0, + (ID3D11Resource*)frame->data[0], (int)(intptr_t)frame->data[1], + nullptr, D3D11_COPY_DISCARD); // SRV 0 is always mapped to the video texture srvIndex = 0; diff --git a/app/streaming/video/ffmpeg-renderers/d3d11va.h b/app/streaming/video/ffmpeg-renderers/d3d11va.h index f62e2414..e1b36858 100644 --- a/app/streaming/video/ffmpeg-renderers/d3d11va.h +++ b/app/streaming/video/ffmpeg-renderers/d3d11va.h @@ -60,7 +60,7 @@ private: Microsoft::WRL::ComPtr m_Factory; Microsoft::WRL::ComPtr m_Device; Microsoft::WRL::ComPtr m_SwapChain; - Microsoft::WRL::ComPtr m_DeviceContext; + Microsoft::WRL::ComPtr m_DeviceContext; Microsoft::WRL::ComPtr m_RenderTargetView; SupportedFenceType m_FenceType; SDL_mutex* m_ContextLock;