m64p: Added VI callback functionality
N64: Made a VI callback function which declares the frame complete every VI, instead of per frame.
This commit is contained in:
parent
2598967d56
commit
3bc682a411
|
@ -158,7 +158,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo.N64
|
||||||
M64CMD_CORE_STATE_SET,
|
M64CMD_CORE_STATE_SET,
|
||||||
M64CMD_READ_SCREEN,
|
M64CMD_READ_SCREEN,
|
||||||
M64CMD_RESET,
|
M64CMD_RESET,
|
||||||
M64CMD_ADVANCE_FRAME
|
M64CMD_ADVANCE_FRAME,
|
||||||
|
M64CMD_SET_VI_CALLBACK
|
||||||
};
|
};
|
||||||
|
|
||||||
enum m64p_emu_state
|
enum m64p_emu_state
|
||||||
|
@ -192,6 +193,9 @@ namespace BizHawk.Emulation.Consoles.Nintendo.N64
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
delegate m64p_error CoreDoCommandFrameCallback(m64p_command Command, int ParamInt, FrameCallback ParamPtr);
|
delegate m64p_error CoreDoCommandFrameCallback(m64p_command Command, int ParamInt, FrameCallback ParamPtr);
|
||||||
CoreDoCommandFrameCallback m64pCoreDoCommandFrameCallback;
|
CoreDoCommandFrameCallback m64pCoreDoCommandFrameCallback;
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
delegate m64p_error CoreDoCommandVICallback(m64p_command Command, int ParamInt, VICallback ParamPtr);
|
||||||
|
CoreDoCommandVICallback m64pCoreDoCommandVICallback;
|
||||||
|
|
||||||
// Graphics plugin specific
|
// Graphics plugin specific
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
@ -216,6 +220,13 @@ namespace BizHawk.Emulation.Consoles.Nintendo.N64
|
||||||
int width = 0;
|
int width = 0;
|
||||||
int height = 0;
|
int height = 0;
|
||||||
GFXReadScreen2(m64p_FrameBuffer, ref width, ref height, 0);
|
GFXReadScreen2(m64p_FrameBuffer, ref width, ref height, 0);
|
||||||
|
//m64pFrameComplete = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public delegate void VICallback();
|
||||||
|
VICallback m64pVICallback;
|
||||||
|
public void FrameComplete()
|
||||||
|
{
|
||||||
m64pFrameComplete = true;
|
m64pFrameComplete = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,6 +254,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.N64
|
||||||
m64pCoreDoCommandPtr = (CoreDoCommandPtr)Marshal.GetDelegateForFunctionPointer(GetProcAddress(CoreDll, "CoreDoCommand"), typeof(CoreDoCommandPtr));
|
m64pCoreDoCommandPtr = (CoreDoCommandPtr)Marshal.GetDelegateForFunctionPointer(GetProcAddress(CoreDll, "CoreDoCommand"), typeof(CoreDoCommandPtr));
|
||||||
m64pCoreDoCommandRefInt = (CoreDoCommandRefInt)Marshal.GetDelegateForFunctionPointer(GetProcAddress(CoreDll, "CoreDoCommand"), typeof(CoreDoCommandRefInt));
|
m64pCoreDoCommandRefInt = (CoreDoCommandRefInt)Marshal.GetDelegateForFunctionPointer(GetProcAddress(CoreDll, "CoreDoCommand"), typeof(CoreDoCommandRefInt));
|
||||||
m64pCoreDoCommandFrameCallback = (CoreDoCommandFrameCallback)Marshal.GetDelegateForFunctionPointer(GetProcAddress(CoreDll, "CoreDoCommand"), typeof(CoreDoCommandFrameCallback));
|
m64pCoreDoCommandFrameCallback = (CoreDoCommandFrameCallback)Marshal.GetDelegateForFunctionPointer(GetProcAddress(CoreDll, "CoreDoCommand"), typeof(CoreDoCommandFrameCallback));
|
||||||
|
m64pCoreDoCommandVICallback = (CoreDoCommandVICallback)Marshal.GetDelegateForFunctionPointer(GetProcAddress(CoreDll, "CoreDoCommand"), typeof(CoreDoCommandVICallback));
|
||||||
m64pCoreAttachPlugin = (CoreAttachPlugin)Marshal.GetDelegateForFunctionPointer(GetProcAddress(CoreDll, "CoreAttachPlugin"), typeof(CoreAttachPlugin));
|
m64pCoreAttachPlugin = (CoreAttachPlugin)Marshal.GetDelegateForFunctionPointer(GetProcAddress(CoreDll, "CoreAttachPlugin"), typeof(CoreAttachPlugin));
|
||||||
|
|
||||||
GfxPluginStartup = (PluginStartup)Marshal.GetDelegateForFunctionPointer(GetProcAddress(GfxDll, "PluginStartup"), typeof(PluginStartup));
|
GfxPluginStartup = (PluginStartup)Marshal.GetDelegateForFunctionPointer(GetProcAddress(GfxDll, "PluginStartup"), typeof(PluginStartup));
|
||||||
|
@ -272,6 +284,10 @@ namespace BizHawk.Emulation.Consoles.Nintendo.N64
|
||||||
m64pFrameCallback = new FrameCallback(Getm64pFrameBuffer);
|
m64pFrameCallback = new FrameCallback(Getm64pFrameBuffer);
|
||||||
result = m64pCoreDoCommandFrameCallback(m64p_command.M64CMD_SET_FRAME_CALLBACK, 0, m64pFrameCallback);
|
result = m64pCoreDoCommandFrameCallback(m64p_command.M64CMD_SET_FRAME_CALLBACK, 0, m64pFrameCallback);
|
||||||
|
|
||||||
|
// Set up the vi callback function
|
||||||
|
m64pVICallback = new VICallback(FrameComplete);
|
||||||
|
result = m64pCoreDoCommandVICallback(m64p_command.M64CMD_SET_VI_CALLBACK, 0, m64pVICallback);
|
||||||
|
|
||||||
m64pEmulator = new Thread(ExecuteEmulator);
|
m64pEmulator = new Thread(ExecuteEmulator);
|
||||||
m64pEmulator.Start();
|
m64pEmulator.Start();
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -266,6 +266,9 @@ EXPORT m64p_error CALL CoreDoCommand(m64p_command Command, int ParamInt, void *P
|
||||||
return M64ERR_SUCCESS;
|
return M64ERR_SUCCESS;
|
||||||
case M64CMD_SET_FRAME_CALLBACK:
|
case M64CMD_SET_FRAME_CALLBACK:
|
||||||
g_FrameCallback = (m64p_frame_callback) ParamPtr;
|
g_FrameCallback = (m64p_frame_callback) ParamPtr;
|
||||||
|
return M64ERR_SUCCESS;
|
||||||
|
case M64CMD_SET_VI_CALLBACK:
|
||||||
|
g_VICallback = (m64p_vi_callback) ParamPtr;
|
||||||
return M64ERR_SUCCESS;
|
return M64ERR_SUCCESS;
|
||||||
case M64CMD_TAKE_NEXT_SCREENSHOT:
|
case M64CMD_TAKE_NEXT_SCREENSHOT:
|
||||||
if (!g_EmulatorRunning)
|
if (!g_EmulatorRunning)
|
||||||
|
|
|
@ -151,7 +151,8 @@ typedef enum {
|
||||||
M64CMD_CORE_STATE_SET,
|
M64CMD_CORE_STATE_SET,
|
||||||
M64CMD_READ_SCREEN,
|
M64CMD_READ_SCREEN,
|
||||||
M64CMD_RESET,
|
M64CMD_RESET,
|
||||||
M64CMD_ADVANCE_FRAME
|
M64CMD_ADVANCE_FRAME,
|
||||||
|
M64CMD_SET_VI_CALLBACK
|
||||||
} m64p_command;
|
} m64p_command;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -73,6 +73,7 @@
|
||||||
m64p_handle g_CoreConfig = NULL;
|
m64p_handle g_CoreConfig = NULL;
|
||||||
|
|
||||||
m64p_frame_callback g_FrameCallback = NULL;
|
m64p_frame_callback g_FrameCallback = NULL;
|
||||||
|
m64p_vi_callback g_VICallback = NULL;
|
||||||
|
|
||||||
int g_MemHasBeenBSwapped = 0; // store byte-swapped flag so we don't swap twice when re-playing game
|
int g_MemHasBeenBSwapped = 0; // store byte-swapped flag so we don't swap twice when re-playing game
|
||||||
int g_EmulatorRunning = 0; // need separate boolean to tell if emulator is running, since --nogui doesn't use a thread
|
int g_EmulatorRunning = 0; // need separate boolean to tell if emulator is running, since --nogui doesn't use a thread
|
||||||
|
@ -652,12 +653,6 @@ void new_frame(void)
|
||||||
|
|
||||||
/* advance the current frame */
|
/* advance the current frame */
|
||||||
l_CurrentFrame++;
|
l_CurrentFrame++;
|
||||||
|
|
||||||
if (l_FrameAdvance) {
|
|
||||||
rompause = 1;
|
|
||||||
l_FrameAdvance = 0;
|
|
||||||
StateChanged(M64CORE_EMU_STATE, M64EMU_PAUSED);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_vi(void)
|
void new_vi(void)
|
||||||
|
@ -709,6 +704,14 @@ void new_vi(void)
|
||||||
|
|
||||||
LastFPSTime = CurrentFPSTime ;
|
LastFPSTime = CurrentFPSTime ;
|
||||||
end_section(IDLE_SECTION);
|
end_section(IDLE_SECTION);
|
||||||
|
if (g_VICallback != NULL)
|
||||||
|
(*g_VICallback)();
|
||||||
|
|
||||||
|
if (l_FrameAdvance) {
|
||||||
|
rompause = 1;
|
||||||
|
l_FrameAdvance = 0;
|
||||||
|
StateChanged(M64CORE_EMU_STATE, M64EMU_PAUSED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************************************************
|
/*********************************************************************************************************
|
||||||
|
|
|
@ -32,6 +32,7 @@ extern int g_MemHasBeenBSwapped;
|
||||||
extern int g_EmulatorRunning;
|
extern int g_EmulatorRunning;
|
||||||
|
|
||||||
extern m64p_frame_callback g_FrameCallback;
|
extern m64p_frame_callback g_FrameCallback;
|
||||||
|
extern m64p_vi_callback g_VICallback;
|
||||||
|
|
||||||
const char* get_savestatepath(void);
|
const char* get_savestatepath(void);
|
||||||
const char* get_savesrampath(void);
|
const char* get_savesrampath(void);
|
||||||
|
|
Loading…
Reference in New Issue