diff --git a/src/emu/cpu/mips/mips3drc.c b/src/emu/cpu/mips/mips3drc.c index c85661a62a8..68790e6625c 100644 --- a/src/emu/cpu/mips/mips3drc.c +++ b/src/emu/cpu/mips/mips3drc.c @@ -742,7 +742,7 @@ static void code_compile_block(mips3_state *mips3, UINT8 mode, offs_t pc) drcuml_block *block; jmp_buf errorbuf; - profiler_mark_start(PROFILER_DRC_COMPILE); + g_profiler.start(PROFILER_DRC_COMPILE); /* get a description of this sequence */ desclist = drcfe_describe_code(mips3->impstate->drcfe, pc); @@ -827,7 +827,7 @@ static void code_compile_block(mips3_state *mips3, UINT8 mode, offs_t pc) /* end the sequence */ drcuml_block_end(block); - profiler_mark_end(); + g_profiler.stop(); } diff --git a/src/emu/cpu/powerpc/ppcdrc.c b/src/emu/cpu/powerpc/ppcdrc.c index 4d46d87665c..dc5abc5e902 100644 --- a/src/emu/cpu/powerpc/ppcdrc.c +++ b/src/emu/cpu/powerpc/ppcdrc.c @@ -947,7 +947,7 @@ static void code_compile_block(powerpc_state *ppc, UINT8 mode, offs_t pc) drcuml_block *block; jmp_buf errorbuf; - profiler_mark_start(PROFILER_DRC_COMPILE); + g_profiler.start(PROFILER_DRC_COMPILE); /* get a description of this sequence */ desclist = drcfe_describe_code(ppc->impstate->drcfe, pc); @@ -1030,7 +1030,7 @@ static void code_compile_block(powerpc_state *ppc, UINT8 mode, offs_t pc) /* end the sequence */ drcuml_block_end(block); - profiler_mark_end(); + g_profiler.stop(); } diff --git a/src/emu/cpu/rsp/rspdrc.c b/src/emu/cpu/rsp/rspdrc.c index 2ce39c5d015..74814b0fa9e 100644 --- a/src/emu/cpu/rsp/rspdrc.c +++ b/src/emu/cpu/rsp/rspdrc.c @@ -7207,7 +7207,7 @@ static void code_compile_block(rsp_state *rsp, offs_t pc) drcuml_block *block; jmp_buf errorbuf; - profiler_mark_start(PROFILER_DRC_COMPILE); + g_profiler.start(PROFILER_DRC_COMPILE); /* get a description of this sequence */ desclist = drcfe_describe_code(rsp->impstate->drcfe, pc); @@ -7288,7 +7288,7 @@ static void code_compile_block(rsp_state *rsp, offs_t pc) /* end the sequence */ drcuml_block_end(block); - profiler_mark_end(); + g_profiler.stop(); } /*************************************************************************** diff --git a/src/emu/cpu/sh2/sh2drc.c b/src/emu/cpu/sh2/sh2drc.c index 22de8755c30..77f33b9a1ac 100644 --- a/src/emu/cpu/sh2/sh2drc.c +++ b/src/emu/cpu/sh2/sh2drc.c @@ -925,7 +925,7 @@ static void code_compile_block(sh2_state *sh2, UINT8 mode, offs_t pc) drcuml_block *block; jmp_buf errorbuf; - profiler_mark_start(PROFILER_DRC_COMPILE); + g_profiler.start(PROFILER_DRC_COMPILE); /* get a description of this sequence */ desclist = drcfe_describe_code(sh2->drcfe, pc); @@ -1016,7 +1016,7 @@ static void code_compile_block(sh2_state *sh2, UINT8 mode, offs_t pc) /* end the sequence */ drcuml_block_end(block); - profiler_mark_end(); + g_profiler.stop(); } /*------------------------------------------------- diff --git a/src/emu/diexec.c b/src/emu/diexec.c index 11f8f04804a..eb6dfe8eca5 100644 --- a/src/emu/diexec.c +++ b/src/emu/diexec.c @@ -267,7 +267,7 @@ device_execute_interface::device_execute_interface(running_machine &machine, con m_timedint_timer(NULL), m_iloops(0), m_partial_frame_timer(NULL), - m_profiler(0), + m_profiler(PROFILER_IDLE), m_icount(NULL), m_cycles_running(0), m_cycles_stolen(0), @@ -538,7 +538,7 @@ void device_execute_interface::interface_pre_start() // fill in the initial states int index = m_machine.m_devicelist.index(&m_device); m_suspend = SUSPEND_REASON_RESET; - m_profiler = index + PROFILER_DEVICE_FIRST; + m_profiler = profile_type(index + PROFILER_DEVICE_FIRST); m_inttrigger = index + TRIGGER_INT; // fill in the input states and IRQ callback information diff --git a/src/emu/diexec.h b/src/emu/diexec.h index d52ce171f73..27d1cd0b28f 100644 --- a/src/emu/diexec.h +++ b/src/emu/diexec.h @@ -322,7 +322,7 @@ protected: attotime m_partial_frame_period; // the length of one partial frame for interrupt purposes // cycle counting and executing - int m_profiler; // profiler tag + profile_type m_profiler; // profiler tag int * m_icount; // pointer to the icount int m_cycles_running; // number of cycles we are executing int m_cycles_stolen; // number of cycles we artificially stole diff --git a/src/emu/drawgfxm.h b/src/emu/drawgfxm.h index edea0b7d280..19e2a4fc98f 100644 --- a/src/emu/drawgfxm.h +++ b/src/emu/drawgfxm.h @@ -370,7 +370,7 @@ while (0) \ #define DRAWGFX_CORE(PIXEL_TYPE, PIXEL_OP, PRIORITY_TYPE) \ do { \ - profiler_mark_start(PROFILER_DRAWGFX); \ + g_profiler.start(PROFILER_DRAWGFX); \ do { \ const UINT8 *srcdata; \ INT32 destendx, destendy; \ @@ -613,7 +613,7 @@ do { \ } \ } \ } while (0); \ - profiler_mark_end(); \ + g_profiler.stop(); \ } while (0) @@ -642,7 +642,7 @@ do { \ #define DRAWGFXZOOM_CORE(PIXEL_TYPE, PIXEL_OP, PRIORITY_TYPE) \ do { \ - profiler_mark_start(PROFILER_DRAWGFX); \ + g_profiler.start(PROFILER_DRAWGFX); \ do { \ const UINT8 *srcdata; \ UINT32 dstwidth, dstheight; \ @@ -698,7 +698,7 @@ do { \ destendy = desty + dstheight - 1; \ if (desty > cliprect->max_y || destendy < cliprect->min_y) \ { \ - profiler_mark_end(); \ + g_profiler.stop(); \ return; \ } \ \ @@ -797,7 +797,7 @@ do { \ } \ } \ } while (0); \ - profiler_mark_end(); \ + g_profiler.stop(); \ } while (0) @@ -821,7 +821,7 @@ do { \ #define COPYBITMAP_CORE(PIXEL_TYPE, PIXEL_OP, PRIORITY_TYPE) \ do { \ - profiler_mark_start(PROFILER_COPYBITMAP); \ + g_profiler.start(PROFILER_COPYBITMAP); \ do { \ const PIXEL_TYPE *srcdata; \ UINT32 numblocks, leftovers; \ @@ -975,7 +975,7 @@ do { \ } \ } \ } while (0); \ - profiler_mark_end(); \ + g_profiler.stop(); \ } while (0) @@ -1006,7 +1006,7 @@ do { \ UINT32 numblocks, leftovers; \ INT32 curx, cury; \ \ - profiler_mark_start(PROFILER_COPYBITMAP); \ + g_profiler.start(PROFILER_COPYBITMAP); \ \ assert(dest != NULL); \ assert(src != NULL); \ @@ -1280,7 +1280,7 @@ do { \ } \ } \ } \ - profiler_mark_end(); \ + g_profiler.stop(); \ } while (0) diff --git a/src/emu/emu.h b/src/emu/emu.h index 6caa97d20ec..4330ffaf2ae 100644 --- a/src/emu/emu.h +++ b/src/emu/emu.h @@ -52,6 +52,7 @@ // core emulator headers -- must be first #include "emucore.h" #include "eminline.h" +#include "profiler.h" // commonly-referenecd utilities imported from lib/util #include "chd.h" diff --git a/src/emu/inptport.c b/src/emu/inptport.c index 5f7cf01db18..ff44b9f09fd 100644 --- a/src/emu/inptport.c +++ b/src/emu/inptport.c @@ -2468,7 +2468,7 @@ static void frame_update(running_machine *machine) INT32 mouse_target_y; int mouse_button; -profiler_mark_start(PROFILER_INPUT); +g_profiler.start(PROFILER_INPUT); /* record/playback information about the current frame */ playback_frame(machine, curtime); @@ -2546,7 +2546,7 @@ profiler_mark_start(PROFILER_INPUT); } } -profiler_mark_end(); +g_profiler.stop(); } diff --git a/src/emu/input.c b/src/emu/input.c index 5488959a778..2127de21b00 100644 --- a/src/emu/input.c +++ b/src/emu/input.c @@ -857,7 +857,7 @@ INT32 input_code_value(running_machine *machine, input_code code) INT32 result = 0; int curindex; - profiler_mark_start(PROFILER_INPUT); + g_profiler.start(PROFILER_INPUT); /* return 0 for any disabled or invalid device classes */ if (devclass <= DEVICE_CLASS_INVALID || devclass >= DEVICE_CLASS_MAXIMUM || !device_list[devclass].enabled) @@ -908,7 +908,7 @@ INT32 input_code_value(running_machine *machine, input_code code) } exit: - profiler_mark_end(); + g_profiler.stop(); return result; } diff --git a/src/emu/machine.c b/src/emu/machine.c index f7695409328..4eef52a68e7 100644 --- a/src/emu/machine.c +++ b/src/emu/machine.c @@ -403,7 +403,7 @@ int running_machine::run(bool firstrun) m_hard_reset_pending = false; while ((!m_hard_reset_pending && !m_exit_pending) || m_saveload_schedule != SLS_NONE) { - profiler_mark_start(PROFILER_EXTRA); + g_profiler.start(PROFILER_EXTRA); // execute CPUs if not paused if (!m_paused) @@ -417,7 +417,7 @@ int running_machine::run(bool firstrun) if (m_saveload_schedule != SLS_NONE) handle_saveload(); - profiler_mark_end(); + g_profiler.stop(); } // and out via the exit phase @@ -713,7 +713,7 @@ void CLIB_DECL running_machine::vlogerror(const char *format, va_list args) // process only if there is a target if (m_logerror_list != NULL) { - profiler_mark_start(PROFILER_LOGERROR); + g_profiler.start(PROFILER_LOGERROR); // dump to the buffer vsnprintf(giant_string_buffer, ARRAY_LENGTH(giant_string_buffer), format, args); @@ -722,7 +722,7 @@ void CLIB_DECL running_machine::vlogerror(const char *format, va_list args) for (logerror_callback_item *cb = m_logerror_list; cb != NULL; cb = cb->m_next) (*cb->m_func)(*this, giant_string_buffer); - profiler_mark_end(); + g_profiler.stop(); } } diff --git a/src/emu/memory.c b/src/emu/memory.c index e41a29e4964..7ed53acad15 100644 --- a/src/emu/memory.c +++ b/src/emu/memory.c @@ -1071,7 +1071,7 @@ public: // native read _NativeType read_native(offs_t offset, _NativeType mask) { - profiler_mark_start(PROFILER_MEMREAD); + g_profiler.start(PROFILER_MEMREAD); if (TEST_HANDLER) printf("[r%X,%s]", offset, core_i64_hex_format(mask, sizeof(_NativeType) * 2)); @@ -1089,14 +1089,14 @@ public: else if (sizeof(_NativeType) == 4) result = handler.read32(*this, offset >> 2, mask); else if (sizeof(_NativeType) == 8) result = handler.read64(*this, offset >> 3, mask); - profiler_mark_end(); + g_profiler.stop(); return result; } // mask-less native read _NativeType read_native(offs_t offset) { - profiler_mark_start(PROFILER_MEMREAD); + g_profiler.start(PROFILER_MEMREAD); if (TEST_HANDLER) printf("[r%X]", offset); @@ -1114,14 +1114,14 @@ public: else if (sizeof(_NativeType) == 4) result = handler.read32(*this, offset >> 2, 0xffffffff); else if (sizeof(_NativeType) == 8) result = handler.read64(*this, offset >> 3, U64(0xffffffffffffffff)); - profiler_mark_end(); + g_profiler.stop(); return result; } // native write void write_native(offs_t offset, _NativeType data, _NativeType mask) { - profiler_mark_start(PROFILER_MEMWRITE); + g_profiler.start(PROFILER_MEMWRITE); // look up the handler offs_t byteaddress = offset & m_bytemask; @@ -1140,13 +1140,13 @@ public: else if (sizeof(_NativeType) == 4) handler.write32(*this, offset >> 2, data, mask); else if (sizeof(_NativeType) == 8) handler.write64(*this, offset >> 3, data, mask); - profiler_mark_end(); + g_profiler.stop(); } // mask-less native write void write_native(offs_t offset, _NativeType data) { - profiler_mark_start(PROFILER_MEMWRITE); + g_profiler.start(PROFILER_MEMWRITE); // look up the handler offs_t byteaddress = offset & m_bytemask; @@ -1161,7 +1161,7 @@ public: else if (sizeof(_NativeType) == 4) handler.write32(*this, offset >> 2, data, 0xffffffff); else if (sizeof(_NativeType) == 8) handler.write64(*this, offset >> 3, data, U64(0xffffffffffffffff)); - profiler_mark_end(); + g_profiler.stop(); } // generic direct read diff --git a/src/emu/profiler.c b/src/emu/profiler.c index 2be7d272457..fa8d6eeb900 100644 --- a/src/emu/profiler.c +++ b/src/emu/profiler.c @@ -4,8 +4,49 @@ Functions to manage profiling of MAME execution. - Copyright Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +**************************************************************************** + + Profiling is scope-based. To start profiling, put a profiler_scope + object on the stack. To end profiling, just end the scope: + + { + profiler_scope scope(PROFILER_VIDEO); + + your_work_here(); + } + + the profiler handles a FILO list so calls may be nested. ***************************************************************************/ @@ -14,12 +55,11 @@ -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** -typedef struct _profile_string profile_string; -struct _profile_string +struct profile_string { int type; const char *string; @@ -27,94 +67,120 @@ struct _profile_string -/*************************************************************************** - GLOBAL VARIABLES -***************************************************************************/ +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** -profiler_state global_profiler; +profiler_state g_profiler; -/*************************************************************************** - CORE FUNCTIONS -***************************************************************************/ +//************************************************************************** +// DUMMY PROFILER STATE +//************************************************************************** -/*------------------------------------------------- - _profiler_mark_start - mark the beginning of a - profiler entry --------------------------------------------------*/ +//------------------------------------------------- +// dummy_profiler_state - constructor +//------------------------------------------------- -void _profiler_mark_start(int type) +dummy_profiler_state::dummy_profiler_state() { - profiler_data *data = &global_profiler.data[global_profiler.dataindex]; - osd_ticks_t curticks = get_profile_ticks(); - profiler_filo_entry *entry; - int index; - - /* track context switches */ - if (type >= PROFILER_DEVICE_FIRST && type <= PROFILER_DEVICE_MAX) - data->context_switches++; - - /* we're starting a new bucket, begin now */ - index = global_profiler.filoindex++; - entry = &global_profiler.filo[index]; - - /* fail if we overflow */ - if (index > ARRAY_LENGTH(global_profiler.filo)) - fatalerror("Profiler FILO overflow (type = %d)\n", type); - - /* if we're nested, stop the previous entry */ - if (index > 0) - { - profiler_filo_entry *preventry = entry - 1; - data->duration[preventry->type] += curticks - preventry->start; - } - - /* fill in this entry */ - entry->type = type; - entry->start = curticks; } -/*------------------------------------------------- - _profiler_mark_end - mark the end of a - profiler entry --------------------------------------------------*/ -void _profiler_mark_end(void) +//************************************************************************** +// REAL PROFILER STATE +//************************************************************************** + +//------------------------------------------------- +// real_profiler_state - constructor +//------------------------------------------------- + +real_profiler_state::real_profiler_state() + : m_enabled(false), + m_dataready(false), + m_filoindex(0), + m_dataindex(0) +{ + memset(m_filo, 0, sizeof(m_filo)); + memset(m_data, 0, sizeof(m_data)); +} + + +//------------------------------------------------- +// real_start - mark the beginning of a +// profiler entry +//------------------------------------------------- + +void real_profiler_state::real_start(profile_type type) { - profiler_data *data = &global_profiler.data[global_profiler.dataindex]; osd_ticks_t curticks = get_profile_ticks(); - /* we're ending an existing bucket, update the time */ - if (global_profiler.filoindex > 0) + // track context switches + history_data &data = m_data[m_dataindex]; + if (type >= PROFILER_DEVICE_FIRST && type <= PROFILER_DEVICE_MAX) + data.context_switches++; + + // we're starting a new bucket, begin now + int index = m_filoindex++; + filo_entry &entry = m_filo[index]; + + // fail if we overflow + if (index > ARRAY_LENGTH(m_filo)) + throw emu_fatalerror("Profiler FILO overflow (type = %d)\n", type); + + // if we're nested, stop the previous entry + if (index > 0) { - int index = --global_profiler.filoindex; - profiler_filo_entry *entry = &global_profiler.filo[index]; + filo_entry &preventry = m_filo[index - 1]; + data.duration[preventry.type] += curticks - preventry.start; + } - /* account for the time taken */ - data->duration[entry->type] += curticks - entry->start; + // fill in this entry + entry.type = type; + entry.start = curticks; +} - /* if we have a previous entry, restart his time now */ + +//------------------------------------------------- +// real_stop - mark the end of a profiler entry +//------------------------------------------------- + +void real_profiler_state::real_stop() +{ + osd_ticks_t curticks = get_profile_ticks(); + + // we're ending an existing bucket, update the time + if (m_filoindex > 0) + { + int index = --m_filoindex; + filo_entry &entry = m_filo[index]; + + // account for the time taken + history_data &data = m_data[m_dataindex]; + data.duration[entry.type] += curticks - entry.start; + + // if we have a previous entry, restart his time now if (index != 0) { - profiler_filo_entry *preventry = entry - 1; - preventry->start = curticks; + filo_entry &preventry = m_filo[index - 1]; + preventry.start = curticks; } } } -/*------------------------------------------------- - _profiler_get_text - return the current text - in an astring --------------------------------------------------*/ +//------------------------------------------------- +// text - return the current text in an astring +//------------------------------------------------- -astring &_profiler_get_text(running_machine *machine, astring &string) +const char *real_profiler_state::text(running_machine &machine, astring &string) { static const profile_string names[] = { { PROFILER_DRC_COMPILE, "DRC Compilation" }, + { PROFILER_MEM_REMAP, "Memory Remapping" }, { PROFILER_MEMREAD, "Memory Read" }, { PROFILER_MEMWRITE, "Memory Write" }, { PROFILER_VIDEO, "Video Update" }, @@ -141,84 +207,77 @@ astring &_profiler_get_text(running_machine *machine, astring &string) { PROFILER_PROFILER, "Profiler" }, { PROFILER_IDLE, "Idle" } }; - UINT64 computed, normalize, total; - int curtype, curmem, switches; - profiler_mark_start(PROFILER_PROFILER); + profiler_scope profile(PROFILER_PROFILER); - /* compute the total time for all bits, not including profiler or idle */ - computed = 0; - for (curtype = 0; curtype < PROFILER_PROFILER; curtype++) - for (curmem = 0; curmem < ARRAY_LENGTH(global_profiler.data); curmem++) - computed += global_profiler.data[curmem].duration[curtype]; + // compute the total time for all bits, not including profiler or idle + UINT64 computed = 0; + profile_type curtype; + for (curtype = PROFILER_DEVICE_FIRST; curtype < PROFILER_PROFILER; curtype++) + for (int curmem = 0; curmem < ARRAY_LENGTH(m_data); curmem++) + computed += m_data[curmem].duration[curtype]; - /* save that result in normalize, and continue adding the rest */ - normalize = computed; + // save that result in normalize, and continue adding the rest + UINT64 normalize = computed; for ( ; curtype < PROFILER_TOTAL; curtype++) - for (curmem = 0; curmem < ARRAY_LENGTH(global_profiler.data); curmem++) - computed += global_profiler.data[curmem].duration[curtype]; + for (int curmem = 0; curmem < ARRAY_LENGTH(m_data); curmem++) + computed += m_data[curmem].duration[curtype]; - /* this becomes the total; if we end up with 0 for anything, we were just started, so return empty */ - total = computed; + // this becomes the total; if we end up with 0 for anything, we were just started, so return empty + UINT64 total = computed; string.reset(); if (total == 0 || normalize == 0) - goto out; + return string; - /* loop over all types and generate the string */ - for (curtype = 0; curtype < PROFILER_TOTAL; curtype++) + // loop over all types and generate the string + for (curtype = PROFILER_DEVICE_FIRST; curtype < PROFILER_TOTAL; curtype++) { - /* determine the accumulated time for this type */ + // determine the accumulated time for this type computed = 0; - for (curmem = 0; curmem < ARRAY_LENGTH(global_profiler.data); curmem++) - computed += global_profiler.data[curmem].duration[curtype]; + for (int curmem = 0; curmem < ARRAY_LENGTH(m_data); curmem++) + computed += m_data[curmem].duration[curtype]; - /* if we have non-zero data and we're ready to display, do it */ - if (global_profiler.dataready && computed != 0) + // if we have non-zero data and we're ready to display, do it + if (m_dataready && computed != 0) { - int nameindex; - - /* start with the un-normalized percentage */ + // start with the un-normalized percentage string.catprintf("%02d%% ", (int)((computed * 100 + total/2) / total)); - /* followed by the normalized percentage for everything but profiler and idle */ + // followed by the normalized percentage for everything but profiler and idle if (curtype < PROFILER_PROFILER) string.catprintf("%02d%% ", (int)((computed * 100 + normalize/2) / normalize)); - /* and then the text */ + // and then the text if (curtype >= PROFILER_DEVICE_FIRST && curtype <= PROFILER_DEVICE_MAX) - string.catprintf("'%s'", machine->m_devicelist.find(curtype - PROFILER_DEVICE_FIRST)->tag()); + string.catprintf("'%s'", machine.m_devicelist.find(curtype - PROFILER_DEVICE_FIRST)->tag()); else - for (nameindex = 0; nameindex < ARRAY_LENGTH(names); nameindex++) + for (int nameindex = 0; nameindex < ARRAY_LENGTH(names); nameindex++) if (names[nameindex].type == curtype) { string.cat(names[nameindex].string); break; } - /* followed by a carriage return */ + // followed by a carriage return string.cat("\n"); } } - /* followed by context switches */ - if (global_profiler.dataready) + // followed by context switches + if (m_dataready) { - switches = 0; - for (curmem = 0; curmem < ARRAY_LENGTH(global_profiler.data); curmem++) - switches += global_profiler.data[curmem].context_switches; - string.catprintf("%d CPU switches\n", switches / (int) ARRAY_LENGTH(global_profiler.data)); + int switches = 0; + for (int curmem = 0; curmem < ARRAY_LENGTH(m_data); curmem++) + switches += m_data[curmem].context_switches; + string.catprintf("%d CPU switches\n", switches / (int) ARRAY_LENGTH(m_data)); } - /* advance to the next dataset and reset it to 0 */ - global_profiler.dataindex = (global_profiler.dataindex + 1) % ARRAY_LENGTH(global_profiler.data); - memset(&global_profiler.data[global_profiler.dataindex], 0, sizeof(global_profiler.data[global_profiler.dataindex])); - - /* we are ready once we have wrapped around */ - if (global_profiler.dataindex == 0) - global_profiler.dataready = TRUE; - -out: - profiler_mark_end(); + // advance to the next dataset and reset it to 0 + m_dataindex = (m_dataindex + 1) % ARRAY_LENGTH(m_data); + memset(&m_data[m_dataindex], 0, sizeof(m_data[m_dataindex])); + // we are ready once we have wrapped around + if (m_dataindex == 0) + m_dataready = true; return string; } diff --git a/src/emu/profiler.h b/src/emu/profiler.h index 5b28e2cff16..9e6c8ab8996 100644 --- a/src/emu/profiler.h +++ b/src/emu/profiler.h @@ -4,16 +4,47 @@ Functions to manage profiling of MAME execution. - Copyright Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. **************************************************************************** - To start profiling a certain section, e.g. video: - profiler_mark_start(PROFILER_VIDEO); + Profiling is scope-based. To start profiling, put a profiler_scope + object on the stack. To end profiling, just end the scope: - to end profiling the current section: - profiler_mark_end(); + { + profiler_scope scope(PROFILER_VIDEO); + + your_work_here(); + } the profiler handles a FILO list so calls may be nested. @@ -26,16 +57,16 @@ -/*************************************************************************** - CONSTANTS -***************************************************************************/ +//************************************************************************** +// CONSTANTS +//************************************************************************** -/* profiling */ -enum +enum profile_type { PROFILER_DEVICE_FIRST = 0, PROFILER_DEVICE_MAX = PROFILER_DEVICE_FIRST + 256, PROFILER_DRC_COMPILE, + PROFILER_MEM_REMAP, PROFILER_MEMREAD, PROFILER_MEMWRITE, PROFILER_VIDEO, @@ -47,13 +78,13 @@ enum 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 */ + 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 */ + // the USER types are available to driver writers to profile + // custom sections of the code PROFILER_USER1, PROFILER_USER2, PROFILER_USER3, @@ -67,89 +98,111 @@ enum PROFILER_IDLE, PROFILER_TOTAL }; +DECLARE_ENUM_OPERATORS(profile_type); -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** -typedef struct _profiler_filo_entry profiler_filo_entry; -struct _profiler_filo_entry + +// ======================> real_profiler_state + +class real_profiler_state { - int type; /* type of entry */ - osd_ticks_t start; /* start time */ + friend class profile_scope; + +public: + // construction/destruction + real_profiler_state(); + + // getters + bool enabled() const { return m_enabled; } + const char *text(running_machine &machine, astring &string); + + // enable/disable + void enable(bool state = true) + { + if (state != m_enabled) + { + m_enabled = state; + if (m_enabled) + { + m_dataready = false; + m_filoindex = m_dataindex = 0; + } + } + } + + // start/stop + void start(profile_type type) { if (m_enabled) real_start(type); } + void stop() { if (m_enabled) real_stop(); } + +private: + void real_start(profile_type type); + void real_stop(); + + // an entry in the FILO + struct filo_entry + { + int type; // type of entry + osd_ticks_t start; // start time + }; + + // item in the array of recent states + struct history_data + { + UINT32 context_switches; // number of context switches seen + osd_ticks_t duration[PROFILER_TOTAL]; // duration spent in each entry + }; + + // internal state + bool m_enabled; // are we enabled? + bool m_dataready; // are we to display the data yet? + UINT8 m_filoindex; // current FILO index + UINT8 m_dataindex; // current data index + filo_entry m_filo[16]; // array of FILO entries + history_data m_data[16]; // array of data }; -typedef struct _profiler_data profiler_data; -struct _profiler_data +// ======================> dummy_profiler_state + +class dummy_profiler_state { - UINT32 context_switches; /* number of context switches seen */ - osd_ticks_t duration[PROFILER_TOTAL]; /* duration spent in each entry */ +public: + // construction/destruction + dummy_profiler_state(); + + // getters + bool enabled() const { return false; } + const char *text(running_machine &machine, astring &string) { return string.cpy(""); } + + // enable/disable + void enable(bool state = true) { } + + // start/stop + void start(profile_type type) { } + void stop() { } }; -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 -***************************************************************************/ +// ======================> profiler_state #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) - +typedef real_profiler_state profiler_state; #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) (s).reset() - +typedef dummy_profiler_state profiler_state; #endif -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** - -/* ----- 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); +extern profiler_state g_profiler; #endif /* __PROFILER_H__ */ diff --git a/src/emu/schedule.c b/src/emu/schedule.c index 04b6c330a26..ea33f7e308f 100644 --- a/src/emu/schedule.c +++ b/src/emu/schedule.c @@ -180,7 +180,7 @@ if (TEMPLOG) // if we're not suspended, actually execute if (exec->m_suspend == 0) { - profiler_mark_start(exec->m_profiler); + g_profiler.start(exec->m_profiler); // note that this global variable cycles_stolen can be modified // via the call to cpu_execute @@ -202,7 +202,7 @@ if (TEMPLOG) printf("Executing %s for %d cycles\n", exec->device().tag(), ran); ran -= *exec->m_icount; assert(ran >= exec->m_cycles_stolen); ran -= exec->m_cycles_stolen; - profiler_mark_end(); + g_profiler.stop(); } else if (TEMPLOG) printf("Skipping %s for %d cycles\n", exec->device().tag(), ran); diff --git a/src/emu/sound.c b/src/emu/sound.c index 9faeb4f3814..71657f3a048 100644 --- a/src/emu/sound.c +++ b/src/emu/sound.c @@ -404,7 +404,7 @@ static TIMER_CALLBACK( sound_update ) VPRINTF(("sound_update\n")); - profiler_mark_start(PROFILER_SOUND); + g_profiler.start(PROFILER_SOUND); leftmix = global->leftmix; rightmix = global->rightmix; @@ -452,7 +452,7 @@ static TIMER_CALLBACK( sound_update ) /* update the streamer */ streams_update(machine); - profiler_mark_end(); + g_profiler.stop(); } diff --git a/src/emu/streams.c b/src/emu/streams.c index e8ed193af7f..0beb05610e4 100644 --- a/src/emu/streams.c +++ b/src/emu/streams.c @@ -508,11 +508,11 @@ void stream_update(sound_stream *stream) INT32 update_sampindex = time_to_sampindex(strdata, stream, timer_get_time(machine)); /* generate samples to get us up to the appropriate time */ - profiler_mark_start(PROFILER_SOUND); + g_profiler.start(PROFILER_SOUND); assert(stream->output_sampindex - stream->output_base_sampindex >= 0); assert(update_sampindex - stream->output_base_sampindex <= stream->output_bufalloc); generate_samples(stream, update_sampindex - stream->output_sampindex); - profiler_mark_end(); + g_profiler.stop(); /* remember this info for next time */ stream->output_sampindex = update_sampindex; diff --git a/src/emu/tilemap.c b/src/emu/tilemap.c index ed9e95d0036..2db2f7aebbf 100644 --- a/src/emu/tilemap.c +++ b/src/emu/tilemap.c @@ -824,7 +824,7 @@ void tilemap_draw_primask(bitmap_t *dest, const rectangle *cliprect, tilemap_t * if (!tmap->enable) return; -profiler_mark_start(PROFILER_TILEMAP_DRAW); +g_profiler.start(PROFILER_TILEMAP_DRAW); /* configure the blit parameters based on the input parameters */ configure_blit_parameters(&blit, tmap, dest, cliprect, flags, priority, priority_mask); @@ -927,7 +927,7 @@ profiler_mark_start(PROFILER_TILEMAP_DRAW); } } } -profiler_mark_end(); +g_profiler.stop(); } @@ -962,7 +962,7 @@ void tilemap_draw_roz_primask(bitmap_t *dest, const rectangle *cliprect, tilemap return; } -profiler_mark_start(PROFILER_TILEMAP_DRAW_ROZ); +g_profiler.start(PROFILER_TILEMAP_DRAW_ROZ); /* configure the blit parameters */ configure_blit_parameters(&blit, tmap, dest, cliprect, flags, priority, priority_mask); @@ -971,7 +971,7 @@ profiler_mark_start(PROFILER_TILEMAP_DRAW_ROZ); /* then do the roz copy */ tilemap_draw_roz_core(tmap, &blit, startx, starty, incxx, incxy, incyx, incyy, wraparound); -profiler_mark_end(); +g_profiler.stop(); } @@ -1274,7 +1274,7 @@ static void pixmap_update(tilemap_t *tmap, const rectangle *cliprect) if (tmap->all_tiles_clean) return; -profiler_mark_start(PROFILER_TILEMAP_DRAW); +g_profiler.start(PROFILER_TILEMAP_DRAW); /* compute which columns and rows to update */ if (cliprect != NULL) @@ -1314,7 +1314,7 @@ profiler_mark_start(PROFILER_TILEMAP_DRAW); if (mincol == 0 && minrow == 0 && maxcol == tmap->cols - 1 && maxcol == tmap->rows - 1) tmap->all_tiles_clean = TRUE; -profiler_mark_end(); +g_profiler.stop(); } @@ -1329,7 +1329,7 @@ static void tile_update(tilemap_t *tmap, tilemap_logical_index logindex, UINT32 tilemap_memory_index memindex; UINT32 flags; -profiler_mark_start(PROFILER_TILEMAP_UPDATE); +g_profiler.start(PROFILER_TILEMAP_UPDATE); /* call the get info callback for the associated memory index */ memindex = tmap->logical_to_memory[logindex]; @@ -1353,7 +1353,7 @@ profiler_mark_start(PROFILER_TILEMAP_UPDATE); tmap->gfx_dirtyseq[tmap->tileinfo.gfxnum] = tmap->machine->gfx[tmap->tileinfo.gfxnum]->dirtyseq; } -profiler_mark_end(); +g_profiler.stop(); } diff --git a/src/emu/timer.c b/src/emu/timer.c index 0faebed1468..c6b35eb7370 100644 --- a/src/emu/timer.c +++ b/src/emu/timer.c @@ -371,9 +371,9 @@ void timer_execute_timers(running_machine *machine) if (was_enabled && timer->callback != NULL) { LOG(("Timer %s:%d[%s] fired (expire=%s)\n", timer->file, timer->line, timer->func, attotime_string(timer->expire, 9))); - profiler_mark_start(PROFILER_TIMER_CALLBACK); + g_profiler.start(PROFILER_TIMER_CALLBACK); (*timer->callback)(machine, timer->ptr, timer->param); - profiler_mark_end(); + g_profiler.stop(); } /* clear the callback timer global */ diff --git a/src/emu/ui.c b/src/emu/ui.c index 28b73481c77..db551a63cd5 100644 --- a/src/emu/ui.c +++ b/src/emu/ui.c @@ -822,16 +822,8 @@ int ui_get_show_fps(void) void ui_set_show_profiler(int show) { - if (show) - { - show_profiler = TRUE; - profiler_start(); - } - else - { - show_profiler = FALSE; - profiler_stop(); - } + show_profiler = show; + g_profiler.enable(show); } @@ -1302,7 +1294,7 @@ static UINT32 handler_ingame(running_machine *machine, render_container *contain if (show_profiler) { astring profilertext; - profiler_get_text(machine, profilertext); + g_profiler.text(*machine, profilertext); ui_draw_text_full(container, profilertext, 0.0f, 0.0f, 1.0f, JUSTIFY_LEFT, WRAP_WORD, DRAW_OPAQUE, ARGB_WHITE, ARGB_BLACK, NULL, NULL); } diff --git a/src/emu/uiinput.c b/src/emu/uiinput.c index 1d6c1e273cb..486d710ff54 100644 --- a/src/emu/uiinput.c +++ b/src/emu/uiinput.c @@ -255,7 +255,7 @@ int ui_input_pressed_repeat(running_machine *machine, int code, int speed) ui_input_private *uidata = machine->ui_input_data; int pressed = FALSE; -profiler_mark_start(PROFILER_INPUT); +g_profiler.start(PROFILER_INPUT); /* get the status of this key (assumed to be only in the defaults) */ assert(code >= IPT_UI_CONFIGURE && code <= IPT_OSD_16); @@ -283,7 +283,7 @@ profiler_mark_start(PROFILER_INPUT); else uidata->next_repeat[code] = 0; -profiler_mark_end(); +g_profiler.stop(); return pressed; } diff --git a/src/emu/video.c b/src/emu/video.c index d4c7bc49e7e..60d041bf377 100644 --- a/src/emu/video.c +++ b/src/emu/video.c @@ -461,9 +461,9 @@ void video_frame_update(running_machine *machine, int debug) update_throttle(machine, current_time); /* ask the OSD to update */ - profiler_mark_start(PROFILER_BLIT); + g_profiler.start(PROFILER_BLIT); osd_update(machine, !debug && skipped_it); - profiler_mark_end(); + g_profiler.stop(); /* perform tasks for this frame */ if (!debug) @@ -487,9 +487,9 @@ void video_frame_update(running_machine *machine, int debug) /* otherwise, call the video EOF callback */ else if (machine->config->m_video_eof != NULL) { - profiler_mark_start(PROFILER_VIDEO); + g_profiler.start(PROFILER_VIDEO); (*machine->config->m_video_eof)(machine); - profiler_mark_end(); + g_profiler.stop(); } } } @@ -882,7 +882,7 @@ static osd_ticks_t throttle_until_ticks(running_machine *machine, osd_ticks_t ta allowed_to_sleep = TRUE; /* loop until we reach our target */ - profiler_mark_start(PROFILER_IDLE); + g_profiler.start(PROFILER_IDLE); while (current_ticks < target_ticks) { osd_ticks_t delta; @@ -920,7 +920,7 @@ static osd_ticks_t throttle_until_ticks(running_machine *machine, osd_ticks_t ta } current_ticks = new_ticks; } - profiler_mark_end(); + g_profiler.stop(); return current_ticks; } @@ -1370,7 +1370,7 @@ static void video_mng_record_frame(running_machine *machine) png_info pnginfo = { 0 }; png_error error; - profiler_mark_start(PROFILER_MOVIE_REC); + g_profiler.start(PROFILER_MOVIE_REC); /* create the bitmap */ create_snapshot_bitmap(NULL); @@ -1406,7 +1406,7 @@ static void video_mng_record_frame(running_machine *machine) global.movie_frame++; } - profiler_mark_end(); + g_profiler.stop(); } } @@ -1505,7 +1505,7 @@ static void video_avi_record_frame(running_machine *machine) attotime curtime = timer_get_time(machine); avi_error avierr; - profiler_mark_start(PROFILER_MOVIE_REC); + g_profiler.start(PROFILER_MOVIE_REC); /* create the bitmap */ create_snapshot_bitmap(NULL); @@ -1526,7 +1526,7 @@ static void video_avi_record_frame(running_machine *machine) global.movie_frame++; } - profiler_mark_end(); + g_profiler.stop(); } } @@ -1543,7 +1543,7 @@ void video_avi_add_sound(running_machine *machine, const INT16 *sound, int numsa { avi_error avierr; - profiler_mark_start(PROFILER_MOVIE_REC); + g_profiler.start(PROFILER_MOVIE_REC); /* write the next frame */ avierr = avi_append_sound_samples(global.avifile, 0, sound + 0, numsamples, 1); @@ -1552,7 +1552,7 @@ void video_avi_add_sound(running_machine *machine, const INT16 *sound, int numsa if (avierr != AVIERR_NONE) video_avi_end_recording(machine); - profiler_mark_end(); + g_profiler.stop(); } } @@ -2118,13 +2118,13 @@ bool screen_device::update_partial(int scanline) { UINT32 flags = UPDATE_HAS_NOT_CHANGED; - profiler_mark_start(PROFILER_VIDEO); + g_profiler.start(PROFILER_VIDEO); LOG_PARTIAL_UPDATES(("updating %d-%d\n", clip.min_y, clip.max_y)); if (machine->config->m_video_update != NULL) flags = (*machine->config->m_video_update)(this, m_bitmap[m_curbitmap], &clip); global.partial_updates_this_frame++; - profiler_mark_end(); + g_profiler.stop(); // if we modified the bitmap, we have to commit m_changed |= ~flags & UPDATE_HAS_NOT_CHANGED; diff --git a/src/emu/video/voodoo.c b/src/emu/video/voodoo.c index e2ff9976335..a44be503927 100644 --- a/src/emu/video/voodoo.c +++ b/src/emu/video/voodoo.c @@ -3417,7 +3417,7 @@ WRITE32_DEVICE_HANDLER( voodoo_w ) voodoo_state *v = get_safe_token(device); int stall = FALSE; - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); /* should not be getting accesses while stalled */ if (v->pci.stall_state != NOT_STALLED) @@ -3445,7 +3445,7 @@ WRITE32_DEVICE_HANDLER( voodoo_w ) if (offset & 0x40000/4) data = FLIPENDIAN_INT32(data); cmdfifo_w(v, &v->fbi.cmdfifo[0], offset & 0xffff, data); - profiler_mark_end(); + g_profiler.stop(); return; } @@ -3458,7 +3458,7 @@ WRITE32_DEVICE_HANDLER( voodoo_w ) v->fbi.swaps_pending++; logerror("Ignoring write to %s in CMDFIFO mode\n", v->regnames[offset & 0xff]); - profiler_mark_end(); + g_profiler.stop(); return; } } @@ -3475,7 +3475,7 @@ WRITE32_DEVICE_HANDLER( voodoo_w ) /* ignore if writes aren't allowed */ if (!(access & REGISTER_WRITE)) { - profiler_mark_end(); + g_profiler.stop(); return; } @@ -3511,7 +3511,7 @@ WRITE32_DEVICE_HANDLER( voodoo_w ) timer_get_time(device->machine).seconds, (UINT32)(timer_get_time(device->machine).attoseconds >> 32), (UINT32)timer_get_time(device->machine).attoseconds, v->pci.op_end_time.seconds, (UINT32)(v->pci.op_end_time.attoseconds >> 32), (UINT32)v->pci.op_end_time.attoseconds); } - profiler_mark_end(); + g_profiler.stop(); return; } @@ -3577,7 +3577,7 @@ WRITE32_DEVICE_HANDLER( voodoo_w ) stall_cpu(v, STALLED_UNTIL_FIFO_EMPTY, timer_get_time(device->machine)); } - profiler_mark_end(); + g_profiler.stop(); } @@ -4788,7 +4788,7 @@ static INT32 triangle(voodoo_state *v) int destbuf; int pixels; - profiler_mark_start(PROFILER_USER2); + g_profiler.start(PROFILER_USER2); /* determine the number of TMUs involved */ texcount = 0; @@ -4859,7 +4859,7 @@ static INT32 triangle(voodoo_state *v) /* update stats */ v->stats.total_triangles++; - profiler_mark_end(); + g_profiler.stop(); /* 1 pixel per clock, plus some setup time */ if (LOG_REGISTERS) logerror("cycles = %d\n", TRIANGLE_SETUP_CLOCKS + pixels); diff --git a/src/mame/drivers/ddenlovr.c b/src/mame/drivers/ddenlovr.c index 20809f54958..f3bbf51052e 100644 --- a/src/mame/drivers/ddenlovr.c +++ b/src/mame/drivers/ddenlovr.c @@ -698,7 +698,7 @@ static void blitter_w( address_space *space, int blitter, offs_t offset, UINT8 d dynax_state *state = space->machine->driver_data(); int hi_bits; -profiler_mark_start(PROFILER_VIDEO); +g_profiler.start(PROFILER_VIDEO); switch (offset) { @@ -849,7 +849,7 @@ profiler_mark_start(PROFILER_VIDEO); } } -profiler_mark_end(); +g_profiler.stop(); } @@ -861,7 +861,7 @@ static void blitter_w_funkyfig( running_machine *machine, int blitter, offs_t of dynax_state *state = machine->driver_data(); int hi_bits; -profiler_mark_start(PROFILER_VIDEO); +g_profiler.start(PROFILER_VIDEO); switch(offset) { @@ -1007,7 +1007,7 @@ profiler_mark_start(PROFILER_VIDEO); } } -profiler_mark_end(); +g_profiler.stop(); } @@ -1025,7 +1025,7 @@ static WRITE8_HANDLER( hanakanz_blitter_data_w ) dynax_state *state = space->machine->driver_data(); int hi_bits; -profiler_mark_start(PROFILER_VIDEO); +g_profiler.start(PROFILER_VIDEO); hi_bits = (state->ddenlovr_blit_latch & 0x03) << 8; @@ -1207,7 +1207,7 @@ profiler_mark_start(PROFILER_VIDEO); break; } -profiler_mark_end(); +g_profiler.stop(); } diff --git a/src/mame/machine/irobot.c b/src/mame/machine/irobot.c index 08451978b80..84a47aba9f4 100644 --- a/src/mame/machine/irobot.c +++ b/src/mame/machine/irobot.c @@ -588,7 +588,7 @@ static void irmb_run(running_machine *machine) UINT32 SP = 0; UINT32 icount = 0; - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); while ((prevop->flags & (FL_DPSEL | FL_carry)) != (FL_DPSEL | FL_carry)) { @@ -841,7 +841,7 @@ default: case 0x3f: IXOR(irmb_din(curop), 0); break; irmb_latch = Y; } } - profiler_mark_end(); + g_profiler.stop(); logerror("%d instructions for Mathbox \n", icount); diff --git a/src/mame/machine/n64.c b/src/mame/machine/n64.c index be37b7911b7..a748f1e0f8d 100644 --- a/src/mame/machine/n64.c +++ b/src/mame/machine/n64.c @@ -764,9 +764,9 @@ WRITE32_DEVICE_HANDLER( n64_dp_reg_w ) case 0x04/4: // DP_END_REG state->m_rdp.SetEndReg(data); - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); state->m_rdp.ProcessList(); - profiler_mark_end(); + g_profiler.stop(); break; case 0x0c/4: // DP_STATUS_REG diff --git a/src/mame/video/artmagic.c b/src/mame/video/artmagic.c index f4853ae9259..2ffd4c0e0e9 100644 --- a/src/mame/video/artmagic.c +++ b/src/mame/video/artmagic.c @@ -200,7 +200,7 @@ static void execute_blit(running_machine *machine) } #endif - profiler_mark_start(PROFILER_VIDEO); + g_profiler.start(PROFILER_VIDEO); last = 0; sy = y; @@ -305,7 +305,7 @@ static void execute_blit(running_machine *machine) offset += w/4; } - profiler_mark_end(); + g_profiler.stop(); #if (!INSTANT_BLIT) blitter_busy_until = attotime_add(timer_get_time(machine), ATTOTIME_IN_NSEC(w*h*20)); diff --git a/src/mame/video/buggychl.c b/src/mame/video/buggychl.c index 13c163e5b86..12f3b5c6bfc 100644 --- a/src/mame/video/buggychl.c +++ b/src/mame/video/buggychl.c @@ -170,7 +170,7 @@ static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rect int offs; const UINT8 *gfx; - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); gfx = memory_region(machine, "gfx2"); for (offs = 0; offs < state->spriteram_size; offs += 4) @@ -232,7 +232,7 @@ static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rect } } - profiler_mark_end(); + g_profiler.stop(); } diff --git a/src/mame/video/dc.c b/src/mame/video/dc.c index 281296e1eeb..103c2d8a891 100644 --- a/src/mame/video/dc.c +++ b/src/mame/video/dc.c @@ -1075,7 +1075,7 @@ WRITE64_HANDLER( pvr_ta_w ) } break; case STARTRENDER: - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); #if DEBUG_PVRTA mame_printf_verbose("Start Render Received:\n"); mame_printf_verbose(" Region Array at %08x\n",pvrta_regs[REGION_BASE]); @@ -1237,7 +1237,7 @@ WRITE64_HANDLER( pvr_ta_w ) state_ta.grab[state_ta.grabsel].verts_size=0; state_ta.grab[state_ta.grabsel].strips_size=0; - profiler_mark_end(); + g_profiler.stop(); } break; //#define TA_YUV_TEX_BASE ((0x005f8148-0x005f8000)/4) diff --git a/src/mame/video/hng64.c b/src/mame/video/hng64.c index c4bd03a75e1..ccd8ef338ca 100644 --- a/src/mame/video/hng64.c +++ b/src/mame/video/hng64.c @@ -1004,7 +1004,7 @@ static void hng64_tilemap_draw_roz_primask(running_machine* machine, bitmap_t *d //if (!tmap->enable) // return; -profiler_mark_start(PROFILER_TILEMAP_DRAW_ROZ); +g_profiler.start(PROFILER_TILEMAP_DRAW_ROZ); /* configure the blit parameters */ hng64_configure_blit_parameters(&blit, tmap, dest, cliprect, flags, priority, priority_mask, drawformat); @@ -1013,7 +1013,7 @@ profiler_mark_start(PROFILER_TILEMAP_DRAW_ROZ); /* then do the roz copy */ hng64_tilemap_draw_roz_core(machine, tmap, &blit, startx, starty, incxx, incxy, incyx, incyy, wraparound); -profiler_mark_end(); +g_profiler.stop(); } diff --git a/src/mame/video/itech32.c b/src/mame/video/itech32.c index cad4bf07124..19c2e47fe4d 100644 --- a/src/mame/video/itech32.c +++ b/src/mame/video/itech32.c @@ -1202,7 +1202,7 @@ static void handle_video_command(running_machine *machine) { /* command 1: blit raw data */ case 1: - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); if (BLIT_LOGGING) logblit(machine, "Blit Raw"); if (is_drivedge) @@ -1215,18 +1215,18 @@ static void handle_video_command(running_machine *machine) if (enable_latch[1]) draw_raw(videoplane[1], color_latch[1]); } - profiler_mark_end(); + g_profiler.stop(); break; /* command 2: blit RLE-compressed data */ case 2: - profiler_mark_start(PROFILER_USER2); + g_profiler.start(PROFILER_USER2); if (BLIT_LOGGING) logblit(machine, "Blit RLE"); if (enable_latch[0]) draw_rle(videoplane[0], color_latch[0]); if (enable_latch[1]) draw_rle(videoplane[1], color_latch[1]); - profiler_mark_end(); + g_profiler.stop(); break; /* command 3: set up raw data transfer */ @@ -1248,7 +1248,7 @@ static void handle_video_command(running_machine *machine) /* command 6: perform shift register copy */ case 6: - profiler_mark_start(PROFILER_USER3); + g_profiler.start(PROFILER_USER3); if (BLIT_LOGGING) logblit(machine, "ShiftReg"); if (is_drivedge) @@ -1261,7 +1261,7 @@ static void handle_video_command(running_machine *machine) if (enable_latch[1]) shiftreg_clear(videoplane[1], NULL); } - profiler_mark_end(); + g_profiler.stop(); break; default: diff --git a/src/mame/video/jaguar.c b/src/mame/video/jaguar.c index 21b5b33e9eb..e9e01012524 100644 --- a/src/mame/video/jaguar.c +++ b/src/mame/video/jaguar.c @@ -511,7 +511,7 @@ static void blitter_run(running_machine *machine) UINT32 a1flags = blitter_regs[A1_FLAGS] & STATIC_FLAGS_MASK; UINT32 a2flags = blitter_regs[A2_FLAGS] & STATIC_FLAGS_MASK; - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); if (a1flags == a2flags) { @@ -600,7 +600,7 @@ if (++reps % 100 == 99) } generic_blitter(machine, blitter_regs[B_CMD], blitter_regs[A1_FLAGS], blitter_regs[A2_FLAGS]); - profiler_mark_end(); + g_profiler.stop(); } static TIMER_CALLBACK( blitter_done ) diff --git a/src/mame/video/mcatadv.c b/src/mame/video/mcatadv.c index 9bda2973318..b5f83e8fbb9 100644 --- a/src/mame/video/mcatadv.c +++ b/src/mame/video/mcatadv.c @@ -241,12 +241,12 @@ VIDEO_UPDATE( mcatadv ) mcatadv_draw_tilemap_part(state->scroll2, state->videoram2, i, state->tilemap2, bitmap, cliprect); } - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); #ifdef MAME_DEBUG if (!input_code_pressed(screen->machine, KEYCODE_E)) #endif draw_sprites (screen->machine, bitmap, cliprect); - profiler_mark_end(); + g_profiler.stop(); return 0; } diff --git a/src/mame/video/midtunit.c b/src/mame/video/midtunit.c index 9634132d083..dee10d13b6c 100644 --- a/src/mame/video/midtunit.c +++ b/src/mame/video/midtunit.c @@ -687,7 +687,7 @@ WRITE16_HANDLER( midtunit_dma_w ) if (!(command & 0x8000)) return; - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); /* determine bpp */ bpp = (command >> 12) & 7; @@ -795,7 +795,7 @@ if (LOG_DMA) skipdma: timer_set(space->machine, ATTOTIME_IN_NSEC(41 * pixels), NULL, 0, dma_callback); - profiler_mark_end(); + g_profiler.stop(); } diff --git a/src/mame/video/midyunit.c b/src/mame/video/midyunit.c index a321d8b5297..10464fe2951 100644 --- a/src/mame/video/midyunit.c +++ b/src/mame/video/midyunit.c @@ -469,7 +469,7 @@ if (LOG_DMA) } } - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); /* fill in the basic data */ dma_state.rowbytes = (INT16)dma_register[DMA_ROWBYTES]; @@ -541,7 +541,7 @@ if (LOG_DMA) /* signal we're done */ timer_set(space->machine, ATTOTIME_IN_NSEC(41 * dma_state.width * dma_state.height), NULL, 0, dma_callback); - profiler_mark_end(); + g_profiler.stop(); } diff --git a/src/mame/video/ppu2c0x.c b/src/mame/video/ppu2c0x.c index 72fe84f0f6e..fc4c54f8cbc 100644 --- a/src/mame/video/ppu2c0x.c +++ b/src/mame/video/ppu2c0x.c @@ -717,7 +717,7 @@ static void render_scanline( running_device *device ) int *ppu_regs = &ppu2c0x->regs[0]; /* lets see how long it takes */ - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); /* clear the line priority for this scanline */ memset(line_priority, 0, VISIBLE_SCREEN_WIDTH); @@ -751,7 +751,7 @@ static void render_scanline( running_device *device ) draw_sprites(device, line_priority); /* done updating, whew */ - profiler_mark_end(); + g_profiler.stop(); } static void update_scanline( running_device *device ) diff --git a/src/mame/video/psikyosh.c b/src/mame/video/psikyosh.c index 4f86599b6d3..7ba007f8113 100644 --- a/src/mame/video/psikyosh.c +++ b/src/mame/video/psikyosh.c @@ -438,14 +438,14 @@ static void draw_bglayerscroll( running_machine *machine, int layer, bitmap_t *b cache_bitmap(tilemap_scanline, state, gfx, size, tilebank, alpha, last_bank); /* zoomy and 'wibbly' effects - extract an entire row from tilemap */ - profiler_mark_start(PROFILER_USER2); + g_profiler.start(PROFILER_USER2); UINT32 tilemap_line[32 * 16]; UINT32 scr_line[64 * 8]; extract_scanline32(state->bg_bitmap, 0, tilemap_scanline, width, tilemap_line); - profiler_mark_end(); + g_profiler.stop(); /* slow bit, needs optimising. apply scrollx and zoomx by assembling scanline from row */ - profiler_mark_start(PROFILER_USER3); + g_profiler.start(PROFILER_USER3); if(zoom) { int step = state->bg_zoom[zoom]; int jj = 0x400 << 10; // ensure +ve for mod @@ -459,10 +459,10 @@ static void draw_bglayerscroll( running_machine *machine, int layer, bitmap_t *b scr_line[ii] = tilemap_line[(ii - scrollx + 0x400) % width]; } } - profiler_mark_end(); + g_profiler.stop(); /* blend line into output */ - profiler_mark_start(PROFILER_USER4); + g_profiler.start(PROFILER_USER4); if(alpha == 0xff) { draw_scanline32_transpen(bitmap, 0, scanline, scr_width, scr_line); } @@ -472,7 +472,7 @@ static void draw_bglayerscroll( running_machine *machine, int layer, bitmap_t *b else if (alpha < 0) { draw_scanline32_argb(bitmap, 0, scanline, scr_width, scr_line); } - profiler_mark_end(); + g_profiler.stop(); } } @@ -542,7 +542,7 @@ static void psikyosh_drawgfxzoom( running_machine *machine, if (!zoomx || !zoomy) return; - profiler_mark_start(PROFILER_DRAWGFX); + g_profiler.start(PROFILER_DRAWGFX); assert(dest_bmp->bpp == 32); @@ -1065,7 +1065,7 @@ static void psikyosh_drawgfxzoom( running_machine *machine, } } } - profiler_mark_end(); + g_profiler.stop(); } @@ -1203,7 +1203,7 @@ static void psikyosh_prelineblend( running_machine *machine, bitmap_t *bitmap, c assert(bitmap->bpp == 32); - profiler_mark_start(PROFILER_USER8); + g_profiler.start(PROFILER_USER8); for (y = cliprect->min_y; y <= cliprect->max_y; y += 1) { dstline = BITMAP_ADDR32(bitmap, y, 0); @@ -1212,7 +1212,7 @@ static void psikyosh_prelineblend( running_machine *machine, bitmap_t *bitmap, c for (x = cliprect->min_x; x <= cliprect->max_x; x += 1) dstline[x] = linefill[y] >> 8; } - profiler_mark_end(); + g_profiler.stop(); } @@ -1231,7 +1231,7 @@ static void psikyosh_postlineblend( running_machine *machine, bitmap_t *bitmap, return; } - profiler_mark_start(PROFILER_USER8); + g_profiler.start(PROFILER_USER8); for (y = cliprect->min_y; y <= cliprect->max_y; y += 1) { dstline = BITMAP_ADDR32(bitmap, y, 0); @@ -1247,7 +1247,7 @@ static void psikyosh_postlineblend( running_machine *machine, bitmap_t *bitmap, dstline[x] = alpha_blend_r32(dstline[x], lineblend[y] >> 8, 2 * (lineblend[y] & 0x7f)); } } - profiler_mark_end(); + g_profiler.stop(); } diff --git a/src/mame/video/segas32.c b/src/mame/video/segas32.c index 6d02dc19952..2d4f61f8328 100644 --- a/src/mame/video/segas32.c +++ b/src/mame/video/segas32.c @@ -1900,7 +1900,7 @@ static void sprite_render_list(running_machine *machine) int spritenum = 0; UINT16 *sprite; - profiler_mark_start(PROFILER_USER2); + g_profiler.start(PROFILER_USER2); logerror("----\n"); @@ -1971,7 +1971,7 @@ static void sprite_render_list(running_machine *machine) } } - profiler_mark_end(); + g_profiler.stop(); } @@ -2460,9 +2460,9 @@ VIDEO_UPDATE( system32 ) } /* update the tilemaps */ - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); enablemask = update_tilemaps(*screen, cliprect); - profiler_mark_end(); + g_profiler.stop(); /* debugging */ #if QWERTY_LAYER_ENABLE @@ -2475,9 +2475,9 @@ VIDEO_UPDATE( system32 ) #endif /* do the mixing */ - profiler_mark_start(PROFILER_USER3); + g_profiler.start(PROFILER_USER3); mix_all_layers(0, 0, bitmap, cliprect, enablemask); - profiler_mark_end(); + g_profiler.stop(); if (LOG_SPRITES && input_code_pressed(screen->machine, KEYCODE_L)) { @@ -2640,9 +2640,9 @@ VIDEO_UPDATE( multi32 ) } /* update the tilemaps */ - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); enablemask = update_tilemaps(*screen, cliprect); - profiler_mark_end(); + g_profiler.stop(); /* debugging */ #if QWERTY_LAYER_ENABLE @@ -2655,9 +2655,9 @@ VIDEO_UPDATE( multi32 ) #endif /* do the mixing */ - profiler_mark_start(PROFILER_USER3); + g_profiler.start(PROFILER_USER3); mix_all_layers(((screen == left_screen) ? 0 : 1), 0, bitmap, cliprect, enablemask); - profiler_mark_end(); + g_profiler.stop(); if (PRINTF_MIXER_DATA) { diff --git a/src/mame/video/shangha3.c b/src/mame/video/shangha3.c index 72d5dfc8c03..2c1859dbddf 100644 --- a/src/mame/video/shangha3.c +++ b/src/mame/video/shangha3.c @@ -116,7 +116,7 @@ WRITE16_HANDLER( shangha3_blitter_go_w ) int offs; - profiler_mark_start(PROFILER_VIDEO); + g_profiler.start(PROFILER_VIDEO); for (offs = gfxlist_addr << 3;offs < shangha3_ram_size/2;offs += 16) { @@ -259,7 +259,7 @@ else } } - profiler_mark_end(); + g_profiler.stop(); } diff --git a/src/mame/video/snes.c b/src/mame/video/snes.c index 88a29742888..8bc578882d0 100644 --- a/src/mame/video/snes.c +++ b/src/mame/video/snes.c @@ -1508,7 +1508,7 @@ static void snes_refresh_scanline( running_machine *machine, bitmap_t *bitmap, U UINT16 prev_colour = 0; int blurring = input_port_read_safe(machine, "OPTIONS", 0) & 0x01; - profiler_mark_start(PROFILER_VIDEO); + g_profiler.start(PROFILER_VIDEO); if (snes_ppu.screen_disabled) /* screen is forced blank */ for (x = 0; x < SNES_SCR_WIDTH * 2; x++) @@ -1556,7 +1556,7 @@ static void snes_refresh_scanline( running_machine *machine, bitmap_t *bitmap, U #ifdef SNES_LAYER_DEBUG if (snes_dbg_video(machine, curline)) { - profiler_mark_end(); + g_profiler.stop(); return; } @@ -1654,7 +1654,7 @@ static void snes_refresh_scanline( running_machine *machine, bitmap_t *bitmap, U } } - profiler_mark_end(); + g_profiler.stop(); } VIDEO_START( snes ) diff --git a/src/mame/video/stvvdp2.c b/src/mame/video/stvvdp2.c index b56f253af36..9a47e8cae31 100644 --- a/src/mame/video/stvvdp2.c +++ b/src/mame/video/stvvdp2.c @@ -4912,7 +4912,7 @@ static void stv_vdp2_draw_rotation_screen(running_machine *machine, bitmap_t *bi stv2_current_tilemap.window_control = 0; fade_control = stv2_current_tilemap.fade_control; stv2_current_tilemap.fade_control = 0; - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); if ( LOG_VDP2 ) logerror( "Checking for cached RBG bitmap, cache_dirty = %d, memcmp() = %d\n", stv_rbg_cache_data.is_cache_dirty, memcmp(&stv_rbg_cache_data.layer_data[iRP-1],&stv2_current_tilemap,sizeof(stv2_current_tilemap))); if ( (stv_rbg_cache_data.is_cache_dirty & iRP) || memcmp(&stv_rbg_cache_data.layer_data[iRP-1],&stv2_current_tilemap,sizeof(stv2_current_tilemap)) != 0 ) @@ -4931,7 +4931,7 @@ static void stv_vdp2_draw_rotation_screen(running_machine *machine, bitmap_t *bi stv_rbg_cache_data.map_offset_max[iRP-1], stv_rbg_cache_data.tile_offset_min[iRP-1], stv_rbg_cache_data.tile_offset_max[iRP-1] ); } - profiler_mark_end(); + g_profiler.stop(); stv2_current_tilemap.colour_calculation_enabled = colour_calculation_enabled; if ( colour_calculation_enabled ) @@ -4952,9 +4952,9 @@ static void stv_vdp2_draw_rotation_screen(running_machine *machine, bitmap_t *bi stv2_current_tilemap.fade_control = fade_control; - profiler_mark_start(PROFILER_USER2); + g_profiler.start(PROFILER_USER2); stv_vdp2_copy_roz_bitmap(bitmap, stv_vdp2_roz_bitmap[iRP-1], &mycliprect, iRP, planesizex, planesizey, planerenderedsizex, planerenderedsizey ); - profiler_mark_end(); + g_profiler.stop(); } } diff --git a/src/mame/video/taito_b.c b/src/mame/video/taito_b.c index cdff33f9867..8b1e79fc54e 100644 --- a/src/mame/video/taito_b.c +++ b/src/mame/video/taito_b.c @@ -258,7 +258,7 @@ static void draw_framebuffer( running_machine *machine, bitmap_t *bitmap, const UINT8 video_control = tc0180vcu_get_videoctrl(state->tc0180vcu, 0); UINT8 framebuffer_page = tc0180vcu_get_fb_page(state->tc0180vcu, 0); -profiler_mark_start(PROFILER_USER1); +g_profiler.start(PROFILER_USER1); priority <<= 4; @@ -266,7 +266,7 @@ profiler_mark_start(PROFILER_USER1); { if (priority) { - profiler_mark_end(); + g_profiler.stop(); return; } @@ -352,7 +352,7 @@ profiler_mark_start(PROFILER_USER1); } } } -profiler_mark_end(); +g_profiler.stop(); } VIDEO_UPDATE( taitob ) diff --git a/src/mame/video/vertigo.c b/src/mame/video/vertigo.c index 3da03b362d3..4912130919e 100644 --- a/src/mame/video/vertigo.c +++ b/src/mame/video/vertigo.c @@ -482,7 +482,7 @@ void vertigo_vproc(int cycles, int irq4) if (irq4) vector_clear_list(); - profiler_mark_start(PROFILER_USER1); + g_profiler.start(PROFILER_USER1); while (cycles--) { @@ -658,5 +658,5 @@ void vertigo_vproc(int cycles, int irq4) } } - profiler_mark_end(); + g_profiler.stop(); }