From 467fa86f598ef8594693a9de2026d21555890a94 Mon Sep 17 00:00:00 2001 From: hecomi Date: Sat, 8 Dec 2018 13:36:16 +0900 Subject: [PATCH] add function-scope timer for debug. --- .../Plugins/x86/uDesktopDuplication.dll | Bin 90112 -> 90112 bytes .../Plugins/x86_64/uDesktopDuplication.dll | Bin 108032 -> 108032 bytes .../uDesktopDuplication/Common.cpp | 2 ++ .../uDesktopDuplication/Cursor.cpp | 8 +++++++ .../uDesktopDuplication/Debug.cpp | 14 +++++++++++ .../uDesktopDuplication/Debug.h | 21 +++++++++++++---- .../uDesktopDuplication/Device.cpp | 4 ++++ .../uDesktopDuplication/Duplicator.cpp | 22 ++++++++++++++++++ .../uDesktopDuplication/Monitor.cpp | 14 +++++++++++ .../uDesktopDuplication/MonitorManager.cpp | 10 ++++++++ 10 files changed, 90 insertions(+), 5 deletions(-) diff --git a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll index 27a8cfb92919bc8b7f8a338f268169d15cd6eb5e..2b7407a5b054934425b82e95eeebff236a2ea3a9 100644 GIT binary patch delta 8854 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 delta 8945 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 NHTo9my`8k|e*h6pxc&eD diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 78adc5f532959f6e8a14435d1b2981db2f1b75a5..8ecda3d803d2eef7906a1d6d6f26ff5628106337 100644 GIT binary patch delta 35221 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 delta 35339 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%0AOmD@FQwH;#zw_f2Ebp~atR+7X2G zMY8m|xIS+h3+|uwIW_?ZxhlC{Tv+$kA}-+1q!7GkNE5EO{=qcXraet4vG|T|I$Did zx&}io_M()p0qJUTNpC!zbrg?%Z{ni2iA!g>gwBb$3F0(tLli~z|KD&809iMR!r zdr8`Gd?_cPq_5;C&H<8*SAmqb6lerq`brxt6s^9Ngq}b$wj1aL48APm(LgfL2S}C6 z2hvsaog7lH>wisW;r+<({dgQrKoZe1P$#GH)mi!-N77nB=@2R-wk21aCCb$Us>B?2<2Z3~r{7L4Yqo13hCeutO6-iXo zL7<@itf)ZJH!LF2nNOu31d4oiXAwy=S@>X@k7CWTHrYrbQyYPFol|j2_3=Qbw!wiT z_!NKj8lITH;1Pj_>+*}fZ6@m&;7qgqiotLlZLfbl6Q9jE)o(*piLgUA&SIU+PIb>3 zP5Tz%C@g)er_5sWeJg*X;;}DTCO?=k)-J;r0{W#{EV`w?N|Oxv>*Ocu%V*<79(~5* zlkp^8gNtlJmp+??gl09!O9Q4HJbVN&8}D#%o`~#tVQq-rrth7Nm(Td04Zi_eo2Uc5sy&;rVt=EZb>qPK$q9bJG@r_6f8~r4=RZbP~78 z4HxaoY5!V;ytJyO6)|m}Y1Np!0kb6SPa}$v8ARG+`U7h~rmY^W5lbP{(FAQ{Vu7@& zuEHrm5kdwTMJO(XK_IQ}V>x7mQl!%wu{|8?iqIP&4PhEW4njV{7At;sBJ4*vitri2 z_Xt-JenYs8&?uK_z6jw6oe_E?Bq0n#n1V0|;R%E%5%Lh$BNQXNfv_LpEW#HER}g9u z49l5jLI^{MZh@a32uTQO2on$*iCm6x+>^u-10WtgsB=jZ?`hyH$h=RA>MA8C+O?u zV*UKTe?;@Ye?;@Ye?;@Ye?;^D>5pjI{Lg7C&jrR##~vR13?RLXr&YWAOL=-(-)JW6 zPsL*nxC-GA4CctXvaYBW-mX17Zs3efZ^G) zwde&bN5~`&aBvPzJxI1f7_tycYeeWBXW*0Y266=O7()6ioE!m@pGIcL^t$dKLKS53 zMh>#~Y&1I@8Jvsd3FLI(^UKjSkc)wzB2brA0sG`(?SyVk1YSU}R)R$Dz?Q89334v5 zoMdDm?EWm8oiYHuR-uLF;Dbh>6@m1*z>)dbqd-qD#BL&tgG_J1qE@34km*fVYa6-@ zGQGWOwgyg;yav_Yh)4upJ>hRn#A_x|Q^?L&QiLf8Gr=L8fUp=c;S7X)$b@s1J`1?| zIZfLFz59D9dSBIcEm|6S!u|-SGqC_mgzzW=6`Td!tYr5WR#{jX{)6xpG82j=D`eL@ zB`n~ujCH^@2EB+^u>EB!rchzkO{xE;wJ-3+(K%sg{Ss^88pyOJ-j1bh{3FN<+>bSLCS)ru zo{wRTT#5*-mCs|1Tnm}j%HM6lV0jcH8A$(YTRvo3H+$esMkQo=;}KMh+jTDb64-7l zoPkUW^d4BCmq4b4dh)BN1Y}xcpGSzF2m8Qjuc7}l5uw%n4TMdQY1O|Rp#n1P20~v) zg&@;m{#JyT$KV05+YSsg$h1Q^fRGQF7U(%8@D4KV2A;)kzz&&q1!v#H-7z0d0)yTH zA9BQ7xNWBI#K1#@whV>X5yWR91907L3^d5J%IBqMQplyi=l9^2!^o!t-BE92EIf|9 zz#e6|3m_)~|N9Q|LZ+kA_YRs64@vWIQ=6O2ANLO_;K(d(H-L%>VAEL3AqAu@d(sNQ4%ID#+=;{^w*R5`nGG!!zjJkB8{k zXg$Ke&=bCj;J*l626P@55w`gR^9}Tbai5_7dmxgCNYhWHQGeh$gknPZGapP zoPG?36@fg?0y86D>ZcySsryVX zvyq;9#%nCXM=S9z@h=G}iO~6LEYi26q_kvzNqI>{Nu^%)8k-*wyKUUI;%)YA{;y`d Qy8qRxSN-+4?d;6|0l#l#82|tP diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp index 90c8470..32207a6 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp @@ -60,6 +60,8 @@ const std::unique_ptr& GetMonitorManager() LUID GetUnityAdapterLuid() { + UDD_FUNCTION_SCOPE_TIMER + const auto device = GetDevice(); Microsoft::WRL::ComPtr dxgiDevice; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp index d6a6d39..c00f1b0 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp @@ -21,6 +21,8 @@ Cursor::~Cursor() void Cursor::UpdateBuffer(Duplicator* duplicator, const DXGI_OUTDUPL_FRAME_INFO& frameInfo) { + UDD_FUNCTION_SCOPE_TIMER + if (frameInfo.LastMouseUpdateTime.QuadPart == 0) { return; @@ -66,6 +68,8 @@ void Cursor::UpdateTexture( Duplicator* duplicator, const ComPtr& desktopTexture) { + UDD_FUNCTION_SCOPE_TIMER + auto monitor = duplicator->GetMonitor(); // Check desktop texure @@ -369,6 +373,8 @@ void Cursor::UpdateTexture( void Cursor::Draw(const Microsoft::WRL::ComPtr& texture) { + UDD_FUNCTION_SCOPE_TIMER + if (texture == nullptr) { Debug::Error("Cursor::UpdateTexture() => Desktop texture is null."); @@ -384,6 +390,8 @@ void Cursor::Draw(const Microsoft::WRL::ComPtr& texture) void Cursor::GetTexture(ID3D11Texture2D* texture) { + UDD_FUNCTION_SCOPE_TIMER + if (!bgraBuffer_) { Debug::Error("Cursor::GetTexture() => bgra32Buffer is null."); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.cpp index 4e899aa..01f506a 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.cpp @@ -39,4 +39,18 @@ void Debug::Finalize() } Debug::SetLogFunc(nullptr); Debug::SetErrorFunc(nullptr); +} + + +decltype(DebugFunctionScopedTimer::currentId) DebugFunctionScopedTimer::currentId = 0; + + +DebugFunctionScopedTimer::DebugFunctionScopedTimer(const char* name) + : ScopedTimer([this](std::chrono::microseconds us) { + Debug::Log("<< [", id_, "]", name_, " : ", us.count(), "[us]"); + }) + , name_(name) + , id_(currentId++) +{ + Debug::Log(">> [", id_, "]", name_); } \ No newline at end of file diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.h index d1222aa..fd79648 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.h @@ -10,7 +10,9 @@ // Debug flag +#ifdef _DEBUG #define UDD_DEBUG_ON +#endif // Logging @@ -156,16 +158,25 @@ private: }; +class DebugFunctionScopedTimer : public ScopedTimer +{ +public: + explicit DebugFunctionScopedTimer(const char* name); + +private: + static unsigned int currentId; + const char* const name_; + const unsigned int id_; +}; + + #ifdef UDD_DEBUG_ON #define UDD_FUNCTION_SCOPE_TIMER \ - ScopedTimer _timer_##__COUNTER__([](std::chrono::microseconds us) \ - { \ - Debug::Log(__FUNCTION__, "@", __FILE__, ":", __LINE__, " => ", us.count(), " [us]"); \ - }); + DebugFunctionScopedTimer _timer_##__COUNTER__(__FUNCTION__); #define UDD_SCOPE_TIMER(Name) \ ScopedTimer _timer_##__COUNTER__([](std::chrono::microseconds us) \ { \ - Debug::Log(#Name, " => ", us.count(), " [us]"); \ + Debug::Log(#Name, " : ", us.count(), " [us]"); \ }); #else #define UDD_FUNCTION_SCOPE_TIMER diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Device.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Device.cpp index 032cbc6..1759d85 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Device.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Device.cpp @@ -27,6 +27,8 @@ IsolatedD3D11Device::~IsolatedD3D11Device() HRESULT IsolatedD3D11Device::Create(const ComPtr& adapter) { + UDD_FUNCTION_SCOPE_TIMER + const auto driverType = adapter ? D3D_DRIVER_TYPE_UNKNOWN : D3D_DRIVER_TYPE_HARDWARE; @@ -68,6 +70,8 @@ ComPtr IsolatedD3D11Device::GetDevice() Microsoft::WRL::ComPtr IsolatedD3D11Device::GetCompatibleSharedTexture( const ComPtr& src) { + UDD_FUNCTION_SCOPE_TIMER + D3D11_TEXTURE2D_DESC srcDesc; src->GetDesc(&srcDesc); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp index 2e7a9c4..666593d 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp @@ -33,6 +33,8 @@ Duplicator::~Duplicator() void Duplicator::InitializeDevice() { + UDD_FUNCTION_SCOPE_TIMER + device_ = std::make_shared(); if (FAILED(device_->Create(monitor_->GetAdapter()))) @@ -45,6 +47,8 @@ void Duplicator::InitializeDevice() void Duplicator::InitializeDuplication() { + UDD_FUNCTION_SCOPE_TIMER + ComPtr output1; if (FAILED(monitor_->GetOutput().As(&output1))) { @@ -107,6 +111,8 @@ void Duplicator::InitializeDuplication() void Duplicator::CheckUnityAdapter() { + UDD_FUNCTION_SCOPE_TIMER + DXGI_ADAPTER_DESC desc; monitor_->GetAdapter()->GetDesc(&desc); @@ -125,6 +131,8 @@ void Duplicator::CheckUnityAdapter() void Duplicator::Start() { + UDD_FUNCTION_SCOPE_TIMER + if (state_ != State::Ready) return; Stop(); @@ -170,6 +178,8 @@ void Duplicator::Start() void Duplicator::Stop() { + UDD_FUNCTION_SCOPE_TIMER + shouldRun_ = false; if (thread_.joinable()) @@ -226,6 +236,8 @@ const Duplicator::Frame& Duplicator::GetLastFrame() const void Duplicator::Duplicate(UINT timeout) { + UDD_FUNCTION_SCOPE_TIMER + if (!dupl_ || !device_) return; Release(); @@ -312,6 +324,8 @@ void Duplicator::Duplicate(UINT timeout) void Duplicator::Release() { + UDD_FUNCTION_SCOPE_TIMER + if (!isFrameAcquired_) return; const auto hr = dupl_->ReleaseFrame(); @@ -347,6 +361,8 @@ void Duplicator::UpdateCursor( const ComPtr& texture, const DXGI_OUTDUPL_FRAME_INFO& frameInfo) { + UDD_FUNCTION_SCOPE_TIMER + auto& manager = GetMonitorManager(); if (frameInfo.PointerPosition.Visible) @@ -365,6 +381,8 @@ void Duplicator::UpdateCursor( void Duplicator::UpdateMetadata(UINT totalBufferSize) { + UDD_FUNCTION_SCOPE_TIMER + metaData_.buffer.ExpandIfNeeded(totalBufferSize); if (!metaData_.buffer.Empty()) { @@ -376,6 +394,8 @@ void Duplicator::UpdateMetadata(UINT totalBufferSize) void Duplicator::UpdateMoveRects() { + UDD_FUNCTION_SCOPE_TIMER + const auto hr = dupl_->GetFrameMoveRects( metaData_.buffer.Size(), metaData_.buffer.As(), @@ -418,6 +438,8 @@ void Duplicator::UpdateMoveRects() void Duplicator::UpdateDirtyRects() { + UDD_FUNCTION_SCOPE_TIMER + const auto hr = dupl_->GetFrameDirtyRects( metaData_.buffer.Size() - metaData_.moveRectSize, metaData_.buffer.As(metaData_.moveRectSize /* offset */), diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp index f0e331f..f75ff15 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -29,6 +29,8 @@ void Monitor::Initialize( const ComPtr &output ) { + UDD_FUNCTION_SCOPE_TIMER + adapter_ = adapter; output_ = output; @@ -75,12 +77,16 @@ void Monitor::Initialize( void Monitor::Finalize() { + UDD_FUNCTION_SCOPE_TIMER + StopCapture(); } void Monitor::Render() { + UDD_FUNCTION_SCOPE_TIMER + const auto& frame = duplicator_->GetLastFrame(); if (frame.id == lastFrameId_) return; @@ -133,6 +139,8 @@ void Monitor::Render() void Monitor::StartCapture() { + UDD_FUNCTION_SCOPE_TIMER + if (duplicator_->GetState() == DuplicatorState::Ready) { duplicator_->Start(); @@ -142,6 +150,8 @@ void Monitor::StartCapture() void Monitor::StopCapture() { + UDD_FUNCTION_SCOPE_TIMER + duplicator_->Stop(); } @@ -302,6 +312,8 @@ bool Monitor::UseGetPixels() const void Monitor::CopyTextureFromGpuToCpu(ID3D11Texture2D* texture) { + UDD_FUNCTION_SCOPE_TIMER + const auto monitorRot = static_cast(GetRotation()); const auto monitorWidth = GetWidth(); const auto monitorHeight = GetHeight(); @@ -367,6 +379,8 @@ void Monitor::CopyTextureFromGpuToCpu(ID3D11Texture2D* texture) bool Monitor::GetPixels(BYTE* output, int x, int y, int width, int height) { + UDD_FUNCTION_SCOPE_TIMER + if (!UseGetPixels()) { Debug::Error("Monitor::GetPixels() => UseGetPixels(true) must have been called when you want to use GetPixels()."); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp index bbfaf32..b7caeec 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp @@ -30,6 +30,8 @@ MonitorManager::~MonitorManager() void MonitorManager::Initialize() { + UDD_FUNCTION_SCOPE_TIMER + ComPtr factory; if (FAILED(CreateDXGIFactory1(IID_PPV_ARGS(&factory)))) { @@ -69,6 +71,8 @@ void MonitorManager::Initialize() void MonitorManager::Finalize() { + UDD_FUNCTION_SCOPE_TIMER + for (const auto& monitor : monitors_) { monitor->Finalize(); @@ -80,6 +84,8 @@ void MonitorManager::Finalize() void MonitorManager::Update() { + UDD_FUNCTION_SCOPE_TIMER + if (isReinitializationRequired_) { Reinitialize(); @@ -97,6 +103,8 @@ void MonitorManager::RequireReinitilization() void MonitorManager::Reinitialize() { + UDD_FUNCTION_SCOPE_TIMER + Debug::Log("MonitorManager::Reinitialize()"); Finalize(); Initialize(); @@ -106,6 +114,8 @@ void MonitorManager::Reinitialize() bool MonitorManager::HasMonitorCountChanged() const { + UDD_FUNCTION_SCOPE_TIMER + ComPtr factory; if (FAILED(CreateDXGIFactory1(IID_PPV_ARGS(&factory)))) {