X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2Fxprofiler.pas;h=71cd14877374e403727d5ba4c181be54ad05d089;hb=caa7982554b88590fc1690cb2924399eebacec44;hp=51d99e8b0e0e8fd155b8aa256add97d1fde688bd;hpb=4af2b6eac9b465e95af873343c21d244d1e74a75;p=d2df-sdl.git diff --git a/src/shared/xprofiler.pas b/src/shared/xprofiler.pas index 51d99e8..71cd148 100644 --- a/src/shared/xprofiler.pas +++ b/src/shared/xprofiler.pas @@ -1,4 +1,4 @@ -(* Copyright (C) DooM 2D:Forever Developers +(* Copyright (C) Doom 2D: Forever Developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,14 +20,24 @@ unit xprofiler; interface -uses - SysUtils, - {$IF DEFINED(LINUX)} +{$IFNDEF IN_TOOLS} + uses + SysUtils; + + {$DEFINE STOPWATCH_IS_HERE} + +{$ELSE} + uses + SysUtils + {$IF DEFINED(LINUX) OR DEFINED(ANDROID)} {$DEFINE STOPWATCH_IS_HERE} - unixtype, linux + , unixtype, linux {$ELSEIF DEFINED(WINDOWS)} {$DEFINE STOPWATCH_IS_HERE} - Windows + , Windows + {$ELSEIF DEFINED(HAIKU)} + {$DEFINE STOPWATCH_IS_HERE} + , unixtype {$ELSE} {$IFDEF STOPWATCH_IS_HERE} {$UNDEF STOPWATCH_IS_HERE} @@ -35,6 +45,7 @@ uses {$WARNING You suck!} {$ENDIF} ; +{$ENDIF} // IN_TOOLS {$IF DEFINED(STOPWATCH_IS_HERE)} type @@ -135,16 +146,27 @@ type // call this on frame end procedure mainEnd (); - procedure sectionBegin (name: AnsiString); + procedure sectionBegin (aName: AnsiString); procedure sectionEnd (); // this will reuse the section with the given name (if there is any); use `sectionEnd()` to end it as usual - procedure sectionBeginAccum (name: AnsiString); + procedure sectionBeginAccum (aName: AnsiString); end; +function getTimeMicro (): UInt64; inline; +function getTimeMilli (): UInt64; inline; + + implementation +{$IFNDEF IN_TOOLS} +uses + SDL2; + +type + THPTimeType = Int64; +{$ELSE} {$IF DEFINED(LINUX)} type THPTimeType = TTimeSpec; {$ELSE} @@ -154,13 +176,17 @@ type THPTimeType = Int64; var mFrequency: Int64 = 0; mHasHPTimer: Boolean = false; +{$ENDIF} // ////////////////////////////////////////////////////////////////////////// // procedure initTimerIntr (); +{$IFDEF IN_TOOLS} var r: THPTimeType; +{$ENDIF} begin +{$IFDEF IN_TOOLS} if (mFrequency = 0) then begin {$IF DEFINED(LINUX)} @@ -169,28 +195,43 @@ begin if not mHasHPTimer then raise Exception.Create('profiler error: hires timer is not available'); mFrequency := 1; // just a flag if (r.tv_nsec <> 0) then mFrequency := 1000000000000000000 div r.tv_nsec; -{$ELSE} +{$ELSEIF DEFINED(WINDOWS)} mHasHPTimer := QueryPerformanceFrequency(r); if not mHasHPTimer then raise Exception.Create('profiler error: hires timer is not available'); mFrequency := r; {$ENDIF} end; +{$ENDIF} + (* init sdl timers? *) end; -function curTimeMicro (): UInt64; inline; +{$IFDEF IN_TOOLS} +function getTimeMicro (): UInt64; inline; var r: THPTimeType; begin - if (mFrequency = 0) then initTimerIntr(); + //if (mFrequency = 0) then initTimerIntr(); {$IF DEFINED(LINUX)} clock_gettime(CLOCK_MONOTONIC, @r); result := UInt64(r.tv_sec)*1000000+UInt64(r.tv_nsec) div 1000; // microseconds - {$ELSE} + {$ELSEIF DEFINED(WINDOWS)} QueryPerformanceCounter(r); result := UInt64(r)*1000000 div mFrequency; {$ENDIF} end; +{$ELSE} +function getTimeMicro (): UInt64; inline; +begin + Result := SDL_GetPerformanceCounter() * 1000000 div SDL_GetPerformanceFrequency() +end; +{$ENDIF} + + +function getTimeMilli (): UInt64; inline; +begin + result := getTimeMicro div 1000; +end; // ////////////////////////////////////////////////////////////////////////// // @@ -211,7 +252,7 @@ procedure TStopWatch.updateElapsed (); var e: UInt64; begin - e := curTimeMicro(); + e := getTimeMicro(); if (mStartPosition > e) then mStartPosition := e; Inc(mElapsed, e-mStartPosition); mStartPosition := e; @@ -243,7 +284,7 @@ end; procedure TStopWatch.start (reset: Boolean=true); begin if mRunning and not reset then exit; // nothing to do - mStartPosition := curTimeMicro(); + mStartPosition := getTimeMicro(); mRunning := true; if (reset) then mElapsed := 0; end; @@ -417,7 +458,7 @@ begin {$ENDIF} end; -procedure TProfiler.sectionBegin (name: AnsiString); +procedure TProfiler.sectionBegin (aName: AnsiString); {$IF DEFINED(STOPWATCH_IS_HERE)} var sid: Integer; @@ -431,7 +472,7 @@ begin sid := xpsused; Inc(xpsused); pss := @xpsecs[sid]; - pss.name := name; + pss.name := aName; pss.timer.clear(); pss.prevAct := xpscur; // calculate level @@ -441,7 +482,7 @@ begin {$ENDIF} end; -procedure TProfiler.sectionBeginAccum (name: AnsiString); +procedure TProfiler.sectionBeginAccum (aName: AnsiString); {$IF DEFINED(STOPWATCH_IS_HERE)} var idx: Integer; @@ -453,10 +494,10 @@ begin begin for idx := 0 to xpsused-1 do begin - if (xpsecs[idx].name = name) then + if (xpsecs[idx].name = aName) then begin - if (idx = xpscur) then raise Exception.Create('profiler error(0): dobule resume: "'+name+'"'); - if (xpsecs[idx].prevAct <> -1) then raise Exception.Create('profiler error(1): dobule resume: "'+name+'"'); + if (idx = xpscur) then raise Exception.Create('profiler error(0): double resume: "'+aName+'"'); + if (xpsecs[idx].prevAct <> -1) then raise Exception.Create('profiler error(1): double resume: "'+aName+'"'); xpsecs[idx].prevAct := xpscur; xpscur := idx; xpsecs[idx].timer.resume(); @@ -464,7 +505,7 @@ begin end; end; end; - sectionBegin(name); + sectionBegin(aName); {$ENDIF} end; @@ -486,4 +527,6 @@ begin end; +begin + initTimerIntr(); end.