Skip to content

Commit

Permalink
call AcquireNextFrame on isolated thread
Browse files Browse the repository at this point in the history
  • Loading branch information
ousttrue committed Dec 27, 2016
1 parent e6407d1 commit f6ce875
Show file tree
Hide file tree
Showing 12 changed files with 484 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ void Update()
case TargetMonitor.Next: ++id; break;
case TargetMonitor.Prev: --id; break;
}
if (uDesktopDuplication.Manager.monitorCount == 0)
{
return;
}
id = Mathf.Clamp(id, 0, uDesktopDuplication.Manager.monitorCount - 1);
var monitor = uDesktopDuplication.Manager.GetMonitor(id);
monitor.shouldBeUpdated = true;
Expand Down
Binary file not shown.
2 changes: 1 addition & 1 deletion Assets/uDesktopDuplication/Scripts/Lib.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public static class Lib
[DllImport("uDesktopDuplication")]
public static extern void Finalize();
[DllImport("uDesktopDuplication")]
public static extern void Reinitialize();
public static extern void Reinitialize(bool useThread);
[DllImport("uDesktopDuplication")]
public static extern void Update();
[DllImport("uDesktopDuplication")]
Expand Down
4 changes: 3 additions & 1 deletion Assets/uDesktopDuplication/Scripts/Manager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ static public Monitor primary

[SerializeField] int desktopDuplicationApiTimeout = 0;
[SerializeField] float retryReinitializationDuration = 1f;
[SerializeField]
bool useThread = false;

private Coroutine renderCoroutine_ = null;
private bool shouldReinitialize_ = false;
Expand Down Expand Up @@ -143,7 +145,7 @@ void Update()
public void Reinitialize()
{
Debug.Log("[uDD] Reinitialize");
Lib.Reinitialize();
Lib.Reinitialize(useThread);
CreateMonitors();
if (onReinitialized != null) {
onReinitialized();
Expand Down
7 changes: 7 additions & 0 deletions Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,23 @@ using namespace Microsoft::WRL;
Monitor::Monitor(int id)
: id_(id)
{
ZeroMemory(&monitorInfo_, sizeof(monitorInfo_));
}


Monitor::~Monitor()
{
m_stopLoop = true;

if (deskDupl_)
{
deskDupl_->Release();
deskDupl_ = nullptr;
}

if (m_desktopDuplicationThread.joinable()) {
m_desktopDuplicationThread.join();
}
}


Expand Down
18 changes: 17 additions & 1 deletion Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <wrl/client.h>
#include <memory>
#include <mutex>
#include <thread>
#include "Common.h"

enum class MonitorState
Expand All @@ -23,6 +24,8 @@ enum class MonitorState

class Monitor
{
class ThreadedDesktopDuplicator *m_threaded = nullptr;

public:
using State = MonitorState;

Expand Down Expand Up @@ -57,6 +60,19 @@ class Monitor
bool UseGetPixels() const;
bool GetPixels(BYTE* output, int x, int y, int width, int height);

public:
void InitializeThreaded(const Microsoft::WRL::ComPtr<struct IDXGIAdapter> &adapter
, bool isUnityDeviceAdapter
, const Microsoft::WRL::ComPtr<struct IDXGIOutput> &output);
void CopyTextureFromThread();
private:
void DuplicateAndCopyLoop();
void DuplicateAndMapLoop();
std::shared_ptr<class IsolatedD3D11Device> m_pIsolated;
std::thread m_desktopDuplicationThread;
volatile bool m_stopLoop = false;
std::shared_ptr<class TextureQueue> m_textureQueue;

private:
void UpdateCursor(const DXGI_OUTDUPL_FRAME_INFO& frameInfo);
void UpdateMetadata(const DXGI_OUTDUPL_FRAME_INFO& frameInfo);
Expand All @@ -79,4 +95,4 @@ class Monitor
Buffer<BYTE> bufferForGetPixels_;
UINT moveRectSize_ = 0;
UINT dirtyRectSize_ = 0;;
};
};
32 changes: 25 additions & 7 deletions Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
using namespace Microsoft::WRL;


MonitorManager::MonitorManager()
MonitorManager::MonitorManager(LUID unityAdapterLuid)
: unityAdapterLuid_(unityAdapterLuid)
{
Initialize();
}


Expand All @@ -29,7 +29,7 @@ MonitorManager::~MonitorManager()
}


void MonitorManager::Initialize()
void MonitorManager::Initialize(LUID unityAdapterLuid, bool useThread)
{
Finalize();

Expand All @@ -46,12 +46,23 @@ void MonitorManager::Initialize()
ComPtr<IDXGIAdapter1> adapter;
for (int i = 0; (factory->EnumAdapters1(i, &adapter) != DXGI_ERROR_NOT_FOUND); ++i)
{
DXGI_ADAPTER_DESC desc;
adapter->GetDesc(&desc);

// Search the main monitor from all outputs
ComPtr<IDXGIOutput> output;
for (int j = 0; (adapter->EnumOutputs(j, &output) != DXGI_ERROR_NOT_FOUND); ++j)
{
auto monitor = std::make_shared<Monitor>(id++);
monitor->Initialize(output.Get());
if (useThread) {
monitor->InitializeThreaded(adapter
, desc.AdapterLuid.HighPart == unityAdapterLuid.HighPart
&& desc.AdapterLuid.LowPart == unityAdapterLuid.LowPart
, output);
}
else {
monitor->Initialize(output.Get());
}
monitors_.push_back(monitor);
}
}
Expand All @@ -70,8 +81,9 @@ void MonitorManager::RequireReinitilization()
}


void MonitorManager::Reinitialize()
void MonitorManager::Reinitialize(bool useThread)
{
useThread_ = useThread;
Debug::Log("MonitorManager::Reinitialize()");
Initialize();
SendMessageToUnity(Message::Reinitialized);
Expand Down Expand Up @@ -104,6 +116,9 @@ bool MonitorManager::HasMonitorCountChanged() const

std::shared_ptr<Monitor> MonitorManager::GetMonitor(int id) const
{
if(monitors_.empty()) {
const_cast<MonitorManager*>(this)->Initialize();
}
if (id >= 0 && id < static_cast<int>(monitors_.size()))
{
return monitors_[id];
Expand All @@ -122,7 +137,7 @@ void MonitorManager::Update()
{
if (isReinitializationRequired_)
{
Reinitialize();
Reinitialize(useThread_);
isReinitializationRequired_ = false;
}
}
Expand All @@ -142,6 +157,9 @@ int MonitorManager::GetTimeout() const

int MonitorManager::GetMonitorCount() const
{
if (monitors_.empty()) {
const_cast<MonitorManager*>(this)->Initialize();
}
return static_cast<int>(monitors_.size());
}

Expand Down Expand Up @@ -171,4 +189,4 @@ int MonitorManager::GetTotalHeight() const
const auto minTop = *std::min_element(tops.begin(), tops.end());
const auto maxBottom = *std::max_element(bottoms.begin(), bottoms.end());
return maxBottom - minTop;
}
}
13 changes: 9 additions & 4 deletions Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ class Cursor;
class MonitorManager
{
public:
explicit MonitorManager();
explicit MonitorManager(LUID unityAdapterLuid_);
~MonitorManager();
void Reinitialize();
void Reinitialize(bool useThread);
bool HasMonitorCountChanged() const;
void RequireReinitilization();
void SetCursorMonitorId(int id) { cursorMonitorId_ = id; }
Expand All @@ -24,7 +24,8 @@ class MonitorManager
std::shared_ptr<Cursor> GetCursor() const;

private:
void Initialize();
void Initialize(){ Initialize(unityAdapterLuid_, useThread_); }
void Initialize(LUID unityAdapterLuid, bool useThread);
void Finalize();

// Setters from Unity
Expand All @@ -38,12 +39,16 @@ class MonitorManager
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;
std::vector<std::shared_ptr<Monitor>> monitors_;
std::shared_ptr<Cursor> cursor_ = std::make_shared<Cursor>();
int cursorMonitorId_ = -1;
bool isReinitializationRequired_ = false;
};
};
Loading

0 comments on commit f6ce875

Please sign in to comment.