aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Fedchin <afedchin@users.noreply.github.com>2018-03-29 11:57:50 +0300
committerGitHub <noreply@github.com>2018-03-29 11:57:50 +0300
commit26233c72ba7d5922db0f78e3865abacb04851ebc (patch)
tree5715708258a051c46bb8a5fc0c66c543121387aa
parent7a4609f2a50a1757d755987e1e760ca140591d9a (diff)
parentc355791144c746e6677108cb8a0dd681640f66c2 (diff)
Merge pull request #13709 from afedchin/dx-protect
[windows] protect device context with mutex.
-rw-r--r--xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp12
-rw-r--r--xbmc/rendering/dx/DeviceResources.cpp11
-rw-r--r--xbmc/rendering/dx/DeviceResources.h2
-rw-r--r--xbmc/rendering/dx/RenderSystemDX.cpp32
-rw-r--r--xbmc/rendering/dx/RenderSystemDX.h6
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;
};