diff --git a/Source/3rdParty/mupen64plus-video-parallel/gfx_m64p.cpp b/Source/3rdParty/mupen64plus-video-parallel/gfx_m64p.cpp index 768ef0fd..b568499e 100644 --- a/Source/3rdParty/mupen64plus-video-parallel/gfx_m64p.cpp +++ b/Source/3rdParty/mupen64plus-video-parallel/gfx_m64p.cpp @@ -38,6 +38,7 @@ #include "m64p_types.h" #include "m64p_config.h" +#include "m64p_plugin.h" #include #include @@ -65,7 +66,7 @@ void (*render_callback)(int); m64p_handle configVideoParallel = NULL; #define PLUGIN_VERSION 0x000001 -#define VIDEO_PLUGIN_API_VERSION 0x020200 +#define VIDEO_PLUGIN_API_VERSION 0x020201 #define DP_INTERRUPT 0x20 uint32_t rdram_size; @@ -288,6 +289,11 @@ EXPORT void CALL ProcessRDPList(void) vk_process_commands(); } +EXPORT void CALL FullSync(void) +{ + vk_full_sync(); +} + EXPORT int CALL RomOpen(void) { window_fullscreen = false; diff --git a/Source/3rdParty/mupen64plus-video-parallel/parallel_imp.cpp b/Source/3rdParty/mupen64plus-video-parallel/parallel_imp.cpp index 0e0bb389..459fae42 100644 --- a/Source/3rdParty/mupen64plus-video-parallel/parallel_imp.cpp +++ b/Source/3rdParty/mupen64plus-video-parallel/parallel_imp.cpp @@ -28,6 +28,10 @@ bool vk_synchronous, vk_divot_filter, vk_gamma_dither; bool vk_vi_aa, vk_vi_scale, vk_dither_filter; bool vk_interlacing; +static uint64_t rdp_sync_signal; +static uint64_t last_frame_counter; +static uint64_t frame_counter; + static const unsigned cmd_len_lut[64] = { 1, 1, 1, 1, 1, 1, 1, 1, 4, 6, 12, 14, 12, 14, 20, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -440,7 +444,17 @@ void vk_process_commands() // For synchronous RDP: if (vk_synchronous) - processor->signal_timeline(); + { + if (frame_counter != last_frame_counter) // Only sync once per frame + { + rdp_sync_signal = processor->signal_timeline(); + last_frame_counter = frame_counter; + } + else + { + rdp_sync_signal = 0; + } + } *gfx.MI_INTR_REG |= DP_INTERRUPT; *GET_GFX_INFO(DPC_STATUS_REG) &= ~(DP_STATUS_PIPE_BUSY | DP_STATUS_START_GCLK); @@ -462,6 +476,13 @@ void vk_resize() platform->do_resize(); } + +void vk_full_sync() +{ + if (vk_synchronous && rdp_sync_signal) + processor->wait_for_timeline(rdp_sync_signal); +} + void vk_destroy() { wsi->end_frame(); @@ -549,5 +570,8 @@ bool vk_init() processor->set_quirks(quirks); wsi->begin_frame(); + + last_frame_counter = 0; + frame_counter = 0; return true; } \ No newline at end of file diff --git a/Source/3rdParty/mupen64plus-video-parallel/parallel_imp.h b/Source/3rdParty/mupen64plus-video-parallel/parallel_imp.h index 1618ee94..da2eaf19 100644 --- a/Source/3rdParty/mupen64plus-video-parallel/parallel_imp.h +++ b/Source/3rdParty/mupen64plus-video-parallel/parallel_imp.h @@ -28,6 +28,7 @@ extern "C" bool vk_init(); void vk_destroy(); void vk_resize(); + void vk_full_sync(); void vk_read_screen(unsigned char* dest); #ifdef __cplusplus