X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2Fxprofiler.pas;h=5e6212b921b5b7ddc04784ad9d601503b3d93483;hb=0e101bd452c40da601236aaa2dd4106be47ddce1;hp=b4e2fc4d2e8332b5fa96ba18b274e48cd47e3dac;hpb=563e770b462d67b2c8265b0e2b53384152afb7c1;p=d2df-sdl.git diff --git a/src/shared/xprofiler.pas b/src/shared/xprofiler.pas index b4e2fc4..5e6212b 100644 --- a/src/shared/xprofiler.pas +++ b/src/shared/xprofiler.pas @@ -2,8 +2,7 @@ * * 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 - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * the Free Software Foundation, version 3 of the License ONLY. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -20,14 +19,30 @@ unit xprofiler; interface -uses - SysUtils, - {$IF DEFINED(LINUX)} +{$IFNDEF IN_TOOLS} + uses + {$IFDEF USE_SDL} + SDL, + {$ENDIF} + {$IFDEF USE_SDL2} + SDL2, + {$ENDIF} + 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 +50,12 @@ uses {$WARNING You suck!} {$ENDIF} ; +{$ENDIF} // IN_TOOLS + +{$IFDEF USE_SDL} + type + UInt64 = QWord; (* !!! *) +{$ENDIF} {$IF DEFINED(STOPWATCH_IS_HERE)} type @@ -149,6 +170,10 @@ function getTimeMilli (): UInt64; inline; implementation +{$IFNDEF IN_TOOLS} +type + THPTimeType = Int64; +{$ELSE} {$IF DEFINED(LINUX)} type THPTimeType = TTimeSpec; {$ELSE} @@ -158,13 +183,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)} @@ -173,15 +202,18 @@ 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; +{$IF DEFINED(IN_TOOLS)} function getTimeMicro (): UInt64; inline; var r: THPTimeType; @@ -190,16 +222,35 @@ begin {$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; +(* !!! +{$ELSEIF DEFINED(USE_SDL)} +function getTimeMicro: UInt64; inline; +begin + {$WARNING use inaccurate profiling timer} + result := SDL_GetTicks() * 1000 +end; +*) +{$ELSEIF DEFINED(USE_SDL2)} +function getTimeMicro (): UInt64; inline; +begin + Result := SDL_GetPerformanceCounter() * 1000000 div SDL_GetPerformanceFrequency() +end; +{$ELSE} +function getTimeMicro: UInt64; inline; +begin + {$WARNING use stub profiling timer} +end; +{$ENDIF} function getTimeMilli (): UInt64; inline; begin - result := getTimeMicro div 1000; + result := getTimeMicro() div 1000; end; @@ -465,8 +516,8 @@ begin begin if (xpsecs[idx].name = aName) then begin - if (idx = xpscur) then raise Exception.Create('profiler error(0): dobule resume: "'+aName+'"'); - if (xpsecs[idx].prevAct <> -1) then raise Exception.Create('profiler error(1): dobule resume: "'+aName+'"'); + 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();