169 lines
9 KiB
C
169 lines
9 KiB
C
|
/****************************************************************************/
|
||
|
/* Copyright(C) Microsoft Corporation 1998 */
|
||
|
/****************************************************************************/
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* CPU Cycle counter */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
|
||
|
#if defined(OS_WIN32) && !defined(DC_DEBUG) && defined(_M_IX86) && defined(PERF)
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* CPU Cycle counter macros */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* variables used to store the count */
|
||
|
/****************************************************************************/
|
||
|
#define MAX_FNS 12
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Counter identifiers */
|
||
|
/****************************************************************************/
|
||
|
#define FC_MEM2SCRN_BITBLT 0
|
||
|
#define FC_DSTBLT_TYPE 1
|
||
|
#define FC_PATBLT_TYPE 2
|
||
|
#define FC_OPAQUERECT_TYPE 3
|
||
|
#define FC_SCRBLT_TYPE 4
|
||
|
#define FC_MEMBLT_TYPE 5
|
||
|
#define FC_LINETO_TYPE 6
|
||
|
#define FC_POLYLINE_TYPE 7
|
||
|
#define FC_INDEX_TYPE 8
|
||
|
#define FC_UHADDUPDATEREGION 9
|
||
|
#define FC_UHSETCLIPREGION 10
|
||
|
#define FC_UHPROCESSPALETTEPDU 11
|
||
|
#define FC_POLYGONSC_TYPE 12
|
||
|
#define FC_POLYGONCB_TYPE 13
|
||
|
#define FC_ELLIPSESC_TYPE 14
|
||
|
#define FC_ELLIPSECB_TYPE 15
|
||
|
#define FC_FAST_INDEX_TYPE 16
|
||
|
#define FC_FAST_GLYPH_TYPE 17
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* Routines to measure the count before and after */
|
||
|
/****************************************************************************/
|
||
|
#define TIMERSTART \
|
||
|
{ \
|
||
|
unsigned long startHi; \
|
||
|
unsigned long startLo; \
|
||
|
unsigned long endHi; \
|
||
|
unsigned long endLo; \
|
||
|
\
|
||
|
unsigned long timeLo; \
|
||
|
unsigned long timeHi; \
|
||
|
\
|
||
|
\
|
||
|
_asm mov eax,0 \
|
||
|
_asm mov edx,0 \
|
||
|
\
|
||
|
_asm _emit 0Fh \
|
||
|
_asm _emit 31h \
|
||
|
_asm mov startHi, edx \
|
||
|
_asm mov startLo, eax \
|
||
|
|
||
|
#define TIMERSTOP \
|
||
|
_asm mov eax,0 \
|
||
|
_asm mov edx,0 \
|
||
|
\
|
||
|
_asm _emit 0Fh \
|
||
|
_asm _emit 31h \
|
||
|
_asm mov endHi, edx \
|
||
|
_asm mov endLo, eax \
|
||
|
|
||
|
#define UPDATECOUNTER(fn) \
|
||
|
callCount[fn]++; \
|
||
|
\
|
||
|
if (endLo < startLo) \
|
||
|
{ \
|
||
|
timeLo = 0xFFFFFFFF - (startLo - endLo - 1); \
|
||
|
endHi--; \
|
||
|
} \
|
||
|
else \
|
||
|
{ \
|
||
|
timeLo = endLo - startLo; \
|
||
|
} \
|
||
|
\
|
||
|
timeHi = endHi - startHi; \
|
||
|
\
|
||
|
cycleCountLo[fn] = (unsigned long)(cycleCountLo[fn] + timeLo);\
|
||
|
\
|
||
|
if (cycleCountLo[fn] < timeLo) \
|
||
|
{ \
|
||
|
timeHi++; \
|
||
|
} \
|
||
|
\
|
||
|
cycleCountHi[fn] += timeHi; \
|
||
|
}
|
||
|
|
||
|
#define RESET_COUNTERS \
|
||
|
{ \
|
||
|
int idx; \
|
||
|
for (idx = 0; idx < MAX_FNS; idx++)\
|
||
|
{ \
|
||
|
callCount[idx] = 0; \
|
||
|
cycleCountHi[idx] = 0; \
|
||
|
cycleCountLo[idx] = 0; \
|
||
|
} \
|
||
|
\
|
||
|
OutputDebugString(_T("Counters Reset\n")); \
|
||
|
\
|
||
|
} \
|
||
|
|
||
|
#define OUTPUT_COUNTERS \
|
||
|
{ \
|
||
|
int idx; \
|
||
|
TCHAR result[80]; \
|
||
|
TCHAR fnNames[MAX_FNS][30] = \
|
||
|
{ \
|
||
|
_T("BitmapRect sub order *"), \
|
||
|
_T("DSTBLT order"), \
|
||
|
_T("PATBLT order"), \
|
||
|
_T("OPAQUERECT order"), \
|
||
|
_T("SCRBLT order"), \
|
||
|
_T("MEMBLT order **"), \
|
||
|
_T("LINETO order **"), \
|
||
|
_T("POLYLINE order"), \
|
||
|
_T("INDEX (glyph) order *"), \
|
||
|
_T("UHAddUpdateRegion *"), \
|
||
|
_T("UHSetClipRegion *"), \
|
||
|
_T("UHProcessPalettePDU *"), \
|
||
|
_T("POLYGONSC order"), \
|
||
|
_T("POLYGONCB order"), \
|
||
|
_T("ELLIPSESC order"), \
|
||
|
_T("ELLIPSECB order"), \
|
||
|
_T("FASTINDEX order"), \
|
||
|
_T("FASTGLYPH order")
|
||
|
}; \
|
||
|
\
|
||
|
OutputDebugString(_T("******************************************")\
|
||
|
_T("\n")); \
|
||
|
_stprintf(result, _T("%-29s %-6s %-12s %-12s\n"), _T("Operation"),\
|
||
|
_T("Hits"), _T("High cycles"), _T("Low cycles")); \
|
||
|
\
|
||
|
OutputDebugString(result); \
|
||
|
for (idx = 0; idx < MAX_FNS; idx++) \
|
||
|
{ \
|
||
|
_stprintf(result, _T("%-29s %6lu %12lu %12lu\n"), \
|
||
|
fnNames[idx], callCount[idx], \
|
||
|
cycleCountHi[idx], cycleCountLo[idx]); \
|
||
|
OutputDebugString(result); \
|
||
|
} \
|
||
|
OutputDebugString(_T("******************************************")\
|
||
|
_T("\n")); \
|
||
|
} \
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define MAX_FNS
|
||
|
#define TIMERSTART
|
||
|
#define TIMERSTOP
|
||
|
#define UPDATECOUNTER(fn)
|
||
|
|
||
|
#define RESET_COUNTERS
|
||
|
#define OUTPUT_COUNTERS
|
||
|
|
||
|
#endif
|
||
|
|