diff --git a/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs index 72f4438..9a3bba5 100644 --- a/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs +++ b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs @@ -69,8 +69,6 @@ public class MultipleMonitorCreator : MonoBehaviour { ResetRemoveTimer(); - Debug.Log(uDesktopDuplication.Manager.monitorCount); - // Create monitors for (int i = 0; i < uDesktopDuplication.Manager.monitorCount; ++i) { // Create monitor obeject diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index bae1631..4075b35 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 e193cb8..5ee43e7 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h @@ -13,18 +13,6 @@ struct ID3D11Device; ID3D11Device* GetDevice(); -// Utility -template -auto MakeUniqueWithReleaser(T* ptr) -{ - const auto deleter = [](T* ptr) - { - if (ptr != nullptr) ptr->Release(); - }; - return std::unique_ptr(ptr, deleter); -} - - // Manager getter class MonitorManager; const std::unique_ptr& GetMonitorManager(); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp index 6c60b02..e02520c 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp @@ -1,10 +1,13 @@ #include +#include #include "Common.h" #include "Debug.h" #include "MonitorManager.h" #include "Monitor.h" #include "Cursor.h" +using namespace Microsoft::WRL; + Cursor::Cursor(Monitor* monitor) : monitor_(monitor) @@ -149,9 +152,8 @@ void Cursor::UpdateTexture() desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; desc.MiscFlags = 0; - ID3D11Texture2D* texture = nullptr; + ComPtr texture; hr = GetDevice()->CreateTexture2D(&desc, nullptr, &texture); - const auto textureReleaser = MakeUniqueWithReleaser(texture); if (FAILED(hr)) { Debug::Error("Cursor::UpdateTexture() => GetDevice()->CreateTexture2D() failed."); @@ -172,14 +174,14 @@ void Cursor::UpdateTexture() return; } - ID3D11DeviceContext* context; - GetDevice()->GetImmediateContext(&context); - context->CopySubresourceRegion(texture, 0, 0, 0, 0, monitor_->GetUnityTexture(), 0, &box); - context->Release(); + { + ComPtr context; + GetDevice()->GetImmediateContext(&context); + context->CopySubresourceRegion(texture.Get(), 0, 0, 0, 0, monitor_->GetUnityTexture(), 0, &box); + } - IDXGISurface* surface = nullptr; - hr = texture->QueryInterface(__uuidof(IDXGISurface), (void**)&surface); - const auto surfaceReleaser = MakeUniqueWithReleaser(surface); + ComPtr surface; + hr = texture.As(&surface); if (FAILED(hr)) { Debug::Error("Cursor::UpdateTexture() => texture->QueryInterface() failed."); @@ -286,10 +288,9 @@ void Cursor::GetTexture(ID3D11Texture2D* texture) return; } - ID3D11DeviceContext* context; + ComPtr 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 0875412..12577b1 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -6,6 +6,8 @@ #include "MonitorManager.h" #include "Monitor.h" +using namespace Microsoft::WRL; + Monitor::Monitor(int id) : id_(id) @@ -28,17 +30,14 @@ void Monitor::Initialize(IDXGIOutput* output) GetDpiForMonitor(outputDesc_.Monitor, MDT_RAW_DPI, &dpiX_, &dpiY_); auto output1 = reinterpret_cast(output); - IDXGIOutputDuplication* deskDupl; - const auto hr = output1->DuplicateOutput(GetDevice(), &deskDupl); + const auto hr = output1->DuplicateOutput(GetDevice(), &deskDupl_); // TODO: error check switch (hr) { case S_OK: state_ = State::Available; - deskDupl_ = std::shared_ptr( - deskDupl, - [](IDXGIOutputDuplication* ptr) { if (ptr != nullptr) ptr->Release(); }); + Debug::Log("Monitor::Initialize() => OK."); break; case E_INVALIDARG: state_ = State::InvalidArg; @@ -73,12 +72,11 @@ void Monitor::Render(UINT timeout) { if (!deskDupl_) return; - IDXGIResource* resource = nullptr; + ComPtr resource; DXGI_OUTDUPL_FRAME_INFO frameInfo; HRESULT hr; hr = deskDupl_->AcquireNextFrame(timeout, &frameInfo, &resource); - const auto resourceReleaser = MakeUniqueWithReleaser(resource); if (FAILED(hr)) { switch (hr) @@ -107,13 +105,12 @@ void Monitor::Render(UINT timeout) if (unityTexture_) { - ID3D11Texture2D* texture; - resource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&texture)); + ComPtr texture; + resource.As(&texture); - ID3D11DeviceContext* context; + ComPtr context; GetDevice()->GetImmediateContext(&context); - context->CopyResource(unityTexture_, texture); - context->Release(); + context->CopyResource(unityTexture_, texture.Get()); } cursor_->UpdateBuffer(frameInfo); @@ -151,7 +148,7 @@ ID3D11Texture2D* Monitor::GetUnityTexture() const } -const std::shared_ptr& Monitor::GetDeskDupl() +const ComPtr& Monitor::GetDeskDupl() { return deskDupl_; } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h index 39a67d0..dff70ff 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h @@ -2,6 +2,7 @@ #include #include +#include #include class Cursor; @@ -45,7 +46,7 @@ public: int GetRotation() const; int GetDpiX() const; int GetDpiY() const; - const std::shared_ptr& GetDeskDupl(); + const Microsoft::WRL::ComPtr& GetDeskDupl(); const std::unique_ptr& GetCursor(); private: @@ -53,7 +54,7 @@ private: UINT dpiX_ = -1, dpiY_ = -1; State state_ = State::NotSet; std::unique_ptr cursor_; - std::shared_ptr deskDupl_; + Microsoft::WRL::ComPtr deskDupl_; ID3D11Texture2D* unityTexture_ = nullptr; DXGI_OUTPUT_DESC outputDesc_; MONITORINFOEX monitorInfo_; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp index 0877fbd..960205c 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -12,6 +13,8 @@ #include "Cursor.h" #include "MonitorManager.h" +using namespace Microsoft::WRL; + MonitorManager::MonitorManager() { @@ -30,23 +33,20 @@ void MonitorManager::Initialize() Finalize(); // Get factory - IDXGIFactory1* factory; - CreateDXGIFactory1(__uuidof(IDXGIFactory1), reinterpret_cast(&factory)); - const auto factoryReleaser = MakeUniqueWithReleaser(factory); + ComPtr factory; + CreateDXGIFactory1(IID_PPV_ARGS(&factory)); // Check all display adapters int id = 0; - IDXGIAdapter1* adapter; + ComPtr adapter; for (int i = 0; (factory->EnumAdapters1(i, &adapter) != DXGI_ERROR_NOT_FOUND); ++i) { - const auto adapterReleaser = MakeUniqueWithReleaser(adapter); // Search the main monitor from all outputs - IDXGIOutput* output; + ComPtr output; for (int j = 0; (adapter->EnumOutputs(j, &output) != DXGI_ERROR_NOT_FOUND); ++j) { - const auto outputReleaser = MakeUniqueWithReleaser(output); auto monitor = std::make_shared(id++); - monitor->Initialize(output); + monitor->Initialize(output.Get()); monitors_.push_back(monitor); } }