diff options
author | Anton Fedchin <afedchin@users.noreply.github.com> | 2018-03-29 11:57:50 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-29 11:57:50 +0300 |
commit | 26233c72ba7d5922db0f78e3865abacb04851ebc (patch) | |
tree | 5715708258a051c46bb8a5fc0c66c543121387aa | |
parent | 7a4609f2a50a1757d755987e1e760ca140591d9a (diff) | |
parent | c355791144c746e6677108cb8a0dd681640f66c2 (diff) |
Merge pull request #13709 from afedchin/dx-protect
[windows] protect device context with mutex.
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp | 12 | ||||
-rw-r--r-- | xbmc/rendering/dx/DeviceResources.cpp | 11 | ||||
-rw-r--r-- | xbmc/rendering/dx/DeviceResources.h | 2 | ||||
-rw-r--r-- | xbmc/rendering/dx/RenderSystemDX.cpp | 32 | ||||
-rw-r--r-- | xbmc/rendering/dx/RenderSystemDX.h | 6 |
5 files changed, 23 insertions, 40 deletions
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp index fccb80a564..679f9ea4f5 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp @@ -1118,17 +1118,6 @@ bool CDecoder::GetPicture(AVCodecContext* avctx, VideoPicture* picture) picture->videoBuffer = m_videoBuffer; m_videoBuffer = nullptr; - int queued, discard, free; - m_processInfo.GetRenderBuffers(queued, discard, free); - if (free > 1) - { - DX::Windowing().RequestDecodingTime(); - } - else - { - DX::Windowing().ReleaseDecodingTime(); - } - return true; } @@ -1242,6 +1231,7 @@ bool CDecoder::OpenDecoder() m_context->decoder = m_decoder.Get(); m_context->video_context = m_vcontext.Get(); + m_context->context_mutex = DX::Windowing().GetContexMutex(); return true; } diff --git a/xbmc/rendering/dx/DeviceResources.cpp b/xbmc/rendering/dx/DeviceResources.cpp index ebc9525533..cef629cd26 100644 --- a/xbmc/rendering/dx/DeviceResources.cpp +++ b/xbmc/rendering/dx/DeviceResources.cpp @@ -75,13 +75,18 @@ DX::DeviceResources::DeviceResources() , m_deviceNotify(nullptr) , m_stereoEnabled(false) , m_bDeviceCreated(false) + , m_ctx_mutex(INVALID_HANDLE_VALUE) { + m_ctx_mutex = CreateMutexExW(nullptr, nullptr, 0, SYNCHRONIZE); } DX::DeviceResources::~DeviceResources() { if (m_bDeviceCreated) Release(); + if (m_ctx_mutex != INVALID_HANDLE_VALUE) + CloseHandle(m_ctx_mutex); + m_ctx_mutex = INVALID_HANDLE_VALUE; } void DX::DeviceResources::Release() @@ -843,6 +848,9 @@ void DX::DeviceResources::Present() FinishCommandList(); m_d3dContext->Flush(); + if (m_ctx_mutex != INVALID_HANDLE_VALUE) + WaitForSingleObjectEx(m_ctx_mutex, INFINITE, FALSE); + // The first argument instructs DXGI to block until VSync, putting the application // to sleep until the next VSync. This ensures we don't waste any cycles rendering // frames that will never be displayed to the screen. @@ -864,6 +872,9 @@ void DX::DeviceResources::Present() } } + if (m_ctx_mutex != INVALID_HANDLE_VALUE) + ReleaseMutex(m_ctx_mutex); + if (m_d3dContext == m_deferrContext) { m_deferrContext->OMSetRenderTargets(1, m_backBufferTex.GetAddressOfRTV(), m_d3dDepthStencilView.Get()); diff --git a/xbmc/rendering/dx/DeviceResources.h b/xbmc/rendering/dx/DeviceResources.h index 3475802dbb..5c5a7be6e5 100644 --- a/xbmc/rendering/dx/DeviceResources.h +++ b/xbmc/rendering/dx/DeviceResources.h @@ -134,6 +134,7 @@ namespace DX void SetWindow(Windows::UI::Core::CoreWindow^ window); void SetWindowPos(Windows::Foundation::Rect rect); #endif // TARGET_WINDOWS_STORE + HANDLE GetContexMutex() const { return m_ctx_mutex; } private: class CBackBuffer : public CD3DTexture @@ -190,5 +191,6 @@ namespace DX std::vector<ID3DResource*> m_resources; bool m_stereoEnabled; bool m_bDeviceCreated; + HANDLE m_ctx_mutex; }; }
\ No newline at end of file diff --git a/xbmc/rendering/dx/RenderSystemDX.cpp b/xbmc/rendering/dx/RenderSystemDX.cpp index 15f8e5d783..ae4dc77ba6 100644 --- a/xbmc/rendering/dx/RenderSystemDX.cpp +++ b/xbmc/rendering/dx/RenderSystemDX.cpp @@ -285,33 +285,9 @@ void CRenderSystemDX::PresentRender(bool rendered, bool videoLayer) CD3DHelper::PSClearShaderResources(m_pContext); } - // time for decoder that may require the context - { - CSingleLock lock(m_decoderSection); - XbmcThreads::EndTime timer; - timer.Set(5); - while (!m_decodingTimer.IsTimePast() && !timer.IsTimePast()) - { - m_decodingEvent.wait(lock, 1); - } - } - PresentRenderImpl(rendered); } -void CRenderSystemDX::RequestDecodingTime() -{ - CSingleLock lock(m_decoderSection); - m_decodingTimer.Set(3); -} - -void CRenderSystemDX::ReleaseDecodingTime() -{ - CSingleLock lock(m_decoderSection); - m_decodingTimer.SetExpired(); - m_decodingEvent.notify(); -} - bool CRenderSystemDX::BeginRender() { if (!m_bRenderCreated) @@ -680,6 +656,14 @@ void CRenderSystemDX::SetAlphaBlendEnable(bool enable) m_BlendEnabled = enable; } +HANDLE CRenderSystemDX::GetContexMutex() const +{ + if (m_deviceResources) + return m_deviceResources->GetContexMutex(); + + return INVALID_HANDLE_VALUE; +} + CD3DTexture* CRenderSystemDX::GetBackBuffer() { if (m_stereoView == RENDER_STEREO_VIEW_RIGHT && m_rightEyeTex.Get()) diff --git a/xbmc/rendering/dx/RenderSystemDX.h b/xbmc/rendering/dx/RenderSystemDX.h index ccb816c9c9..ee554303d5 100644 --- a/xbmc/rendering/dx/RenderSystemDX.h +++ b/xbmc/rendering/dx/RenderSystemDX.h @@ -85,9 +85,8 @@ public: CD3DTexture* GetBackBuffer(); void FlushGPU() const; - void RequestDecodingTime(); - void ReleaseDecodingTime(); void SetAlphaBlendEnable(bool enable); + HANDLE GetContexMutex() const; // empty overrides bool IsExtSupported(const char* extension) const override { return false; }; @@ -127,9 +126,6 @@ protected: // stereo interlaced/checkerboard intermediate target CD3DTexture m_rightEyeTex; - XbmcThreads::EndTime m_decodingTimer; - XbmcThreads::ConditionVariable m_decodingEvent; - std::shared_ptr<DX::DeviceResources> m_deviceResources; }; |