diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index c7c4fee..2d43b31 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.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp index 3c59f5d..e4e92d0 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp @@ -6,6 +6,7 @@ #include "IUnityInterface.h" #include "IUnityGraphicsD3D11.h" #include "Common.h" +#include "Debug.h" using namespace Microsoft::WRL; @@ -33,6 +34,29 @@ const std::unique_ptr& GetMonitorManager() } +LUID GetUnityAdapterLuid() +{ + const auto device = GetUnity()->Get()->GetDevice(); + + Microsoft::WRL::ComPtr dxgiDevice; + if (FAILED(device->QueryInterface(IID_PPV_ARGS(&dxgiDevice)))){ + Debug::Error("QueryInterface from IUnityGraphicsD3D11 to IDXGIDevice1 failed."); + return LUID(); + } + + Microsoft::WRL::ComPtr dxgiAdapter; + if (FAILED(dxgiDevice->GetAdapter(&dxgiAdapter))) { + Debug::Error("QueryInterface from IDXGIDevice1 to IDXGIAdapter failed."); + return LUID(); + } + + DXGI_ADAPTER_DESC adapterDesc; + dxgiAdapter->GetDesc(&adapterDesc); + + return adapterDesc.AdapterLuid; +} + + void SendMessageToUnity(Message message) { g_messages.push(message); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h index 31a8c13..090785e 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h @@ -1,21 +1,25 @@ #pragma once +#include #include #include -// Unity interface and ID3D11Device getters +// Unity interface getter struct IUnityInterfaces; IUnityInterfaces* GetUnity(); +// ID3D11Device (in Unity) getter struct ID3D11Device; Microsoft::WRL::ComPtr GetDevice(); - // Manager getter class MonitorManager; const std::unique_ptr& GetMonitorManager(); +// Get adapter LUID to check the adapter of the monitor is same as Unity one. +LUID GetUnityAdapterLuid(); + // Message is pooled and fetch from Unity. enum class Message diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp index fceec28..e156008 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp @@ -29,7 +29,7 @@ MonitorManager::~MonitorManager() } -void MonitorManager::Initialize(LUID unityAdapterLuid, bool useThread) +void MonitorManager::Initialize() { Finalize(); @@ -54,15 +54,11 @@ void MonitorManager::Initialize(LUID unityAdapterLuid, bool useThread) for (int j = 0; (adapter->EnumOutputs(j, &output) != DXGI_ERROR_NOT_FOUND); ++j) { auto monitor = std::make_shared(id++); - if (useThread) { - monitor->InitializeThreaded(adapter - , desc.AdapterLuid.HighPart == unityAdapterLuid.HighPart - && desc.AdapterLuid.LowPart == unityAdapterLuid.LowPart - , output); - } - else { - monitor->Initialize(output.Get()); - } + const auto unityAdapterLuid = GetUnityAdapterLuid(); + monitor->InitializeThreaded(adapter + , desc.AdapterLuid.HighPart == unityAdapterLuid.HighPart + && desc.AdapterLuid.LowPart == unityAdapterLuid.LowPart + , output); monitors_.push_back(monitor); } } @@ -81,9 +77,8 @@ void MonitorManager::RequireReinitilization() } -void MonitorManager::Reinitialize(bool useThread) +void MonitorManager::Reinitialize() { - useThread_ = useThread; Debug::Log("MonitorManager::Reinitialize()"); Initialize(); SendMessageToUnity(Message::Reinitialized); @@ -137,7 +132,7 @@ void MonitorManager::Update() { if (isReinitializationRequired_) { - Reinitialize(useThread_); + Reinitialize(); isReinitializationRequired_ = false; } } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h index e4bc1c7..24d6204 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h @@ -15,7 +15,7 @@ class MonitorManager public: explicit MonitorManager(LUID unityAdapterLuid_); ~MonitorManager(); - void Reinitialize(bool useThread); + void Reinitialize(); bool HasMonitorCountChanged() const; void RequireReinitilization(); void SetCursorMonitorId(int id) { cursorMonitorId_ = id; } @@ -24,8 +24,7 @@ public: std::shared_ptr GetCursor() const; private: - void Initialize(){ Initialize(unityAdapterLuid_, useThread_); } - void Initialize(LUID unityAdapterLuid, bool useThread); + void Initialize(); void Finalize(); // Setters from Unity @@ -39,11 +38,9 @@ public: int GetMonitorCount() const; int GetTotalWidth() const; int GetTotalHeight() const; - bool UseThread()const { return useThread_; } private: LUID unityAdapterLuid_; - bool useThread_ = false; int timeout_ = 10; bool enableTextureCopyFromGpuToCpu_ = false; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index df4da29..3a0e8ee 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -106,12 +106,7 @@ extern "C" if (!g_manager) return; if (auto monitor = g_manager->GetMonitor(id)) { - if (g_manager->UseThread()) { - monitor->CopyTextureFromThread(); - } - else { - monitor->Render(g_manager->GetTimeout()); - } + monitor->CopyTextureFromThread(); } } @@ -120,10 +115,10 @@ extern "C" return OnRenderEvent; } - UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API Reinitialize(int useThread) + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API Reinitialize() { if (!g_manager) return; - return g_manager->Reinitialize(useThread); + return g_manager->Reinitialize(); } UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API Update() diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset index 417940f..5bbdb35 100644 Binary files a/ProjectSettings/GraphicsSettings.asset and b/ProjectSettings/GraphicsSettings.asset differ diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index ae41cb6..66e05aa 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1 @@ -m_EditorVersion: 5.4.2f2 -m_StandardAssetsVersion: 0 +m_EditorVersion: 5.5.0f3