/********************************************************************* * * * PRF module * * * ********************************************************************** * * * This module is a profiler * * * * Define USE_PROFILER to use it * * * * Author : Alexis Vaise * * * *********************************************************************/ #ifndef _PRF_H__ #define _PRF_H__ /* ===========================================================================================*/ #include "acp_base.h" #include "tmr.h" /* to have access to the target-dependant internal counter*/ #include "assert.h" /* ===========================================================================================*/ #if defined(__cplusplus) extern "C" { #endif /* ===========================================================================================*/ #if defined(USE_PROFILER) && !defined(PRESS_DEMO) /* ===========================================================================================*/ #if defined(U64) #define __fastcall #endif /* U64 */ /* ======================================== Constants ========================================*/ #define PRF_C_lMaxNbFunction 50 #define PRF_C_lMaxNbVariable 30 #define PRF_C_lMaxNbIndependantVariable 50 #define PRF_C_lMaxNbFloatIndependantVariable 10 /* independant variables use... see end of file */ #define PRF_C_lNbTramesForAverage 20 /* ======================================== Structures ========================================*/ /* used for statistics on a global raster or variable*/ typedef struct PRF_stMinMaxTotalStructure { unsigned long ulThisFrameValue; unsigned long ulMinValue; unsigned long ulMaxValue; unsigned long ulTotalValueForAverage; unsigned long a_ulValuesHistory[PRF_C_lNbTramesForAverage]; unsigned long ulAverageValue; } PRF_tdstMinMaxTotalStructure; /* used to remember what happened during the frame, for function or variable*/ typedef struct PRF_stHistory { unsigned long ulValue; void *p_vUserData; } PRF_tdstHistory; /* used when computing chronos or variables, to group what happened during the frame, for each user data*/ typedef struct PRF_stUserDataSummary { void *p_vUserData; unsigned long ulValueForThisFrame; unsigned char ucStartStopCounter; } PRF_tdstUserDataSummary; /* a raster complete definition*/ typedef struct PRF_stFunctionInformation { char *szFunctionName; unsigned long ulHistorySize; /* size of historic array*/ unsigned long ulUserDataSize; /* max number of UserData*/ PRF_tdstHistory *p_stFrameHistory; /* history for one frame*/ PRF_tdstUserDataSummary *p_stUserDataSummary; /* result for each user data*/ unsigned long ulNbFrame; unsigned long ulHistoryIndex; /* number of pertinent data in history array*/ int iNbUserData; /* number of pertinent data in each-user-result array (and also number of different user data)*/ PRF_tdstMinMaxTotalStructure stFunctionDuration; /* time statistics for the raster*/ PRF_tdstMinMaxTotalStructure stNbTimeCalled; /* number of time called statistics for the raster*/ int iRunning; /* number of start less number of stop*/ } PRF_tdstFunctionInformation; typedef struct PRF_stVariableInformation { char *szVariableName; unsigned long ulHistorySize; /* size of historic array*/ unsigned long ulUserDataSize; /* max number of UserData*/ PRF_tdstHistory *p_stFrameHistory; /* history for one frame*/ PRF_tdstUserDataSummary *p_stUserDataSummary; /* result for each user data*/ unsigned long ulNbFrame; unsigned long ulHistoryIndex; /* number of pertinent data in history array*/ int iNbUserData; /* number of pertinent data in each-user-result array (and also number of different user data)*/ PRF_tdstMinMaxTotalStructure stVariableValue; /* variable statistics*/ } PRF_tdstVariableInformation; /* ======================================== Variables ========================================*/ extern PRF_tdstFunctionInformation PRF_g_a_stFunctionInformation [PRF_C_lMaxNbFunction]; extern PRF_tdstVariableInformation PRF_g_a_stVariableInformation [PRF_C_lMaxNbVariable]; extern BOOL PRF_g_bModuleInitialized; /* ======================================== Inline functions ========================================*/ /*-----------------------------------------------------------------------------*/ /* PRF_fn_vStartChrono*/ /* Start a chrono*/ /*-----------------------------------------------------------------------------*/ #ifdef DREAMCAST #pragma inline(PRF_fn_vStartChrono) #endif INLINE void __fastcall PRF_fn_vStartChrono (unsigned long _ulFunctionNumber, void *p_vUserData) { PRF_tdstFunctionInformation *p = &PRF_g_a_stFunctionInformation[_ulFunctionNumber]; if (p->ulHistoryIndexulHistorySize) { register PRF_tdstHistory *h = &p->p_stFrameHistory[p->ulHistoryIndex++]; h->p_vUserData = p_vUserData; h->ulValue = (TMR_fn_ulFastGetInternalCounter() & 0xfffffffe); p->iRunning++; } else { /* too short history*/ p->ulHistoryIndex = p->ulHistorySize + 2; } } /*-----------------------------------------------------------------------------*/ /* PRF_fn_vStopChrono*/ /* Stop a chrono*/ /*-----------------------------------------------------------------------------*/ #ifdef DREAMCAST #pragma inline(PRF_fn_vStopChrono) #endif INLINE void __fastcall PRF_fn_vStopChrono (unsigned long _ulFunctionNumber, void *p_vUserData) { unsigned long ulTimerValue = TMR_fn_ulFastGetInternalCounter(); PRF_tdstFunctionInformation *p = &PRF_g_a_stFunctionInformation[_ulFunctionNumber]; if (p->ulHistoryIndexulHistorySize) { register PRF_tdstHistory *h = &p->p_stFrameHistory[p->ulHistoryIndex++]; h->p_vUserData = p_vUserData; h->ulValue = (ulTimerValue | 0x00000001); p->iRunning--; } else { /* too short history*/ p->ulHistoryIndex = p->ulHistorySize + 2; } } /*-----------------------------------------------------------------------------*/ /* PRF_fn_vIncreaseVariable*/ /* increase the value of a variable*/ /*-----------------------------------------------------------------------------*/ #ifdef DREAMCAST #pragma inline(PRF_fn_vIncreaseVariable) #endif INLINE void __fastcall PRF_fn_vIncreaseVariable (unsigned long _ulVariableNumber, void *_p_vUserData, unsigned long _ulDelta) { PRF_tdstVariableInformation *p = &PRF_g_a_stVariableInformation[_ulVariableNumber]; if (p->ulHistoryIndexulHistorySize) { register PRF_tdstHistory *h; if (p->ulHistoryIndex > 0) { h = &p->p_stFrameHistory[p->ulHistoryIndex-1]; if (h->p_vUserData == _p_vUserData) { h->ulValue += _ulDelta; return; } h++; } else h = p->p_stFrameHistory; /* p->ulHistoryIndex = 0*/ p->ulHistoryIndex++; /* new user data...*/ h->ulValue = _ulDelta; h->p_vUserData = _p_vUserData; } else { /* too short history*/ p->ulHistoryIndex = p->ulHistorySize + 2; } } /* ======================================== Profiler control ========================================*/ /* init module*/ void PRF_fn_vInitProfileModule (); /* DesInit module*/ void PRF_fn_vDesInitProfileModule (); /* create a new function raster*/ void PRF_fn_vInitChrono (unsigned long _ulFunctionNumber , char * _szFunctionName, unsigned long _ulHistorySize, unsigned long _ulMaxNumberOfUserData); /* create a new variable raster*/ void PRF_fn_vInitVariable (unsigned long _ulVariableNumber , char * _szVariableName, unsigned long _ulHistorySize, unsigned long _ulMaxNumberOfUserData); /* ReInit a function raster*/ void PRF_fn_vReInitChrono (PRF_tdstFunctionInformation *_pFunction); /* ReInit a variable raster*/ void PRF_fn_vReInitVariable (PRF_tdstVariableInformation *_pVariable); void PRF_fn_vReinitAllChrono (void); /* Must be called when reinitializing the map*/ void PRF_fn_vComputeChrono (unsigned long _ulFunctionNumber); void PRF_fn_vComputeVariable (unsigned long _ulVariableNumber); void PRF_fn_vComputeAllChrono (void); /* Must be called each trame before writing the result*/ void PRF_fn_vResetChrono (unsigned long _ulFunctionNumber); void PRF_fn_vResetVariable (unsigned long _ulVariableNumber); void PRF_fn_vResetAllChrono (void); /* Must be called each trame after writing the result*/ unsigned long PRF_fn_ulTimerCount2Duration(unsigned long ulDuration); /* ======================================== Functions result ========================================*/ /* get function raster name*/ char *PRF_fn_p_cGetFunctionName(unsigned long _ulFunctionNumber); /* get function result with user data*/ unsigned long PRF_fn_ulGetFunctionDurationWithData(unsigned long _ulFunctionNumber, void *p_vUserData); /* get function global result*/ unsigned long PRF_fn_ulGetFunctionDuration(unsigned long _ulFunctionNumber); unsigned long PRF_fn_ulGetFunctionAverageDuration(unsigned long _ulFunctionNumber); unsigned long PRF_fn_ulGetFunctionMaxDuration(unsigned long _ulFunctionNumber); unsigned long PRF_fn_ulGetFunctionMinDuration(unsigned long _ulFunctionNumber); int PRF_fn_iGetFunctionNbStartAndStop (unsigned long _ulFunctionNumber); unsigned long PRF_fn_ulGetFunctionStartOrStop (unsigned long _ulFunctionNumber , unsigned long _ulStartStopNumber , void * * _p_p_vData , BOOL * _p_bThisIsAStart); /* get number of diferent user data*/ int PRF_fn_iGetNumberOfUserDataForFunction(unsigned long _ulFunctionNumber); /* get function result with index*/ unsigned long PRF_fn_ulGetFunctionDurationWithIndex(unsigned long _ulFunctionNumber, void **_p_p_vUserData, int _iIndex); /* get the current number of start less number of stop*/ int PRF_fn_iGetFunctionNumberOfStart(unsigned long _ulFunctionNumber, void **_p_p_vUserData); /* ======================================== Variables result========================================*/ /* get variable raster name*/ char *PRF_fn_p_cGetVariableName(unsigned long _ulVariableNumber); /* get GetVariable result with user data*/ unsigned long PRF_fn_ulGetVariableValueWithData(unsigned long _ulVariableNumber, void *p_vUserData); /* get GetVariable global result*/ unsigned long PRF_fn_ulGetVariableValue(unsigned long _ulVariableNumber); unsigned long PRF_fn_ulGetVariableAverageValue(unsigned long _ulVariableNumber); unsigned long PRF_fn_ulGetVariableMaxValue(unsigned long _ulVariableNumber); unsigned long PRF_fn_ulGetVariableMinValue(unsigned long _ulVariableNumber); /* get number of diferent user data*/ int PRF_fn_iGetNumberOfUserDataForVariable(unsigned long _ulVariableNumber); /* get Variable result with index*/ unsigned long PRF_fn_ulGetVariableValueWithIndex(unsigned long _ulFunctionNumber, void **_p_p_vUserData, int _iIndex); /* ======================================== independant long Variable result========================================*/ void PRF_fn_vSetIndependantVariableName(unsigned long i, char *_szName); long PRF_fn_lGetIndependantVariable(unsigned long i); void PRF_fn_vSetIndependantVariable(unsigned long i, long lValue); long PRF_fn_lIncIndependantVariable(unsigned long i, long lValue); char *PRF_fn_szGetIndependantVariableName(unsigned long i); /* ======================================== independant float Variable result========================================*/ void PRF_fn_vSetFloatIndependantVariableName(unsigned long i, char *_szName); float PRF_fn_fGetFloatIndependantVariable(unsigned long i); void PRF_fn_vSetFloatIndependantVariable(unsigned long i, float fValue); float PRF_fn_fIncFloatIndependantVariable(unsigned long i, float fValue); char *PRF_fn_szGetFloatIndependantVariableName(unsigned long i); /* ======================================== Misc ============================================*/ unsigned long PRF_fn_ulGetCPUFrequency(void); void PRF_fn_vUpdateMonitorFrequency( unsigned long _ulFrequency ); /* ======================================== Constants ========================================*/ /* ======================================== Constants ========================================*/ /* ======================================== Constants ========================================*/ /* Misc for Idp*/ #define PRF_C_ulDynamic 0 /* for Idp 1*/ #define PRF_C_ulStatic 1 /* for Idp 1*/ #define PRF_C_ulFix 2 /* for Idp 1*/ #define PRF_C_ulShadow 3 /* for Idp 1*/ /* Functions*/ #define PRF_C_ulFctMainLoop 0 #define PRF_C_ulFctDisplay 1 #define PRF_C_ulFctAI 2 #define PRF_C_ulFctCollisions 3 #define PRF_C_ulFctCollisionsChar 4 #define PRF_C_ulFctDNM 5 #define PRF_C_ulFctAnimPlayer 6 #define PRF_C_ulFctInput 7 #define PRF_C_ulFctEditor 8 #define PRF_C_ulFctSoundInit 9 #define PRF_C_ulFctSound 9 #define PRF_C_ulFctFlip 10 #define PRF_C_ulFctMainMisc 11 #define PRF_C_ulFctIADNMPLAMisc 12 #define PRF_C_ulFctHIE 13 /* COL+IA+DNM+Player+Misc => ~ 2 + 3 + 4 + 5 + 6 + 11*/ #define PRF_C_ulWaitFor3dFx 14 #define PRF_C_ulFctDisplaySpecific 15 #define PRF_C_ulFctDisplayCommon 16 #define PRF_C_ulFctDisplaySprite 17 /* sub function fot Display specific*/ #define PRF_C_ulGLI1 18 #define PRF_C_ulGLI2 19 #define PRF_C_ulGLI3 20 #define PRF_C_ulGLI4 21 #define PRF_C_ulGLI5 22 #define PRF_C_ulGLI6 23 #define PRF_C_ulGLI7 24 #define PRF_C_ulGLI8 25 /* Data for functions*/ #define M_DATA_FOR_FUNCTIONS(a,b) ((void*)((a+1)*256+(b))) #define PRF_C_pvDisplayRDP M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,0) #define PRF_C_pvDisplayRSP M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,1) #define PRF_C_pvDisplaySynchroWait M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,2) #define PRF_C_pvDisplayGfxBuild M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,3) #define PRF_C_pvDisplaySendSector M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,4) #define PRF_C_pvDisplaySendObject M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,5) #define PRF_C_pvDisplayDisplayFix M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,6) #define PRF_C_pvDisplayRaster M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,7) #define PRF_C_pvDisplayClearVP M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,8) #define PRF_C_pvDisplaySendToList M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,9) #define PRF_C_pvSoundInit M_DATA_FOR_FUNCTIONS(PRF_C_ulFctSound,0) #define PRF_C_pvSoundRSP M_DATA_FOR_FUNCTIONS(PRF_C_ulFctSound,1) #define PRF_C_pvSoundPrepareAudio M_DATA_FOR_FUNCTIONS(PRF_C_ulFctSound,2) #define PRF_C_pvEditorPRFComput M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,0) #define PRF_C_pvMisc ((void*)0) /* variable 1 : Misc*/ #define PRF_C_pvGetDevice ((void*)1) /* variable 1 : Wait for 3Dfx*/ #define PRF_C_pvSendToViewPort ((void*)2) /* variable 1 : Clipping*/ #define PRF_C_pvSendFix ((void*)3) /* variable 1 : Projection*/ #define PRF_C_pvSendSector ((void*)4) /* variable 1 : Lights*/ #define PRF_C_pvSendActor ((void*)5) /* variable 1 : Shadow*/ #define PRF_C_pvSendToList ((void*)6) /* variable 1 : SendToList*/ #define PRF_C_pvRest ((void*)9) /* variable 1 : Vignette*/ #define PRF_C_pvLight ((void*)10) #define PRF_C_pvStack ((void*)11) #define PRF_C_pvShadow ((void*)12) /* Variables*/ #define PRF_C_ulVarCurrentSector 1 /* h_SO current sector*/ #define PRF_C_ulVarObjects 2 /* Objects*/ #define PRF_C_ulVarDynObjects (PRF_C_ulVarObjects + PRF_C_ulDynamic) /* 2 : number of dynamic objects visible/computed/displayed*/ #define PRF_C_ulVarStaObjects (PRF_C_ulVarObjects + PRF_C_ulStatic) /* 3 : number of static objects visible/computed/displayed*/ #define PRF_C_ulVarFixObjects (PRF_C_ulVarObjects + PRF_C_ulFix) /* 4 : number of Fix objects visible/computed/displayed*/ #define PRF_C_ulVarShwObjects (PRF_C_ulVarObjects + PRF_C_ulShadow) /* 5 : number of Shadow objects visible/computed/displayed*/ #define PRF_C_ulVarFaces 6 /* Faces*/ #define PRF_C_ulVarDynFaces (PRF_C_ulVarFaces + PRF_C_ulDynamic) /* 7 : number of dynamic faces visible/computed/displayed*/ #define PRF_C_ulVarStaFaces (PRF_C_ulVarFaces + PRF_C_ulStatic) /* 8 : number of static faces visible/computed/displayed*/ #define PRF_C_ulVarFixFaces (PRF_C_ulVarFaces + PRF_C_ulFix) /* 9 : number of Fix faces visible/computed/displayed*/ #define PRF_C_ulVarShwFaces (PRF_C_ulVarFaces + PRF_C_ulShadow) /* 10 : number of Shadow faces visible/computed/displayed*/ #define PRF_C_ulVarSectors 11 #define PRF_C_ulVarStaColl 12 #define PRF_C_ulVarDynColl 13 #define PRF_C_ulVarElements 14 #define PRF_C_ulVarDynElements (PRF_C_ulVarElements + PRF_C_ulDynamic) /* 15 : number of dynamic objects visible/computed/displayed*/ #define PRF_C_ulVarStaElements (PRF_C_ulVarElements + PRF_C_ulStatic) /* 16 : number of static objects visible/computed/displayed*/ #define PRF_C_ulVarFixElements (PRF_C_ulVarElements + PRF_C_ulFix) /* 17 : number of Fix objects visible/computed/displayed*/ #define PRF_C_ulVarShwElements (PRF_C_ulVarElements + PRF_C_ulShadow) /* 17 : number of Shadow objects visible/computed/displayed*/ #define PRF_C_ulVarGLI1 19 #define PRF_C_ulVarGLI2 20 #define PRF_C_ulVarGLI3 21 #define PRF_C_ulVarGLI4 22 #define PRF_C_ulVarGLI5 23 #define PRF_C_ulVarGLI6 24 #define PRF_C_ulVarGLI7 25 #define PRF_C_ulVarGLI8 26 /* Data for variables*/ #define PRF_C_pvVisible ((void*)2) /* variables 2/3/4/5*/ #define PRF_C_pvComputed ((void*)4) /* variables 2/3/4/5*/ #define PRF_C_pvDisplayed ((void*)5) /* variables 1/2/3/4/5*/ #define PRF_C_pvMainCharCurrentSector ((void*)0) #define PRF_C_pvCameraCurrentSector ((void*)1) /* Independant Variables*/ #define PRF_C_ulIdpCurrentPage 0 #define PRF_C_ulIdpDynOrSta 1 /* 0 : Dyn , 2 : Sta*/ #define PRF_C_ulIdpAdvancedPage 2 #define PRF_C_ulIdpDisplayedFaces 3 /* flag*/ #define PRF_C_ulIdpDisplayedObjects 4 /* flag*/ #define PRF_C_ulIdpRasterTime 5 #define PRF_C_ulIdpRasterDisplayMode 6 #define PRF_C_ulIdpDisplayedElements 7 #define PRF_C_ulIdpCollComputed 8 #define PRF_C_ulIdpDisplayedTriangle 9 #define PRF_C_ulIdpNbSkippedAnims 10 #define PRF_C_ulIdpNbAllocSPO 11 #define PRF_C_ulIdpNbMaxAllocSPO 12 #define PRF_C_ulIdpNbAllocCHA 13 #define PRF_C_ulIdpNbMaxAllocCHA 14 #define PRF_C_ulIdpGfxList 15 #define PRF_C_ulIdpMaxGfxList 16 #define PRF_C_ulIdpAllowedGfxList 17 #define PRF_C_ulIdpGfxList2 18 #define PRF_C_ulIdpMaxGfxList2 19 #define PRF_C_ulIdpAllowedGfxList2 20 #define PRF_C_ulIdpMtxList 21 #define PRF_C_ulIdpMaxMtxList 22 #define PRF_C_ulIdpAllowedMtxList 23 #define PRF_C_ulIdpLightList 24 #define PRF_C_ulIdpMaxLightList 25 #define PRF_C_ulIdpAllowedLightList 26 #define PRF_C_ulIdpMaxMainStackSize 27 #define PRF_C_ulIdpAllowedMainStackSize 28 #define PRF_C_ulIdpVirtualKey 29 #define PRF_C_ulIdpMaxNbCollisions 30 #define PRF_C_ulIdpAllowedNbCollisions 31 #define PRF_C_ulIdpAAMode 32 #define PRF_C_ulIdpDeltaTime 40 #define PRF_C_ulIdpMonitorFrequency 41 #define PRF_C_ulIdpTextureSize 42 #define PRF_C_ulIdpTextureMemorySize 43 #define PRF_C_ulU64Mode 0x0001 #define PRF_C_ulShowCurrent 0x0002 #define PRF_C_ulShowAverage 0x0004 #define PRF_C_ulShowMaximum 0x0008 #define PRF_C_ulFinalMode 0x0010 #define PRF_C_ulVariableMode 0x0020 #define PRF_C_ulShowStatic 0x0040 #define PRF_C_ulShowDynamic 0x0080 #define PRF_C_ulShowAll (PRF_C_ulShowStatic|PRF_C_ulShowDynamic) #define PRF_C_ulShowPGMMode 0x0100 #define PRF_C_ulSuperImposed 0x0200 #define PRF_C_ulClearScreen 0x0400 #define PRF_C_ulChangeActor 0x0800 /* ================================================================================*/ #else /* #ifdef USE_PROFILER */ /* ===========================================================================================*/ #define PRF_fn_vStartChrono(Chrono,Data) #define PRF_fn_vStopChrono(Chrono,Data) #define PRF_fn_vIncreaseVariable(Var,Data,Inc) #define PRF_fn_vSetIndependantVariable(Var,Inc) #define PRF_fn_lGetIndependantVariable(Var) 0 #define PRF_fn_lIncIndependantVariable(Var,Inc) #define PRF_fn_vReinitAllChrono() #define PRF_fn_vDesInitProfileModule() #define PRF_fn_vUpdateMonitorFrequency( _ulFrequency ) /* ===========================================================================================*/ #endif /* #ifdef USE_PROFILER*/ /* ===========================================================================================*/ #if defined(__cplusplus) } #endif /* ===========================================================================================*/ #endif /* #ifndef _PRF_H__*/