mirror of
https://github.com/holub/mame
synced 2025-04-25 01:40:16 +03:00
Internal debugger using the mame rendering infrastructure
- added support for arbitrary number of containers for render_target - added command-line parameter -debug_internal (-di) to use the internal debugger when in debug mode - internal debugger supports all views except memory view - added "Debug" view to layout/vertical.lay to create more place for debug views in vertical games. The colors are ugly. Font rendering needs improvement. There are no shortcut keys right now. There is still a lot of room for more improvements. However, it works and does not depend on any ui toolkit. The interface has been designed to support displaying views programmatically e.g. from the ui. Currently, the ui render target is used. In order to support views being displayed in separate windows further changes are needed: - the osd layer must support creating and closing windows (render targets) on demand. - There must be a mode for render targets where their bounds follows the window size - Currently the render target size depends on the aspect of currently selected "artwork" view. - Render target needs a name property. Short HowTo: - Start MAME with "-debug -di" - Console, register and disasm views will be shown. Place them by dragging the view on the title bar. - Views can be resized by dragging the bottom-right yellow square. - The view having the focus has a green background title bar. - Hit "Tab" (IPT_UI_CONFIGURE) to show the menu. - Console and disasm views support a very simple facility to support entering commands and addresses. Just start typing. Hit "enter" when finished.
This commit is contained in:
parent
f09bcbeec3
commit
0898987bc3
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -556,6 +556,8 @@ src/emu/debug/textbuf.c svneol=native#text/plain
|
||||
src/emu/debug/textbuf.h svneol=native#text/plain
|
||||
src/emu/debugger.c svneol=native#text/plain
|
||||
src/emu/debugger.h svneol=native#text/plain
|
||||
src/emu/debugint/debugint.c svneol=native#text/plain
|
||||
src/emu/debugint/debugint.h svneol=native#text/plain
|
||||
src/emu/deprecat.h svneol=native#text/plain
|
||||
src/emu/devcb.c svneol=native#text/plain
|
||||
src/emu/devcb.h svneol=native#text/plain
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "express.h"
|
||||
#include "debugvw.h"
|
||||
#include "debugger.h"
|
||||
#include "debugint/debugint.h"
|
||||
#include "uiinput.h"
|
||||
#include <ctype.h>
|
||||
|
||||
@ -674,7 +675,10 @@ void debug_cpu_instruction_hook(running_device *device, offs_t curpc)
|
||||
|
||||
/* clear the memory modified flag and wait */
|
||||
global->memory_modified = FALSE;
|
||||
osd_wait_for_debugger(device, firststop);
|
||||
if (device->machine->debug_flags & DEBUG_FLAG_OSD_ENABLED)
|
||||
osd_wait_for_debugger(device, firststop);
|
||||
else if (device->machine->debug_flags & DEBUG_FLAG_ENABLED)
|
||||
debugint_wait_for_debugger(device, firststop);
|
||||
firststop = FALSE;
|
||||
|
||||
/* if something modified memory, update the screen */
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "debug/debugcon.h"
|
||||
#include "debug/express.h"
|
||||
#include "debug/debugvw.h"
|
||||
#include "debugint/debugint.h"
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
@ -73,6 +74,9 @@ void debugger_init(running_machine *machine)
|
||||
debug_view_init(machine);
|
||||
debug_comment_init(machine);
|
||||
|
||||
/* always initialize the internal render debugger */
|
||||
debugint_init(machine);
|
||||
|
||||
/* allocate a new entry for our global list */
|
||||
add_exit_callback(machine, debugger_exit);
|
||||
entry = global_alloc(machine_entry);
|
||||
|
1497
src/emu/debugint/debugint.c
Normal file
1497
src/emu/debugint/debugint.c
Normal file
File diff suppressed because it is too large
Load Diff
47
src/emu/debugint/debugint.h
Normal file
47
src/emu/debugint/debugint.h
Normal file
@ -0,0 +1,47 @@
|
||||
/*********************************************************************
|
||||
|
||||
debugint.c
|
||||
|
||||
Internal debugger frontend using render interface.
|
||||
|
||||
Copyright Nicola Salmoria and the MAME Team.
|
||||
Visit http://mamedev.org for licensing and usage restrictions.
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef __DEBUGINT_H__
|
||||
#define __DEBUGINT_H__
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
CONSTANTS
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
GLOBAL VARIABLES
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
FUNCTION PROTOTYPES
|
||||
***************************************************************************/
|
||||
|
||||
/* initialize the internal debugger */
|
||||
void debugint_init(running_machine *machine);
|
||||
|
||||
/* process events for internal debugger */
|
||||
void debugint_wait_for_debugger(running_device *device, int firststop);
|
||||
|
||||
/* update the internal debugger during a game */
|
||||
void debugint_update_during_game(running_machine *machine);
|
||||
|
||||
#endif
|
@ -23,6 +23,7 @@ OBJDIRS += \
|
||||
$(EMUOBJ)/cpu \
|
||||
$(EMUOBJ)/sound \
|
||||
$(EMUOBJ)/debug \
|
||||
$(EMUOBJ)/debugint \
|
||||
$(EMUOBJ)/audio \
|
||||
$(EMUOBJ)/drivers \
|
||||
$(EMUOBJ)/machine \
|
||||
@ -86,7 +87,8 @@ EMUOBJS = \
|
||||
$(EMUOBJ)/debug/debughlp.o \
|
||||
$(EMUOBJ)/debug/debugvw.o \
|
||||
$(EMUOBJ)/debug/express.o \
|
||||
$(EMUOBJ)/debug/textbuf.o
|
||||
$(EMUOBJ)/debug/textbuf.o \
|
||||
$(EMUOBJ)/debugint/debugint.o
|
||||
|
||||
ifdef PROFILER
|
||||
EMUOBJS += \
|
||||
|
@ -148,6 +148,7 @@ const options_entry mame_core_options[] =
|
||||
{ "update_in_pause", "0", OPTION_BOOLEAN, "keep calling video updates while in pause" },
|
||||
{ "debug;d", "0", OPTION_BOOLEAN, "enable/disable debugger" },
|
||||
{ "debugscript", NULL, 0, "script for debugger" },
|
||||
{ "debug_internal;di", "0", OPTION_BOOLEAN, "use the internal debugger for debugging" },
|
||||
|
||||
/* misc options */
|
||||
{ NULL, NULL, OPTION_HEADER, "CORE MISC OPTIONS" },
|
||||
|
@ -143,6 +143,7 @@
|
||||
#define OPTION_VERBOSE "verbose"
|
||||
#define OPTION_LOG "log"
|
||||
#define OPTION_DEBUG "debug"
|
||||
#define OPTION_DEBUG_INTERNAL "debug_internal"
|
||||
#define OPTION_DEBUGSCRIPT "debugscript"
|
||||
#define OPTION_UPDATEINPAUSE "update_in_pause"
|
||||
|
||||
|
@ -21,4 +21,17 @@
|
||||
<bounds x="0" y="0" width="3" height="4" />
|
||||
</screen>
|
||||
</view>
|
||||
|
||||
<element name="dbgdis">
|
||||
</element>
|
||||
|
||||
<view name="Debug">
|
||||
<screen index="0">
|
||||
<bounds left="0" top="0" right="3" bottom="4" />
|
||||
</screen>
|
||||
<bezel element="dbgdis">
|
||||
<bounds x="-2.5" y="0" width="8" height="6" />
|
||||
</bezel>
|
||||
</view>
|
||||
|
||||
</mamelayout>
|
||||
|
@ -1317,7 +1317,10 @@ running_machine::running_machine(const game_driver *driver)
|
||||
|
||||
/* fetch core options */
|
||||
sample_rate = options_get_int(mame_options(), OPTION_SAMPLERATE);
|
||||
debug_flags = options_get_bool(mame_options(), OPTION_DEBUG) ? (DEBUG_FLAG_ENABLED | DEBUG_FLAG_OSD_ENABLED | DEBUG_FLAG_CALL_HOOK) : 0;
|
||||
if (options_get_bool(mame_options(), OPTION_DEBUG))
|
||||
debug_flags = (DEBUG_FLAG_ENABLED | DEBUG_FLAG_CALL_HOOK) | (options_get_bool(mame_options(), OPTION_DEBUG_INTERNAL) ? 0 : DEBUG_FLAG_OSD_ENABLED);
|
||||
else
|
||||
debug_flags = 0;
|
||||
}
|
||||
catch (std::bad_alloc &)
|
||||
{
|
||||
|
156
src/emu/render.c
156
src/emu/render.c
@ -61,6 +61,15 @@
|
||||
|
||||
#define INTERNAL_FLAG_CHAR 0x00000001
|
||||
|
||||
enum
|
||||
{
|
||||
COMPONENT_TYPE_IMAGE = 0,
|
||||
COMPONENT_TYPE_RECT,
|
||||
COMPONENT_TYPE_DISK,
|
||||
COMPONENT_TYPE_MAX
|
||||
};
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
CONTAINER_ITEM_LINE = 0,
|
||||
@ -105,6 +114,7 @@ struct _object_transform
|
||||
float xscale, yscale; /* scale transforms */
|
||||
render_color color; /* color transform */
|
||||
int orientation; /* orientation transform */
|
||||
int no_center; /* center the container? */
|
||||
};
|
||||
|
||||
|
||||
@ -157,6 +167,7 @@ public:
|
||||
int base_layerconfig; /* the layer configuration at the time of first frame */
|
||||
int maxtexwidth; /* maximum width of a texture */
|
||||
int maxtexheight; /* maximum height of a texture */
|
||||
render_container * debug_containers;
|
||||
};
|
||||
|
||||
|
||||
@ -271,7 +282,6 @@ static container_item *render_container_item_add_generic(render_container *conta
|
||||
static void render_container_overlay_scale(bitmap_t *dest, const bitmap_t *source, const rectangle *sbounds, void *param);
|
||||
static void render_container_recompute_lookups(render_container *container);
|
||||
static void render_container_update_palette(render_container *container);
|
||||
static void render_target_free_component_containers(const render_target *target);
|
||||
|
||||
|
||||
|
||||
@ -1145,10 +1155,6 @@ void render_target_free(render_target *target)
|
||||
for (curr = &targetlist; *curr != target; curr = &(*curr)->next) ;
|
||||
*curr = target->next;
|
||||
|
||||
/* free any containers */
|
||||
|
||||
render_target_free_component_containers(target);
|
||||
|
||||
/* free any primitives */
|
||||
for (listnum = 0; listnum < ARRAY_LENGTH(target->primlist); listnum++)
|
||||
{
|
||||
@ -1636,6 +1642,22 @@ const render_primitive_list *render_target_get_primitives(render_target *target)
|
||||
}
|
||||
}
|
||||
|
||||
/* process the debug containers */
|
||||
for (render_container *debug = target->debug_containers; debug != NULL; debug = debug->next)
|
||||
{
|
||||
ui_xform.xoffs = 0;
|
||||
ui_xform.yoffs = 0;
|
||||
ui_xform.xscale = (float) target->width;
|
||||
ui_xform.yscale = (float) target->height;
|
||||
ui_xform.color.r = ui_xform.color.g = ui_xform.color.b = ui_xform.color.a = 1.0f;
|
||||
ui_xform.color.a = 0.9;
|
||||
ui_xform.orientation = target->orientation;
|
||||
ui_xform.no_center = TRUE;
|
||||
|
||||
/* add UI elements */
|
||||
add_container_primitives(target, &target->primlist[listnum], &ui_xform, debug, BLENDMODE_ALPHA);
|
||||
}
|
||||
|
||||
/* process the UI if we are the UI target */
|
||||
if (target == render_get_ui_target())
|
||||
{
|
||||
@ -1905,8 +1927,16 @@ static void add_container_primitives(render_target *target, render_primitive_lis
|
||||
if (container_xform.orientation & ORIENTATION_FLIP_Y) yoffs = -yoffs;
|
||||
container_xform.xscale = xform->xscale * xscale;
|
||||
container_xform.yscale = xform->yscale * yscale;
|
||||
container_xform.xoffs = xform->xscale * (0.5f - 0.5f * xscale + xoffs) + xform->xoffs;
|
||||
container_xform.yoffs = xform->yscale * (0.5f - 0.5f * yscale + yoffs) + xform->yoffs;
|
||||
if (xform->no_center)
|
||||
{
|
||||
container_xform.xoffs = xform->xscale * (xoffs) + xform->xoffs;
|
||||
container_xform.yoffs = xform->yscale * (yoffs) + xform->yoffs;
|
||||
}
|
||||
else
|
||||
{
|
||||
container_xform.xoffs = xform->xscale * (0.5f - 0.5f * xscale + xoffs) + xform->xoffs;
|
||||
container_xform.yoffs = xform->yscale * (0.5f - 0.5f * yscale + yoffs) + xform->yoffs;
|
||||
}
|
||||
container_xform.color = xform->color;
|
||||
}
|
||||
|
||||
@ -2111,19 +2141,6 @@ static void add_element_primitives(render_target *target, render_primitive_list
|
||||
else
|
||||
free_render_primitive(prim);
|
||||
}
|
||||
/* Look for container components */
|
||||
for (element_component *component = element->complist; element != NULL; element = element->next )
|
||||
{
|
||||
if (component->type == COMPONENT_TYPE_CONTAINER)
|
||||
{
|
||||
if (component->container != NULL)
|
||||
add_container_primitives(target, list, xform, component->container, BLENDMODE_ALPHA);
|
||||
component->scaled_bounds.min_x = render_round_nearest(xform->xoffs);
|
||||
component->scaled_bounds.min_y = render_round_nearest(xform->yoffs);
|
||||
component->scaled_bounds.max_x = render_round_nearest(xform->xoffs + xform->xscale);
|
||||
component->scaled_bounds.max_y = render_round_nearest(xform->yoffs + xform->yscale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3162,49 +3179,66 @@ static void render_container_update_palette(render_container *container)
|
||||
}
|
||||
}
|
||||
|
||||
static void render_target_free_component_containers(const render_target *target)
|
||||
|
||||
render_container *render_debug_alloc(render_target *target)
|
||||
{
|
||||
/* for each layer, get scan all components ... */
|
||||
for (int layer = 0; layer < ITEM_LAYER_MAX; layer++)
|
||||
for (view_item *item = target->curview->itemlist[layer]; item != NULL; item = item->next)
|
||||
{
|
||||
for (layout_element *element = item->element; element != NULL; element = element->next)
|
||||
{
|
||||
for (element_component *component = element->complist; component != NULL; component = component->next)
|
||||
{
|
||||
if ((component->type == COMPONENT_TYPE_CONTAINER) && component->container != NULL)
|
||||
{
|
||||
render_container_free(component->container);
|
||||
component->container = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
render_container *container = render_container_alloc(target->machine);
|
||||
|
||||
container->next = target->debug_containers;
|
||||
target->debug_containers = container;
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
render_container *render_target_get_component_container(const render_target *target, const char *name, rectangle *scaled_bounds)
|
||||
{
|
||||
/* for each layer, get scan all components ... */
|
||||
for (int layer = 0; layer < ITEM_LAYER_MAX; layer++)
|
||||
for (view_item *item = target->curview->itemlist[layer]; item != NULL; item = item->next)
|
||||
{
|
||||
for (layout_element *element = item->element; element != NULL; element = element->next)
|
||||
{
|
||||
for (element_component *component = element->complist; component != NULL; component = component->next)
|
||||
{
|
||||
if ((component->type == COMPONENT_TYPE_CONTAINER) && (strcmp(name, component->string) == 0))
|
||||
{
|
||||
if (scaled_bounds != NULL)
|
||||
*scaled_bounds = component->scaled_bounds;
|
||||
if (component->container == NULL)
|
||||
{
|
||||
component->container = render_container_alloc(target->machine);
|
||||
}
|
||||
return component->container;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
|
||||
void render_debug_free(render_target *target, render_container *container)
|
||||
{
|
||||
if (container == target->debug_containers)
|
||||
{
|
||||
target->debug_containers = container->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
render_container *c;
|
||||
|
||||
for (c = target->debug_containers; c != NULL; c = c->next)
|
||||
if (c->next == container)
|
||||
break;
|
||||
c->next = container->next;
|
||||
}
|
||||
render_container_free(container);
|
||||
}
|
||||
|
||||
|
||||
void render_debug_top(render_target *target, render_container *container)
|
||||
{
|
||||
/* remove */
|
||||
if (container == target->debug_containers)
|
||||
{
|
||||
target->debug_containers = container->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
render_container *c;
|
||||
|
||||
for (c = target->debug_containers; c != NULL; c = c->next)
|
||||
if (c->next == container)
|
||||
break;
|
||||
c->next = container->next;
|
||||
}
|
||||
/* add to end */
|
||||
if (target->debug_containers == NULL)
|
||||
target->debug_containers = container;
|
||||
else
|
||||
{
|
||||
render_container *c;
|
||||
|
||||
for (c = target->debug_containers; c != NULL; c = c->next)
|
||||
if (c->next == NULL)
|
||||
break;
|
||||
c->next = container;
|
||||
}
|
||||
container->next = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -460,6 +460,9 @@ void render_container_add_quad(render_container *container, float x0, float y0,
|
||||
/* add a char item to the specified container */
|
||||
void render_container_add_char(render_container *container, float x0, float y0, float height, float aspect, rgb_t argb, render_font *font, UINT16 ch);
|
||||
|
||||
render_container *render_target_get_component_container(const render_target *target, const char *name, rectangle *scaled_bounds);
|
||||
/* "drawable" handling for internal debugger */
|
||||
render_container *render_debug_alloc(render_target *target);
|
||||
void render_debug_free(render_target *target, render_container *container);
|
||||
void render_debug_top(render_target *target, render_container *container);
|
||||
|
||||
#endif /* __RENDER_H__ */
|
||||
|
@ -106,11 +106,40 @@
|
||||
#define LINE_CAP_START 1
|
||||
#define LINE_CAP_END 2
|
||||
|
||||
enum
|
||||
{
|
||||
COMPONENT_TYPE_IMAGE = 0,
|
||||
COMPONENT_TYPE_RECT,
|
||||
COMPONENT_TYPE_DISK,
|
||||
COMPONENT_TYPE_TEXT,
|
||||
COMPONENT_TYPE_LED7SEG,
|
||||
COMPONENT_TYPE_LED14SEG,
|
||||
COMPONENT_TYPE_LED16SEG,
|
||||
COMPONENT_TYPE_LED14SEGSC,
|
||||
COMPONENT_TYPE_LED16SEGSC,
|
||||
COMPONENT_TYPE_MAX
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
***************************************************************************/
|
||||
|
||||
/* an element_component represents an image, rectangle, or disk in an element */
|
||||
struct _element_component
|
||||
{
|
||||
element_component * next; /* link to next component */
|
||||
int type; /* type of component */
|
||||
int state; /* state where this component is visible (-1 means all states) */
|
||||
render_bounds bounds; /* bounds of the element */
|
||||
render_color color; /* color of the element */
|
||||
const char * string; /* string for text components */
|
||||
bitmap_t * bitmap; /* source bitmap for images */
|
||||
const char * dirname; /* directory name of image file (for lazy loading) */
|
||||
const char * imagefile; /* name of the image file (for lazy loading) */
|
||||
const char * alphafile; /* name of the alpha file (for lazy loading) */
|
||||
int hasalpha; /* is there any alpha component present? */
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -363,10 +392,6 @@ static void layout_element_scale(bitmap_t *dest, const bitmap_t *source, const r
|
||||
layout_element_draw_text(dest, &bounds, &component->color, component->string);
|
||||
break;
|
||||
|
||||
case COMPONENT_TYPE_CONTAINER:
|
||||
component->scaled_bounds = bounds;
|
||||
break;
|
||||
|
||||
case COMPONENT_TYPE_LED7SEG:
|
||||
layout_element_draw_led7seg(dest, &bounds, &component->color, elemtex->state);
|
||||
break;
|
||||
@ -1662,20 +1687,6 @@ static element_component *load_element_component(const machine_config *config, x
|
||||
component->alphafile = (afile == NULL) ? NULL : copy_string(afile);
|
||||
}
|
||||
|
||||
/* container nodes */
|
||||
else if (strcmp(compnode->name, "container") == 0)
|
||||
{
|
||||
const char *name = xml_get_attribute_string_with_subst(config, compnode, "name", "");
|
||||
char *string;
|
||||
|
||||
/* allocate a copy of the string */
|
||||
component->type = COMPONENT_TYPE_CONTAINER;
|
||||
string = global_alloc_array(char, strlen(name) + 1);
|
||||
strcpy(string, name);
|
||||
component->string = string;
|
||||
component->container = NULL;
|
||||
}
|
||||
|
||||
/* text nodes */
|
||||
else if (strcmp(compnode->name, "text") == 0)
|
||||
{
|
||||
@ -2113,4 +2124,3 @@ static void layout_element_free(layout_element *element)
|
||||
global_free(element->name);
|
||||
global_free(element);
|
||||
}
|
||||
|
||||
|
@ -70,21 +70,6 @@ enum
|
||||
};
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
COMPONENT_TYPE_IMAGE = 0,
|
||||
COMPONENT_TYPE_RECT,
|
||||
COMPONENT_TYPE_DISK,
|
||||
COMPONENT_TYPE_TEXT,
|
||||
COMPONENT_TYPE_CONTAINER,
|
||||
COMPONENT_TYPE_LED7SEG,
|
||||
COMPONENT_TYPE_LED14SEG,
|
||||
COMPONENT_TYPE_LED16SEG,
|
||||
COMPONENT_TYPE_LED14SEGSC,
|
||||
COMPONENT_TYPE_LED16SEGSC,
|
||||
COMPONENT_TYPE_MAX
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
@ -98,25 +83,6 @@ typedef struct _view_item view_item;
|
||||
typedef struct _layout_view layout_view;
|
||||
typedef struct _layout_file layout_file;
|
||||
|
||||
/* an element_component represents an image, rectangle, or disk in an element */
|
||||
struct _element_component
|
||||
{
|
||||
element_component * next; /* link to next component */
|
||||
int type; /* type of component */
|
||||
int state; /* state where this component is visible (-1 means all states) */
|
||||
render_bounds bounds; /* bounds of the element */
|
||||
render_container * container; /* container for container elements */
|
||||
rectangle scaled_bounds; /* for container elements */
|
||||
render_color color; /* color of the element */
|
||||
const char * string; /* string for text components */
|
||||
/* name for container components */
|
||||
bitmap_t * bitmap; /* source bitmap for images */
|
||||
const char * dirname; /* directory name of image file (for lazy loading) */
|
||||
const char * imagefile; /* name of the image file (for lazy loading) */
|
||||
const char * alphafile; /* name of the alpha file (for lazy loading) */
|
||||
int hasalpha; /* is there any alpha component present? */
|
||||
};
|
||||
|
||||
/* an element_texture encapsulates a texture for a given element in a given state */
|
||||
struct _element_texture
|
||||
{
|
||||
@ -201,6 +167,8 @@ void layout_view_recompute(layout_view *view, int layerconfig);
|
||||
layout_file *layout_file_load(const machine_config *config, const char *dirname, const char *filename);
|
||||
void layout_file_free(layout_file *file);
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
GLOBAL VARIABLES
|
||||
***************************************************************************/
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "profiler.h"
|
||||
#include "png.h"
|
||||
#include "debugger.h"
|
||||
#include "debugint/debugint.h"
|
||||
#include "rendutil.h"
|
||||
#include "ui.h"
|
||||
#include "aviio.h"
|
||||
@ -1301,6 +1302,9 @@ void video_frame_update(running_machine *machine, int debug)
|
||||
/* draw the user interface */
|
||||
ui_update_and_render(machine, render_container_get_ui());
|
||||
|
||||
/* update the internal render debugger */
|
||||
debugint_update_during_game(machine);
|
||||
|
||||
/* if we're throttling, synchronize before rendering */
|
||||
if (!debug && !skipped_it && effective_throttle(machine))
|
||||
update_throttle(machine, current_time);
|
||||
|
Loading…
Reference in New Issue
Block a user