From 5fb3f230f13b8f73ad86a36093d5dd404e0986ed Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Mon, 1 Jan 2024 17:59:21 -0500 Subject: [PATCH] Changes --- .github/workflows/format.yml | 1 + LEGO1/legovideomanager.h | 2 +- LEGO1/mxdirectx/mxstopwatch.h | 180 +++++++++++++++++++++++++++++ LEGO1/mxstopwatch.h | 209 ---------------------------------- 4 files changed, 182 insertions(+), 210 deletions(-) create mode 100644 LEGO1/mxdirectx/mxstopwatch.h delete mode 100644 LEGO1/mxstopwatch.h diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 22b39806..d8fbe442 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -17,6 +17,7 @@ jobs: --style=file \ ISLE/*.cpp ISLE/*.h \ LEGO1/*.cpp LEGO1/*.h \ + LEGO1/mxdirectx/*.h \ LEGO1/mxstl/*.h \ LEGO1/realtime/*.cpp LEGO1/realtime/*.h \ LEGO1/tgl/*.h \ diff --git a/LEGO1/legovideomanager.h b/LEGO1/legovideomanager.h index b0837839..6d6cf75b 100644 --- a/LEGO1/legovideomanager.h +++ b/LEGO1/legovideomanager.h @@ -4,7 +4,7 @@ #include "decomp.h" #include "lego3dmanager.h" #include "mxdirect3d.h" -#include "mxstopwatch.h" +#include "mxdirectx/mxstopwatch.h" #include "mxunknown100d9d00.h" #include "mxvideomanager.h" diff --git a/LEGO1/mxdirectx/mxstopwatch.h b/LEGO1/mxdirectx/mxstopwatch.h new file mode 100644 index 00000000..f6ece779 --- /dev/null +++ b/LEGO1/mxdirectx/mxstopwatch.h @@ -0,0 +1,180 @@ +#ifndef _MxStopWatch_h +#define _MxStopWatch_h + +#include "assert.h" +#include "winbase.h" + + +////////////////////////////////////////////////////////////////////////////// +// +// MxStopWatch +// +// NOTE: MxStopWatch measures elapsed (wall clock) time. +// + +class MxStopWatch { +public: + MxStopWatch(); + ~MxStopWatch() {} + + void Start(); + void Stop(); + void Reset(); + + double ElapsedSeconds() const; + +protected: + unsigned long TicksPerSeconds() const; + +private: + LARGE_INTEGER m_startTick; + // ??? when we provide LARGE_INTEGER arithmetic, use a + // LARGE_INTEGER m_elapsedTicks rather than m_elapsedSeconds + double m_elapsedSeconds; + unsigned long m_ticksPerSeconds; +}; + +inline MxStopWatch::MxStopWatch() +{ + Reset(); + m_ticksPerSeconds = TicksPerSeconds(); +} + +inline void MxStopWatch::Start() +{ + QueryPerformanceCounter(&m_startTick); +} + +inline void MxStopWatch::Stop() +{ + LARGE_INTEGER endTick; + BOOL result; + + result = QueryPerformanceCounter(&endTick); + assert(result); + + if (endTick.HighPart != m_startTick.HighPart) { + // LARGE_INTEGER arithmetic not yet provided + m_elapsedSeconds = HUGE_VAL; + } + else { + m_elapsedSeconds += ((endTick.LowPart - m_startTick.LowPart) / (double) m_ticksPerSeconds); + } +} + +inline void MxStopWatch::Reset() +{ + m_startTick.LowPart = 0; + m_startTick.HighPart = 0; + m_elapsedSeconds = 0; +} + +inline unsigned long MxStopWatch::TicksPerSeconds() const +{ + LARGE_INTEGER ticksPerSeconds; + BOOL result; + + result = QueryPerformanceFrequency(&ticksPerSeconds); + assert(result); + + if (ticksPerSeconds.HighPart) { + // LARGE_INTEGER arithmetic not yet provided + + // timer is too fast (faster than 32bits/s, i.e. faster than 4GHz) + return ULONG_MAX; + } + else { + return ticksPerSeconds.LowPart; + } +} + +inline double MxStopWatch::ElapsedSeconds() const +{ + return m_elapsedSeconds; +} + +////////////////////////////////////////////////////////////////////////////// +// +// MxFrequencyMeter +// + +class MxFrequencyMeter { +public: + MxFrequencyMeter(); + + void StartOperation(); + void EndOperation(); + double Frequency() const; + void Reset(); + + unsigned long OperationCount() const; + double ElapsedSeconds() const; + + void IncreaseOperationCount(unsigned long); + +private: + unsigned long m_operationCount; + MxStopWatch m_stopWatch; +}; + +////////////////////////////////////////////////////////////////////////////// +// +// MxFrequencyMeter implementation +// + +inline MxFrequencyMeter::MxFrequencyMeter() : m_operationCount(0) +{ +} + +inline void MxFrequencyMeter::StartOperation() +{ + m_stopWatch.Start(); +} + +inline void MxFrequencyMeter::EndOperation() +{ + m_stopWatch.Stop(); + m_operationCount++; +} + +inline double MxFrequencyMeter::Frequency() const +{ + double elapsedSeconds = m_stopWatch.ElapsedSeconds(); + + if (elapsedSeconds > 0) { + return m_operationCount / elapsedSeconds; + } + else { + if (m_operationCount) { + // operations performed - no time elapsed + return HUGE_VAL; + } + else { + // no operations performed - no time elapsed + return 0; + } + } +} + +inline void MxFrequencyMeter::Reset() +{ + m_stopWatch.Reset(); + m_operationCount = 0; +} + +inline unsigned long MxFrequencyMeter::OperationCount() const +{ + return m_operationCount; +} + +inline void MxFrequencyMeter::IncreaseOperationCount(unsigned long delta) +{ + m_operationCount += delta; +} + +inline double MxFrequencyMeter::ElapsedSeconds() const +{ + return m_stopWatch.ElapsedSeconds(); +} + +#endif /* _MxStopWatch_h */ diff --git a/LEGO1/mxstopwatch.h b/LEGO1/mxstopwatch.h deleted file mode 100644 index 47b8708d..00000000 --- a/LEGO1/mxstopwatch.h +++ /dev/null @@ -1,209 +0,0 @@ -#ifndef _MxStopWatch_h -#define _MxStopWatch_h - -#include "winbase.h" -#include "assert.h" - -////////////////////////////////////////////////////////////////////////////// -// -// MxStopWatch -// -// NOTE: MxStopWatch measures elapsed (wall clock) time. -// - -class MxStopWatch -{ -public: - MxStopWatch(); - ~MxStopWatch() {} - - void Start(); - void Stop(); - void Reset(); - - double ElapsedSeconds() const; - -protected: - unsigned long TicksPerSeconds() const; - -private: - LARGE_INTEGER m_startTick; - // ??? when we provide LARGE_INTEGER arithmetic, use a - // LARGE_INTEGER m_elapsedTicks rather than m_elapsedSeconds - double m_elapsedSeconds; - unsigned long m_ticksPerSeconds; -}; - -inline -MxStopWatch::MxStopWatch() -{ - Reset(); - m_ticksPerSeconds = TicksPerSeconds(); -} - -inline -void MxStopWatch::Start() -{ - QueryPerformanceCounter(&m_startTick); -} - -inline -void MxStopWatch::Stop() -{ - LARGE_INTEGER endTick; - BOOL result; - - result = QueryPerformanceCounter(&endTick); - assert(result); - - if (endTick.HighPart != m_startTick.HighPart) - { - // LARGE_INTEGER arithmetic not yet provided - m_elapsedSeconds = HUGE_VAL; - } - else - { - m_elapsedSeconds += ((endTick.LowPart - m_startTick.LowPart) / (double) m_ticksPerSeconds); - } -} - -inline -void MxStopWatch::Reset() -{ - m_startTick.LowPart = 0; - m_startTick.HighPart = 0; - m_elapsedSeconds = 0; -} - -inline -unsigned long MxStopWatch::TicksPerSeconds() const -{ - LARGE_INTEGER ticksPerSeconds; - BOOL result; - - result = QueryPerformanceFrequency(&ticksPerSeconds); - assert(result); - - if (ticksPerSeconds.HighPart) - { - // LARGE_INTEGER arithmetic not yet provided - - // timer is too fast (faster than 32bits/s, i.e. faster than 4GHz) - return ULONG_MAX; - } - else - { - return ticksPerSeconds.LowPart; - } -} - -inline -double MxStopWatch::ElapsedSeconds() const -{ - return m_elapsedSeconds; -} - -////////////////////////////////////////////////////////////////////////////// -// -// MxFrequencyMeter -// - -class MxFrequencyMeter -{ -public: - MxFrequencyMeter(); - - void StartOperation(); - void EndOperation(); - double Frequency() const; - void Reset(); - - unsigned long OperationCount() const; - double ElapsedSeconds() const; - - void IncreaseOperationCount(unsigned long); - -private: - unsigned long m_operationCount; - MxStopWatch m_stopWatch; -}; - -////////////////////////////////////////////////////////////////////////////// -// -// MxFrequencyMeter implementation -// - -inline -MxFrequencyMeter::MxFrequencyMeter() -: m_operationCount(0) -{ -} - -inline -void -MxFrequencyMeter::StartOperation() -{ - m_stopWatch.Start(); -} - -inline -void -MxFrequencyMeter::EndOperation() -{ - m_stopWatch.Stop(); m_operationCount++; -} - -inline -double -MxFrequencyMeter::Frequency() const -{ - double elapsedSeconds = m_stopWatch.ElapsedSeconds(); - - if (elapsedSeconds > 0) - { - return m_operationCount / elapsedSeconds; - } - else - { - if (m_operationCount) - { - // operations performed - no time elapsed - return HUGE_VAL; - } - else - { - // no operations performed - no time elapsed - return 0; - } - } -} - -inline -void -MxFrequencyMeter::Reset() -{ - m_stopWatch.Reset(); m_operationCount = 0; -} - -inline -unsigned long -MxFrequencyMeter::OperationCount() const -{ - return m_operationCount; -} - -inline -void -MxFrequencyMeter::IncreaseOperationCount(unsigned long delta) -{ - m_operationCount += delta; -} - -inline -double -MxFrequencyMeter::ElapsedSeconds() const -{ - return m_stopWatch.ElapsedSeconds(); -} - -#endif /* _MxStopWatch_h */