X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2Fxprofiler.pas;h=9e25bdb2122426820aa98270b41032a38f4601ff;hb=ff17260e083bdf4461154b916a716cd9b61126b1;hp=28ea126d78276cbff10431a3b033ab624b125e5e;hpb=919ca52de16a3e1dd88ce8ac5ec99e062a4feccf;p=d2df-sdl.git diff --git a/src/shared/xprofiler.pas b/src/shared/xprofiler.pas index 28ea126..9e25bdb 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,11 +19,44 @@ unit xprofiler; interface +{$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 + {$ELSEIF DEFINED(WINDOWS)} + {$DEFINE STOPWATCH_IS_HERE} + , Windows + {$ELSEIF DEFINED(HAIKU)} + {$DEFINE STOPWATCH_IS_HERE} + , unixtype + {$ELSE} + {$IFDEF STOPWATCH_IS_HERE} + {$UNDEF STOPWATCH_IS_HERE} + {$ENDIF} + {$WARNING You suck!} + {$ENDIF} + ; +{$ENDIF} // IN_TOOLS + +{$IFDEF USE_SDL} + type + UInt64 = QWord; (* !!! *) +{$ENDIF} + {$IF DEFINED(STOPWATCH_IS_HERE)} type TStopWatch = record @@ -138,28 +170,79 @@ function getTimeMilli (): UInt64; inline; implementation - uses - SDL2; +{$IFNDEF IN_TOOLS} +type + THPTimeType = Int64; +{$ELSE} +{$IF DEFINED(LINUX)} +type THPTimeType = TTimeSpec; +{$ELSE} +type THPTimeType = Int64; +{$ENDIF} + +var + mFrequency: Int64 = 0; + mHasHPTimer: Boolean = false; +{$ENDIF} - type - THPTimeType = Int64; // ////////////////////////////////////////////////////////////////////////// // procedure initTimerIntr (); +{$IFDEF IN_TOOLS} +var + r: THPTimeType; +{$ENDIF} begin +{$IFDEF IN_TOOLS} + if (mFrequency = 0) then + begin +{$IF DEFINED(LINUX)} + if (clock_getres(CLOCK_MONOTONIC, @r) <> 0) then raise Exception.Create('profiler error: cannot get timer resolution'); + mHasHPTimer := (r.tv_nsec <> 0); + 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; +{$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; +begin + //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 + {$ELSEIF DEFINED(WINDOWS)} + QueryPerformanceCounter(r); + result := UInt64(r)*1000000 div mFrequency; + {$ENDIF} +end; +{$ELSEIF DEFINED(USE_SDL2)} function getTimeMicro (): UInt64; inline; begin Result := SDL_GetPerformanceCounter() * 1000000 div SDL_GetPerformanceFrequency() end; +{$ELSE} +function getTimeMicro: UInt64; inline; +begin + result := Round(TimeStampToMSecs(DateTimeToTimeStamp(Now())) * 1000); +end; +{$ENDIF} function getTimeMilli (): UInt64; inline; begin - result := getTimeMicro div 1000; + result := getTimeMicro() div 1000; end;