mame/src/emu/profiler.h

153 lines
4.2 KiB
C

/***************************************************************************
profiler.h
Functions to manage profiling of MAME execution.
Copyright Nicola Salmoria and the MAME Team.
Visit http://mamedev.org for licensing and usage restrictions.
****************************************************************************
To start profiling a certain section, e.g. video:
profiler_mark_start(PROFILER_VIDEO);
to end profiling the current section:
profiler_mark_end();
the profiler handles a FILO list so calls may be nested.
***************************************************************************/
#pragma once
#ifndef __PROFILER_H__
#define __PROFILER_H__
#include "astring.h"
/***************************************************************************
CONSTANTS
***************************************************************************/
/* profiling */
enum
{
PROFILER_END = -1,
PROFILER_CPU_FIRST = 0,
PROFILER_CPU_MAX = PROFILER_CPU_FIRST + 32,
PROFILER_MEMREAD,
PROFILER_MEMWRITE,
PROFILER_VIDEO,
PROFILER_DRAWGFX,
PROFILER_COPYBITMAP,
PROFILER_TILEMAP_DRAW,
PROFILER_TILEMAP_DRAW_ROZ,
PROFILER_TILEMAP_UPDATE,
PROFILER_BLIT,
PROFILER_SOUND,
PROFILER_TIMER_CALLBACK,
PROFILER_INPUT, /* input.c and inptport.c */
PROFILER_MOVIE_REC, /* movie recording */
PROFILER_LOGERROR, /* logerror */
PROFILER_EXTRA, /* everything else */
/* the USER types are available to driver writers to profile */
/* custom sections of the code */
PROFILER_USER1,
PROFILER_USER2,
PROFILER_USER3,
PROFILER_USER4,
PROFILER_PROFILER,
PROFILER_IDLE,
PROFILER_TOTAL
};
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
typedef struct _profiler_filo_entry profiler_filo_entry;
struct _profiler_filo_entry
{
int type; /* type of entry */
osd_ticks_t start; /* start time */
};
typedef struct _profiler_data profiler_data;
struct _profiler_data
{
UINT32 context_switches; /* number of context switches seen */
osd_ticks_t duration[PROFILER_TOTAL]; /* duration spent in each entry */
};
typedef struct _profiler_state profiler_state;
struct _profiler_state
{
UINT8 enabled; /* are we enabled? */
UINT8 filoindex; /* current FILO index */
UINT8 dataindex; /* current data index */
UINT8 dataready; /* are we to display the data yet? */
profiler_filo_entry filo[16]; /* array of FILO entries */
profiler_data data[16]; /* array of data */
};
/***************************************************************************
GLOBAL VARIABLES
***************************************************************************/
extern profiler_state global_profiler;
/***************************************************************************
MACROS
***************************************************************************/
#ifdef MAME_PROFILER
#define profiler_mark_start(x) do { if (global_profiler.enabled) _profiler_mark_start(x); } while (0)
#define profiler_mark_end() do { if (global_profiler.enabled) _profiler_mark_end(); } while (0)
#define profiler_start() do { global_profiler.enabled = TRUE; global_profiler.filoindex = global_profiler.dataindex = global_profiler.dataready = 0; } while (0)
#define profiler_stop() do { global_profiler.enabled = FALSE; } while (0)
#define profiler_get_text(x,s) _profiler_get_text(x, s)
#else
#define profiler_mark_start(x) do { } while (0)
#define profiler_mark_end() do { } while (0)
#define profiler_start() do { } while (0)
#define profiler_stop() do { } while (0)
#define profiler_get_text(x,s) astring_reset(s)
#endif
/***************************************************************************
FUNCTION PROTOTYPES
***************************************************************************/
/* ----- core functions (do not call directly; use macros) ----- */
/* mark the beginning of a profiler entry */
void _profiler_mark_start(int type);
/* mark the end of a profiler entry */
void _profiler_mark_end(void);
/* return the current text in an astring */
astring *_profiler_get_text(running_machine *machine, astring *string);
#endif /* __PROFILER_H__ */