diff --git a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll index 74e3001..88ee6b5 100644 Binary files a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll and b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll differ diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index fb77285..5e18314 100644 Binary files a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll and b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll differ diff --git a/Assets/uDesktopDuplication/Scripts/Lib.cs b/Assets/uDesktopDuplication/Scripts/Lib.cs index 6ad47ef..25d72ca 100644 --- a/Assets/uDesktopDuplication/Scripts/Lib.cs +++ b/Assets/uDesktopDuplication/Scripts/Lib.cs @@ -163,6 +163,8 @@ public static class Lib [DllImport("uDesktopDuplication")] public static extern int SetTexturePtr(int id, IntPtr ptr); [DllImport("uDesktopDuplication")] + public static extern IntPtr GetSharedTextureHandle(int id); + [DllImport("uDesktopDuplication")] public static extern int GetMoveRectCount(int id); [DllImport("uDesktopDuplication", EntryPoint = "GetMoveRects")] private static extern IntPtr GetMoveRects_Internal(int id); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp index 32207a6..a43db8a 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp @@ -46,7 +46,7 @@ IUnityInterfaces* GetUnity() } -ComPtr GetDevice() +ComPtr GetUnityDevice() { return GetUnity()->Get()->GetDevice(); } @@ -62,7 +62,7 @@ LUID GetUnityAdapterLuid() { UDD_FUNCTION_SCOPE_TIMER - const auto device = GetDevice(); + const auto device = GetUnityDevice(); Microsoft::WRL::ComPtr dxgiDevice; if (FAILED(device->QueryInterface(IID_PPV_ARGS(&dxgiDevice)))){ diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h index c16554f..fbf2aaa 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h @@ -16,7 +16,7 @@ IUnityInterfaces* GetUnity(); // ID3D11Device (in Unity) getter struct ID3D11Device; -Microsoft::WRL::ComPtr GetDevice(); +Microsoft::WRL::ComPtr GetUnityDevice(); // Manager getter class MonitorManager; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp index e05e748..a0852ed 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp @@ -383,7 +383,7 @@ void Cursor::Draw(const Microsoft::WRL::ComPtr& texture) const auto capturedImageWidth = capturedImageArea_.right - capturedImageArea_.left; ComPtr context; - GetDevice()->GetImmediateContext(&context); + GetUnityDevice()->GetImmediateContext(&context); context->UpdateSubresource(texture.Get(), 0, &capturedImageArea_, bgraBuffer_.Get(), capturedImageWidth * 4, 0); } @@ -418,7 +418,7 @@ void Cursor::GetTexture(ID3D11Texture2D* texture) } ComPtr context; - GetDevice()->GetImmediateContext(&context); + GetUnityDevice()->GetImmediateContext(&context); context->UpdateSubresource(texture, 0, nullptr, bgraBuffer_.Get(), GetWidth() * 4, 0); } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp index 666593d..abc3566 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp @@ -306,6 +306,16 @@ void Duplicator::Duplicate(UINT timeout) context->CopyResource(sharedTexture.Get(), texture.Get()); } + + HANDLE sharedHandle; + ComPtr dxgiResource; + sharedTexture.As(&dxgiResource); + if (FAILED(dxgiResource->GetSharedHandle(&sharedHandle))) + { + Debug::Error("Duplicator::Duplicate() => Failed to get shared handle."); + return; + } + UpdateCursor(sharedTexture, frameInfo); UpdateMetadata(frameInfo.TotalMetadataBufferSize); @@ -315,6 +325,7 @@ void Duplicator::Duplicate(UINT timeout) { lastFrameId_++, sharedTexture, + sharedHandle, frameInfo, metaData_ }; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h index 2bdf53e..9a0f730 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h @@ -44,8 +44,9 @@ public: struct Frame { - UINT id; - Microsoft::WRL::ComPtr texture; + UINT id = 0; + Microsoft::WRL::ComPtr texture = nullptr; + HANDLE textureHandle = nullptr; DXGI_OUTDUPL_FRAME_INFO info; Metadata metaData; }; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp index 13629c8..9554c56 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -117,9 +117,19 @@ void Monitor::Render() } else { + ComPtr desktopTexture; + if (FAILED(GetUnityDevice()->OpenSharedResource( + frame.textureHandle, + __uuidof(ID3D11Texture2D), + &desktopTexture))) + { + Debug::Error("Monitor::Render() => Failed to open shared resource."); + return; + } + ComPtr context; - GetDevice()->GetImmediateContext(&context); - context->CopyResource(unityTexture_, frame.texture.Get()); + GetUnityDevice()->GetImmediateContext(&context); + context->CopyResource(unityTexture_, desktopTexture.Get()); auto& manager = GetMonitorManager(); if (id_ == manager->GetCursorMonitorId()) @@ -198,6 +208,15 @@ ID3D11Texture2D* Monitor::GetUnityTexture() const } +HANDLE Monitor::GetSharedTextureHandle() const +{ + UDD_FUNCTION_SCOPE_TIMER + + const auto& frame = duplicator_->GetLastFrame(); + return frame.textureHandle; +} + + ComPtr Monitor::GetDeskDupl() { return duplicator_->GetDuplication(); @@ -344,7 +363,7 @@ void Monitor::CopyTextureFromGpuToCpu(ID3D11Texture2D* texture) desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; desc.MiscFlags = 0; - if (FAILED(GetDevice()->CreateTexture2D(&desc, nullptr, &textureForGetPixels_))) + if (FAILED(GetUnityDevice()->CreateTexture2D(&desc, nullptr, &textureForGetPixels_))) { Debug::Error("Monitor::CopyTextureFromGpuToCpu() => GetDevice()->CreateTexture2D() failed."); return; @@ -353,7 +372,7 @@ void Monitor::CopyTextureFromGpuToCpu(ID3D11Texture2D* texture) { ComPtr context; - GetDevice()->GetImmediateContext(&context); + GetUnityDevice()->GetImmediateContext(&context); context->CopyResource(textureForGetPixels_.Get(), texture); } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h index 4fb48c7..d7bbdeb 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h @@ -33,6 +33,7 @@ public: DuplicatorState GetDuplicatorState() const; void SetUnityTexture(ID3D11Texture2D* texture); ID3D11Texture2D* GetUnityTexture() const; + HANDLE GetSharedTextureHandle() const; void GetName(char* buf, int len) const; bool IsPrimary() const; bool HasBeenUpdated() const; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index 06f7b6d..d767762 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -368,6 +368,16 @@ extern "C" } } + UNITY_INTERFACE_EXPORT void* UNITY_INTERFACE_API GetSharedTextureHandle(int id) + { + if (!g_manager) return nullptr; + if (auto monitor = g_manager->GetMonitor(id)) + { + return monitor->GetSharedTextureHandle(); + } + return nullptr; + } + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetMoveRectCount(int id) { if (!g_manager) return -1; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj index 2b3b26f..551fffd 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj @@ -21,33 +21,33 @@ {BC5DE2F9-BDCC-4449-A017-E5642E04BB56} uDesktopDuplication - 10.0.16299.0 + 10.0 uDesktopDuplication DynamicLibrary true - v140 + v142 MultiByte DynamicLibrary true - v140 + v142 MultiByte DynamicLibrary false - v140 + v142 true MultiByte DynamicLibrary false - v140 + v142 true MultiByte