From 58e14d76d85aec589e83db6f8af66710fdde5d81 Mon Sep 17 00:00:00 2001 From: hecomi Date: Tue, 15 Nov 2016 03:06:55 +0900 Subject: [PATCH] make code more stable (still has crash bug). --- .../Plugins/x86_64/uDesktopDuplication.dll | Bin 69632 -> 69120 bytes .../uDesktopDuplication/Common.h | 11 +++++++ .../uDesktopDuplication/Cursor.cpp | 28 ++++++++++-------- .../uDesktopDuplication/Monitor.cpp | 18 ++++++----- .../uDesktopDuplication/Monitor.h | 4 +-- 5 files changed, 40 insertions(+), 21 deletions(-) diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 9a666f6c2622b31e86f989b8b3f7eaf48366b978..3e587b8c5dfb505987d1c674a8b7a4f3ed913699 100644 GIT binary patch delta 23667 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 GetMonitorManager(); +template +auto MakeUniqueWithReleaser(T* ptr) +{ + const auto deleter = [](T* ptr) + { + if (ptr != nullptr) ptr->Release(); + }; + return std::unique_ptr(ptr, deleter); +} + + // Message is pooled and fetch from Unity. enum class Message { diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp index 11fc2ab..5c79d00 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp @@ -58,12 +58,12 @@ void Cursor::UpdateBuffer(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) // Get mouse pointer information UINT bufferSize; DXGI_OUTDUPL_POINTER_SHAPE_INFO shapeInfo; - if (FAILED( - monitor_->GetDeskDupl()->GetFramePointerShape( - apiBufferSize_, - reinterpret_cast(apiBuffer_.get()), - &bufferSize, - &shapeInfo))) + const auto hr = monitor_->GetDeskDupl()->GetFramePointerShape( + apiBufferSize_, + reinterpret_cast(apiBuffer_.get()), + &bufferSize, + &shapeInfo); + if (FAILED(hr)) { Debug::Error("Cursor::UpdateBuffer() => GetFramePointerShape() failed."); apiBuffer_.reset(); @@ -149,12 +149,13 @@ void Cursor::UpdateTexture() desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; desc.MiscFlags = 0; - ComPtr texture; + ID3D11Texture2D* texture; if (FAILED(GetDevice()->CreateTexture2D(&desc, nullptr, &texture))) { Debug::Error("Cursor::UpdateTexture() => GetDevice()->CreateTexture2D() failed."); return; } + const auto textureReleaser = MakeUniqueWithReleaser(texture); D3D11_BOX box; box.front = 0; @@ -170,16 +171,18 @@ void Cursor::UpdateTexture() return; } - ComPtr context; + ID3D11DeviceContext* context; GetDevice()->GetImmediateContext(&context); - context->CopySubresourceRegion(texture.Get(), 0, 0, 0, 0, monitor_->GetUnityTexture(), 0, &box); + context->CopySubresourceRegion(texture, 0, 0, 0, 0, monitor_->GetUnityTexture(), 0, &box); + context->Release(); - ComPtr surface; - if (FAILED(texture.As(&surface))) + IDXGISurface* surface; + if (FAILED(texture->QueryInterface(&surface))) { Debug::Error("Cursor::UpdateTexture() => texture->QueryInterface() failed."); return; } + const auto surfaceReleaser = MakeUniqueWithReleaser(surface); DXGI_MAPPED_RECT mappedSurface; if (FAILED(surface->Map(&mappedSurface, DXGI_MAP_READ))) @@ -279,9 +282,10 @@ void Cursor::GetTexture(ID3D11Texture2D* texture) return; } - ComPtr context; + ID3D11DeviceContext* context; GetDevice()->GetImmediateContext(&context); context->UpdateSubresource(texture, 0, nullptr, bgra32Buffer_.get(), GetWidth() * 4, 0); + context->Release(); } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp index bf82481..93c51aa 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -18,7 +18,10 @@ Monitor::Monitor(int id) Monitor::~Monitor() { - deskDupl_->Release(); + if (deskDupl_) + { + deskDupl_->Release(); + } } @@ -110,7 +113,7 @@ void Monitor::Render(UINT timeout) { if (!deskDupl_) return; - ComPtr resource; + IDXGIResource* resource; DXGI_OUTDUPL_FRAME_INFO frameInfo; const auto hr = deskDupl_->AcquireNextFrame(timeout, &frameInfo, &resource); @@ -154,8 +157,8 @@ void Monitor::Render(UINT timeout) if (unityTexture_) { - ComPtr texture; - if (FAILED(resource.As(&texture))) + ID3D11Texture2D* texture; + if (FAILED(resource->QueryInterface(&texture))) { Debug::Error("Monitor::Render() => resource.As() failed."); return; @@ -178,9 +181,10 @@ void Monitor::Render(UINT timeout) } else { - ComPtr context; + ID3D11DeviceContext* context; GetDevice()->GetImmediateContext(&context); - context->CopyResource(unityTexture_, texture.Get()); + context->CopyResource(unityTexture_, texture); + context->Release(); } } @@ -218,7 +222,7 @@ ID3D11Texture2D* Monitor::GetUnityTexture() const } -const ComPtr& Monitor::GetDeskDupl() +IDXGIOutputDuplication* Monitor::GetDeskDupl() { return deskDupl_; } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h index 820f51a..b7c3af4 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h @@ -48,7 +48,7 @@ public: int GetRotation() const; int GetDpiX() const; int GetDpiY() const; - const Microsoft::WRL::ComPtr& GetDeskDupl(); + IDXGIOutputDuplication* GetDeskDupl(); const std::unique_ptr& GetCursor(); private: @@ -57,7 +57,7 @@ private: int width_ = -1, height_ = -1; State state_ = State::NotSet; std::unique_ptr cursor_; - Microsoft::WRL::ComPtr deskDupl_; + IDXGIOutputDuplication* deskDupl_ = nullptr; ID3D11Texture2D* unityTexture_ = nullptr; DXGI_OUTPUT_DESC outputDesc_; MONITORINFOEX monitorInfo_;