diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 9f4420d..ceee205 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 2c0c7e9..3c59f5d 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp @@ -36,4 +36,4 @@ const std::unique_ptr& GetMonitorManager() void SendMessageToUnity(Message message) { g_messages.push(message); -} \ No newline at end of file +} diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h index fb8c3a5..8f78917 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h @@ -17,17 +17,6 @@ class MonitorManager; const std::unique_ptr& 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 { @@ -36,4 +25,58 @@ enum class Message TextureSizeChanged = 1, }; -void SendMessageToUnity(Message message); \ No newline at end of file +void SendMessageToUnity(Message message); + + +// Buffer +template +class Buffer +{ +public: + Buffer() {} + ~Buffer() {} + + void ExpandIfNeeded(UINT size) + { + if (size > size_) + { + size_ = size; + value_ = std::make_unique(size); + } + } + + void Reset() + { + value_.reset(); + size_ = 0; + } + + UINT Size() const + { + return size_; + } + + T* Get() const + { + return value_.get(); + } + + operator bool() const + { + return value_ != nullptr; + } + + T operator [](UINT index) const + { + if (index >= size_) + { + Debug::Error("Array index out of range: ", index, size_); + return T(0); + } + return value_[index]; + } + +private: + std::unique_ptr value_; + UINT size_ = 0; +}; \ No newline at end of file diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp index e08b3ac..21ce303 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp @@ -1,6 +1,5 @@ #include #include -#include "Common.h" #include "Debug.h" #include "MonitorManager.h" #include "Monitor.h" @@ -47,13 +46,7 @@ void Cursor::UpdateBuffer(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) return; } - // Increase the buffer size if needed - if (frameInfo.PointerShapeBufferSize > apiBufferSize_) - { - apiBufferSize_ = frameInfo.PointerShapeBufferSize; - apiBuffer_ = std::make_unique(apiBufferSize_); - } - + apiBuffer_.ExpandIfNeeded(frameInfo.PointerShapeBufferSize); if (!apiBuffer_) { return; @@ -63,16 +56,15 @@ void Cursor::UpdateBuffer(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) UINT bufferSize; DXGI_OUTDUPL_POINTER_SHAPE_INFO shapeInfo; const auto hr = monitor_->GetDeskDupl()->GetFramePointerShape( - apiBufferSize_, - apiBuffer_.get(), + apiBuffer_.Size(), + apiBuffer_.Get(), &bufferSize, &shapeInfo); if (FAILED(hr)) { Debug::Error("Cursor::UpdateBuffer() => GetFramePointerShape() failed."); - apiBuffer_.reset(); - apiBufferSize_ = 0; + apiBuffer_.Reset(); return; } @@ -100,11 +92,7 @@ void Cursor::UpdateTexture() // Convert the buffer given by API into BGRA32 const UINT bgraBufferSize = cursorImageWidth * cursorImageHeight * 4; - if (bgraBufferSize > bgra32BufferSize_) - { - bgra32BufferSize_ = bgraBufferSize; - bgra32Buffer_ = std::make_unique(bgra32BufferSize_); - } + bgra32Buffer_.ExpandIfNeeded(bgraBufferSize); // Check buffers if (!bgra32Buffer_ || !apiBuffer_) @@ -281,7 +269,7 @@ void Cursor::UpdateTexture() }; // Access RGBA values at the same time - auto output32 = reinterpret_cast(bgra32Buffer_.get()); + auto output32 = reinterpret_cast(bgra32Buffer_.Get()); if (isMono) { @@ -300,7 +288,7 @@ void Cursor::UpdateTexture() } else // DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR { - const auto buffer32 = reinterpret_cast(apiBuffer_.get()); + const auto buffer32 = reinterpret_cast(apiBuffer_.Get()); for (int row = rowMin, y = 0; row < rowMax; ++row, ++y) { @@ -329,8 +317,8 @@ void Cursor::UpdateTexture() } else // DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR { - auto output32 = reinterpret_cast(bgra32Buffer_.get()); - const auto buffer32 = reinterpret_cast(apiBuffer_.get()); + auto output32 = reinterpret_cast(bgra32Buffer_.Get()); + const auto buffer32 = reinterpret_cast(apiBuffer_.Get()); for (int i = 0; i < cursorImageWidth * cursorImageHeight; ++i) { output32[i] = buffer32[i]; @@ -341,7 +329,7 @@ void Cursor::UpdateTexture() void Cursor::GetTexture(ID3D11Texture2D* texture) { - if (bgra32Buffer_ == nullptr) + if (!bgra32Buffer_) { Debug::Error("Cursor::GetTexture() => bgra32Buffer is null."); return; @@ -368,7 +356,7 @@ void Cursor::GetTexture(ID3D11Texture2D* texture) ComPtr context; GetDevice()->GetImmediateContext(&context); - context->UpdateSubresource(texture, 0, nullptr, bgra32Buffer_.get(), GetWidth() * 4, 0); + context->UpdateSubresource(texture, 0, nullptr, bgra32Buffer_.Get(), GetWidth() * 4, 0); } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h index 40dee5b..1c7b594 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h @@ -3,6 +3,7 @@ #include #include #include +#include "Common.h" class Monitor; @@ -30,10 +31,8 @@ private: bool isVisible_ = false; int x_ = -1; int y_ = -1; - std::unique_ptr apiBuffer_ = nullptr; - UINT apiBufferSize_ = 0; - std::unique_ptr bgra32Buffer_ = nullptr; - UINT bgra32BufferSize_ = 0; + Buffer apiBuffer_; + Buffer bgra32Buffer_; 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 3293215..496609b 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -156,6 +156,7 @@ void Monitor::Render(UINT timeout) return; } + // Get texture if (unityTexture_) { ID3D11Texture2D* texture;