diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 2d43b31..5b10eb2 100644 Binary files a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll and b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll differ diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h index 090785e..2606a62 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h @@ -5,6 +5,7 @@ #include + // Unity interface getter struct IUnityInterfaces; IUnityInterfaces* GetUnity(); @@ -21,6 +22,21 @@ const std::unique_ptr& GetMonitorManager(); LUID GetUnityAdapterLuid(); + +// Releaser +class ScopedReleaser +{ +public: + using ReleaseFuncType = std::function; + ScopedReleaser(ReleaseFuncType&& func) : func_(func) {} + ~ScopedReleaser() { func_(); } + +private: + ReleaseFuncType func_; +}; + + + // Message is pooled and fetch from Unity. enum class Message { @@ -32,6 +48,7 @@ enum class Message void SendMessageToUnity(Message message); + // Buffer template class Buffer diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/ThreadedDesktopDuplicator.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/ThreadedDesktopDuplicator.cpp index a9a9082..da51d2a 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/ThreadedDesktopDuplicator.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/ThreadedDesktopDuplicator.cpp @@ -78,25 +78,6 @@ public: }; -// RAII helper -class ReleaseGuard -{ - ComPtr m_dd; - - ReleaseGuard(const ReleaseGuard &)=delete; - ReleaseGuard& operator=(const ReleaseGuard &)=delete; -public: - ReleaseGuard(const ComPtr &dd) - : m_dd(dd) - {} - - ~ReleaseGuard() - { - m_dd->ReleaseFrame(); - } -}; - - struct QueueItem { ComPtr Texture; @@ -357,7 +338,33 @@ void Monitor::DuplicateAndCopyLoop() } else { - ReleaseGuard guard(deskDupl_); + ScopedReleaser releaser([this] + { + const auto hr = deskDupl_->ReleaseFrame(); + if (FAILED(hr)) + { + switch (hr) + { + case DXGI_ERROR_ACCESS_LOST: + { + Debug::Log("Monitor::Render() => DXGI_ERROR_ACCESS_LOST."); + state_ = State::AccessLost; + break; + } + case DXGI_ERROR_INVALID_CALL: + { + Debug::Error("Monitor::Render() => DXGI_ERROR_INVALID_CALL."); + break; + } + default: + { + state_ = State::Unknown; + Debug::Error("Monitor::Render() => Unknown Error."); + break; + } + } + } + }); ComPtr texture; if (FAILED(resource.As(&texture))) {