From 9e42fb0abf8e67c45097d115b5cbf3a4f9f46f96 Mon Sep 17 00:00:00 2001 From: hecomi Date: Sun, 6 Nov 2016 03:30:21 +0900 Subject: [PATCH] there is only one cursor in screens. --- .../Plugins/uDesktopDuplication.dll | Bin 34304 -> 34304 bytes Assets/uDesktopDuplication/Scripts/Cursor.cs | 7 +- Assets/uDesktopDuplication/Scripts/Lib.cs | 2 +- Assets/uDesktopDuplication/Scripts/Manager.cs | 28 +++-- Assets/uDesktopDuplication/Scripts/Monitor.cs | 25 ++++- .../uDesktopDuplication/Cursor.cpp | 96 ++++++++++-------- .../uDesktopDuplication/Cursor.h | 6 +- .../uDesktopDuplication/Monitor.cpp | 27 +++-- .../uDesktopDuplication/Monitor.h | 2 +- .../uDesktopDuplication/main.cpp | 4 +- 10 files changed, 128 insertions(+), 69 deletions(-) diff --git a/Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll index 4bbc5076f6e7783f95bd0c6133e92966d3de30a1..db746b12534fb64721f139cdeb3cb8d22cb94c29 100644 GIT binary patch delta 7315 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 F_#fPXhu;7I delta 7259 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 + if (manager) { + manager.Awake(); + instance_ = manager; + return instance_; + } + var go = new GameObject("uDesktopDuplicationManager"); return go.AddComponent(); } @@ -81,12 +91,19 @@ public class Manager : MonoBehaviour UpdateMessage(); } + [ContextMenu("Reinitialize")] + void Reinitialize() + { + Lib.Reinitialize(); + } + void ReinitializeIfNeeded() { for (int i = 0; i < monitors.Count; ++i) { var monitor = monitors[i]; if (monitor.state == MonitorState.AccessLost || - monitor.state == MonitorState.AccessDenied) { + monitor.state == MonitorState.AccessDenied || + monitor.state == MonitorState.SessionDisconnected) { if (!shouldReinitialize) { shouldReinitialize = true; reinitializationTimer = 0f; @@ -97,7 +114,7 @@ public class Manager : MonoBehaviour if (shouldReinitialize) { if (reinitializationTimer > retryReinitializationDuration) { - Lib.Reinitialize(); + Reinitialize(); shouldReinitialize = false; } reinitializationTimer += Time.deltaTime; @@ -110,8 +127,7 @@ public class Manager : MonoBehaviour while (message != Message.None) { switch (message) { case Message.Reinitialized: - Debug.Log("Reinitialize"); - Reinitialize(); + ReinitializeMonitors(); break; default: break; @@ -141,7 +157,7 @@ public class Manager : MonoBehaviour } } - void Reinitialize() + void ReinitializeMonitors() { for (int i = 0; i < monitorCount; ++i) { if (i == monitors.Count) { diff --git a/Assets/uDesktopDuplication/Scripts/Monitor.cs b/Assets/uDesktopDuplication/Scripts/Monitor.cs index b2d2f06..baeea76 100644 --- a/Assets/uDesktopDuplication/Scripts/Monitor.cs +++ b/Assets/uDesktopDuplication/Scripts/Monitor.cs @@ -8,6 +8,27 @@ public class Monitor public Monitor(int id) { this.id = id; + + switch (state) + { + case MonitorState.InvalidArg: + Debug.LogErrorFormat("[{0}:{1}] Invalid.", id, name); + break; + case MonitorState.AccessDenied: + Debug.LogErrorFormat("[{0}:{1}] Access Denied.", id, name); + break; + case MonitorState.Unsupported: + Debug.LogErrorFormat("[{0}:{1}] Unsupported.", id, name); + break; + case MonitorState.SessionDisconnected: + Debug.LogErrorFormat("[{0}:{1}] Disconnected.", id, name); + break; + case MonitorState.NotSet: + Debug.LogErrorFormat("[{0}:{1}] Something wrong.", id, name); + break; + default: + break; + } } public int id @@ -150,9 +171,9 @@ public class Monitor } } - public void UpdateCursorTexture(System.IntPtr ptr) + public void GetCursorTexture(System.IntPtr ptr) { - Lib.UpdateCursorTexture(id, ptr); + Lib.GetCursorTexture(id, ptr); } void CreateTexture() diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp index 0b66378..8cdd4a0 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp @@ -26,54 +26,64 @@ Cursor::~Cursor() } -void Cursor::Update(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) +void Cursor::UpdateBuffer(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) { - isVisible_ = frameInfo.PointerPosition.Visible != 0; - x_ = frameInfo.PointerPosition.Position.x; - y_ = frameInfo.PointerPosition.Position.y; + if (frameInfo.LastMouseUpdateTime.QuadPart == 0) + { + return; + } - // TODO: see more information to check where the cursor is. - if (isVisible_) - { - GetMonitorManager()->SetCursorMonitorId(monitor_->GetId()); - } + x_ = frameInfo.PointerPosition.Position.x; + y_ = frameInfo.PointerPosition.Position.y; + if (frameInfo.PointerPosition.Visible != 0) { + GetMonitorManager()->SetCursorMonitorId(monitor_->GetId()); + timestamp_ = frameInfo.LastMouseUpdateTime; + isVisible_ = frameInfo.PointerPosition.Visible != 0; + } - if (GetMonitorManager()->GetCursorMonitorId() != monitor_->GetId()) { - return; - } + if (frameInfo.PointerShapeBufferSize == 0) + { + return; + } - // Increase the buffer size if needed - if (frameInfo.PointerShapeBufferSize > apiBufferSize_) - { - if (apiBuffer_) delete[] apiBuffer_; - apiBuffer_ = new BYTE[frameInfo.PointerShapeBufferSize]; - apiBufferSize_ = frameInfo.PointerShapeBufferSize; - } - if (apiBuffer_ == nullptr) return; + // Increase the buffer size if needed + if (frameInfo.PointerShapeBufferSize > apiBufferSize_) + { + if (apiBuffer_) delete[] apiBuffer_; + apiBuffer_ = new BYTE[frameInfo.PointerShapeBufferSize]; + apiBufferSize_ = frameInfo.PointerShapeBufferSize; + } + if (apiBuffer_ == nullptr) return; - // Get information about the mouse pointer if needed - if (frameInfo.PointerShapeBufferSize != 0) - { - UINT bufferSize; - monitor_->GetDeskDupl()->GetFramePointerShape( - frameInfo.PointerShapeBufferSize, - reinterpret_cast(apiBuffer_), - &bufferSize, - &shapeInfo_); - } + // Get mouse pointer information + UINT bufferSize; + const auto hr = monitor_->GetDeskDupl()->GetFramePointerShape( + frameInfo.PointerShapeBufferSize, + reinterpret_cast(apiBuffer_), + &bufferSize, + &shapeInfo_); + if (FAILED(hr)) + { + delete[] apiBuffer_; + apiBuffer_ = nullptr; + apiBufferSize_ = 0; + } +} + +void Cursor::UpdateTexture() +{ // cursor type - const auto cursorType = shapeInfo_.Type; - const bool isMono = cursorType == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME; - const bool isColorMask = cursorType == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR; + const bool isMono = GetType() == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME; + const bool isColorMask = GetType() == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR; // Size - const auto w = shapeInfo_.Width; - const auto h = shapeInfo_.Height / (isMono ? 2 : 1); - const auto p = shapeInfo_.Pitch; + const auto w = GetWidth(); + const auto h = GetHeight(); + const auto p = GetPitch(); // Convert the buffer given by API into BGRA32 - const auto bgraBufferSize = w * h * 4; + const UINT bgraBufferSize = w * h * 4; if (bgraBufferSize > bgra32BufferSize_) { if (bgra32Buffer_) delete[] bgra32Buffer_; @@ -145,10 +155,10 @@ void Cursor::Update(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) if (isMono) { - for (UINT row = 0; row < h; ++row) + for (int row = 0; row < h; ++row) { BYTE mask = 0x80; - for (UINT col = 0; col < w; ++col) + for (int col = 0; col < w; ++col) { const int i = row * w + col; const BYTE andMask = apiBuffer_[col / 8 + row * p] & mask; @@ -164,9 +174,9 @@ void Cursor::Update(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) { const auto buffer32 = reinterpret_cast(apiBuffer_); - for (UINT row = 0; row < h; ++row) + for (int row = 0; row < h; ++row) { - for (UINT col = 0; col < w; ++col) + for (int col = 0; col < w; ++col) { const int i = row * w + col; const int j = row * p / sizeof(UINT) + col; @@ -195,7 +205,7 @@ void Cursor::Update(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) { auto output32 = reinterpret_cast(bgra32Buffer_); const auto buffer32 = reinterpret_cast(apiBuffer_); - for (UINT i = 0; i < w * h; ++i) + for (int i = 0; i < w * h; ++i) { output32[i] = buffer32[i]; } @@ -205,7 +215,7 @@ void Cursor::Update(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) } -void Cursor::UpdateTexture(ID3D11Texture2D* texture) +void Cursor::GetTexture(ID3D11Texture2D* texture) { if (bgra32Buffer_ == nullptr) return; ID3D11DeviceContext* context; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h index 37777cc..3ed54bb 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h @@ -9,8 +9,9 @@ class Cursor public: explicit Cursor(Monitor* monitor); ~Cursor(); - void Update(const DXGI_OUTDUPL_FRAME_INFO& frameInfo); - void UpdateTexture(ID3D11Texture2D* texture); + void UpdateBuffer(const DXGI_OUTDUPL_FRAME_INFO& frameInfo); + void UpdateTexture(); + void GetTexture(ID3D11Texture2D* texture); bool IsVisible() const; int GetX() const; @@ -30,4 +31,5 @@ private: BYTE* bgra32Buffer_ = nullptr; UINT bgra32BufferSize_ = 0; DXGI_OUTDUPL_POINTER_SHAPE_INFO shapeInfo_; + LARGE_INTEGER timestamp_; }; \ No newline at end of file diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp index 38c6c5a..f7e9360 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -77,12 +77,20 @@ HRESULT Monitor::Render(UINT timeout) const auto hr = deskDupl_->AcquireNextFrame(timeout, &frameInfo, &resource); if (FAILED(hr)) { - // If any monitor setting has changed (e.g. monitor size has changed), - // it is necessary to re-initialize monitors. - if (hr == DXGI_ERROR_ACCESS_LOST) - { - state_ = State::AccessLost; - } + switch (hr) + { + case DXGI_ERROR_ACCESS_LOST: + // If any monitor setting has changed (e.g. monitor size has changed), + // it is necessary to re-initialize monitors. + state_ = State::AccessLost; + break; + case DXGI_ERROR_WAIT_TIMEOUT: + break; + case DXGI_ERROR_INVALID_CALL: + break; + case E_INVALIDARG: + break; + } return hr; } @@ -94,7 +102,8 @@ HRESULT Monitor::Render(UINT timeout) context->CopyResource(unityTexture_, texture); context->Release(); - cursor_->Update(frameInfo); + cursor_->UpdateBuffer(frameInfo); + cursor_->UpdateTexture(); resource->Release(); deskDupl_->ReleaseFrame(); @@ -139,9 +148,9 @@ const std::unique_ptr& Monitor::GetCursor() } -void Monitor::UpdateCursorTexture(ID3D11Texture2D* texture) +void Monitor::GetCursorTexture(ID3D11Texture2D* texture) { - cursor_->UpdateTexture(texture); + cursor_->GetTexture(texture); } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h index a7f35c6..6b2e727 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h @@ -25,7 +25,7 @@ public: ~Monitor(); HRESULT Initialize(IDXGIOutput* output); HRESULT Render(UINT timeout = 0); - void UpdateCursorTexture(ID3D11Texture2D* texture); + void GetCursorTexture(ID3D11Texture2D* texture); public: int GetId() const; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index 4c63e59..6fda3b3 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -304,12 +304,12 @@ extern "C" return -1; } - UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API UpdateCursorTexture(int id, ID3D11Texture2D* texture) + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API GetCursorTexture(int id, ID3D11Texture2D* texture) { if (!g_manager) return; if (auto monitor = g_manager->GetMonitor(id)) { - monitor->UpdateCursorTexture(texture); + monitor->GetCursorTexture(texture); } }