From 3291f1aacc9ba3540d5ceb632932535a52094cff Mon Sep 17 00:00:00 2001 From: Xottab-DUTY Date: Sun, 20 May 2018 14:34:38 +0500 Subject: [PATCH] xrEngine/pure.h: refactor pure processing This gives increased debuggability --- src/TypeHelper.natvis | 6 +++++- src/xrEngine/Device_destroy.cpp | 4 ++-- src/xrEngine/Stats.cpp | 3 --- src/xrEngine/device.cpp | 16 ++++++++-------- src/xrEngine/pure.cpp | 10 ---------- src/xrEngine/pure.h | 29 ++++++++++++++++------------- 6 files changed, 31 insertions(+), 37 deletions(-) diff --git a/src/TypeHelper.natvis b/src/TypeHelper.natvis index e73b45625e5..ac844f8068f 100644 --- a/src/TypeHelper.natvis +++ b/src/TypeHelper.natvis @@ -63,5 +63,9 @@ {cName.p_->value, s}, $(Type) - + + + + {Object} + \ No newline at end of file diff --git a/src/xrEngine/Device_destroy.cpp b/src/xrEngine/Device_destroy.cpp index 88c2fe66925..b846170ab2f 100644 --- a/src/xrEngine/Device_destroy.cpp +++ b/src/xrEngine/Device_destroy.cpp @@ -60,9 +60,9 @@ void CRenderDevice::Reset(bool precache) // TODO: Remove this! It may hide crash Memory.mem_compact(); - seqDeviceReset.Process(rp_DeviceReset); + seqDeviceReset.Process(); if (dwWidth_before != dwWidth || dwHeight_before != dwHeight) - seqResolutionChanged.Process(rp_ScreenResolutionChanged); + seqResolutionChanged.Process(); if (!GEnv.isDedicatedServer) pInput->ClipCursor(true); diff --git a/src/xrEngine/Stats.cpp b/src/xrEngine/Stats.cpp index d88d02bb81a..639c816d2d2 100644 --- a/src/xrEngine/Stats.cpp +++ b/src/xrEngine/Stats.cpp @@ -17,9 +17,6 @@ int g_ErrorLineCount = 15; Flags32 g_stats_flags = {0}; -// stats -DECLARE_RP(Stats); - class optimizer { float average_; diff --git a/src/xrEngine/device.cpp b/src/xrEngine/device.cpp index bca5cf4dca4..d9f04e782c0 100644 --- a/src/xrEngine/device.cpp +++ b/src/xrEngine/device.cpp @@ -134,7 +134,7 @@ void CRenderDevice::RenderThreadProc(void* context) renderTotalReal.Begin(); if (device.b_is_Active && device.Begin()) { - device.seqRender.Process(rp_Render); + device.seqRender.Process(); device.CalcFrameStats(); device.Statistic->Show(); device.End(); // Present goes here @@ -162,7 +162,7 @@ void CRenderDevice::SecondaryThreadProc(void* context) for (u32 pit = 0; pit < device.seqParallel.size(); pit++) device.seqParallel[pit](); device.seqParallel.clear(); - device.seqFrameMT.Process(rp_Frame); + device.seqFrameMT.Process(); device.syncFrameDone.Set(); } } @@ -285,7 +285,7 @@ void CRenderDevice::on_idle() renderTotalReal.Begin(); if (b_is_Active && Begin()) { - seqRender.Process(rp_Render); + seqRender.Process(); CalcFrameStats(); Statistic->Show(); End(); // Present goes here @@ -364,13 +364,13 @@ void CRenderDevice::Run() thread_spawn(SecondaryThreadProc, "X-RAY Secondary thread", 0, this); //thread_spawn(RenderThreadProc, "X-RAY Render thread", 0, this); // Message cycle - seqAppStart.Process(rp_AppStart); + seqAppStart.Process(); GEnv.Render->ClearTarget(); splash::hide(); ShowWindow(m_hWnd, SW_SHOWNORMAL); pInput->ClipCursor(true); message_loop(); - seqAppEnd.Process(rp_AppEnd); + seqAppEnd.Process(); // Stop Balance-Thread mt_bMustExit = TRUE; //renderProcessFrame.Set(); @@ -428,7 +428,7 @@ void CRenderDevice::FrameMove() stats.EngineTotal.Begin(); // TODO: HACK to test loading screen. // if(!g_bLoaded) - Device.seqFrame.Process(rp_Frame); + Device.seqFrame.Process(); g_bLoaded = TRUE; // else // seqFrame.Process(rp_Frame); @@ -506,13 +506,13 @@ void CRenderDevice::OnWM_Activate(WPARAM wParam, LPARAM /*lParam*/) Device.b_is_Active = isGameActive; if (Device.b_is_Active) { - Device.seqAppActivate.Process(rp_AppActivate); + Device.seqAppActivate.Process(); app_inactive_time += TimerMM.GetElapsed_ms() - app_inactive_time_start; } else { app_inactive_time_start = TimerMM.GetElapsed_ms(); - Device.seqAppDeactivate.Process(rp_AppDeactivate); + Device.seqAppDeactivate.Process(); } } } diff --git a/src/xrEngine/pure.cpp b/src/xrEngine/pure.cpp index e479a398644..25d5232f62a 100644 --- a/src/xrEngine/pure.cpp +++ b/src/xrEngine/pure.cpp @@ -1,12 +1,2 @@ #include "stdafx.h" #include "pure.h" - -DECLARE_RP(Frame); -DECLARE_RP(FrameEnd); -DECLARE_RP(Render); -DECLARE_RP(AppActivate); -DECLARE_RP(AppDeactivate); -DECLARE_RP(AppStart); -DECLARE_RP(AppEnd); -DECLARE_RP(DeviceReset); -DECLARE_RP(ScreenResolutionChanged); diff --git a/src/xrEngine/pure.h b/src/xrEngine/pure.h index 1e2dedc09bb..db7a049827e 100644 --- a/src/xrEngine/pure.h +++ b/src/xrEngine/pure.h @@ -8,16 +8,19 @@ #define REG_PRIORITY_CAPTURE 0x7ffffffful #define REG_PRIORITY_INVALID 0xfffffffful -using MessageFunction = void __fastcall(void* obj); -#define DECLARE_MESSAGE(name) \ - extern ENGINE_API MessageFunction rp_##name; \ - struct ENGINE_API pure##name \ - { \ - virtual void On##name() = 0; \ - } +struct IPure +{ + virtual ~IPure() = default; + virtual void OnPure() = 0; +}; -#define DECLARE_RP(name) \ - void __fastcall rp_##name(void* p) { ((pure##name*)p)->On##name(); } +#define DECLARE_MESSAGE(name)\ +struct pure##name : IPure\ +{\ + virtual void On##name() = 0;\ +private:\ + void OnPure() override { On##name(); }\ +}; DECLARE_MESSAGE(Frame); // XXX: rename to FrameStart DECLARE_MESSAGE(FrameEnd); @@ -31,7 +34,7 @@ DECLARE_MESSAGE(ScreenResolutionChanged); struct MessageObject { - void* Object; + IPure* Object; int Prio; u32 Flags; }; @@ -91,7 +94,7 @@ class MessageRegistry Resort(); } - void Process(MessageFunction* func) + void Process() { if (messages.empty()) return; @@ -99,12 +102,12 @@ class MessageRegistry inProcess = true; if (messages[0].Prio == REG_PRIORITY_CAPTURE) - func(messages[0].Object); + messages[0].Object->OnPure(); else { for (auto& message : messages) if (message.Prio != REG_PRIORITY_INVALID) - func(message.Object); + message.Object->OnPure(); } if (changed)