diff --git a/gfx/drivers/wiiu_gfx.c b/gfx/drivers/wiiu_gfx.c index f534041835..631be24bdf 100644 --- a/gfx/drivers/wiiu_gfx.c +++ b/gfx/drivers/wiiu_gfx.c @@ -88,8 +88,8 @@ typedef struct wiiu_render_mode_t render_mode; int frames; - bool noblock; - int syncframes; + OSTime last_vsync; + bool vsync; } wiiu_video_t; static const wiiu_render_mode_t wiiu_render_mode_map[] = @@ -216,7 +216,7 @@ static void* wiiu_gfx_init(const video_info_t* video, GX2_DISABLE, GX2_BLEND_MODE_ONE, GX2_BLEND_MODE_ZERO, GX2_BLEND_COMBINE_MODE_ADD); #endif GX2SetCullOnlyControl(GX2_FRONT_FACE_CCW, GX2_DISABLE, GX2_DISABLE); - GX2SetSwapInterval(1); + GX2SetSwapInterval(0); /* init shader */ // wiiu->shader = MEM2_alloc(sizeof(*wiiu->shader), GX2_VERTEX_BUFFER_ALIGNMENT); @@ -326,8 +326,7 @@ static void* wiiu_gfx_init(const video_info_t* video, GX2SetTVEnable(GX2_ENABLE); GX2SetDRCEnable(GX2_ENABLE); - wiiu->noblock = false; - wiiu->syncframes = 60; + wiiu->vsync = true; return wiiu; } @@ -385,29 +384,61 @@ static bool wiiu_gfx_frame(void* data, const void* frame, unsigned width, unsigned height, uint64_t frame_count, unsigned pitch, const char* msg) { - (void)frame; - (void)width; - (void)height; - (void)pitch; (void)msg; int i; wiiu_video_t* wiiu = (wiiu_video_t*) data; - if(wiiu->menu.enable || wiiu->noblock == false) - wiiu->syncframes = 60; - else if(wiiu->syncframes > 0) - wiiu->syncframes--; - GX2ClearColor(&wiiu->color_buffer, 0.0f, 0.0f, 0.0f, 1.0f); - // GX2ClearColor(&wiiu->color_buffer, 0.0f, 0.3f, 0.8f, 1.0f); - /* can't call GX2ClearColor after GX2SetContextState for whatever reason */ - GX2SetContextState(wiiu->ctx_state); if (!width || !height) { GX2WaitForVsync(); - return; + return true; } + if(wiiu->vsync) + { + uint32_t swap_count; + uint32_t flip_count; + OSTime last_flip; + OSTime last_vsync; + + GX2GetSwapStatus(&swap_count, &flip_count, &last_flip, &last_vsync); + + if(wiiu->last_vsync >= last_vsync) + { + GX2WaitForVsync(); + wiiu->last_vsync = last_vsync + ms_to_ticks(17); + } + else + wiiu->last_vsync = last_vsync; + } + + static u32 lastTick , currentTick; + currentTick = OSGetSystemTick(); + u32 diff = currentTick - lastTick; + static float fps; + static u32 frames; + frames++; + if(diff > wiiu_timer_clock) + { + fps = (float)frames * ((float) wiiu_timer_clock / (float) diff); + lastTick = currentTick; + frames = 0; + } +#if 0 + static u32 last_frame_tick; + if (!(wiiu->menu.enable)) + printf("\r frame time : %10.6f ms \n", (float)(currentTick - last_frame_tick) * 1000.0f / (float)wiiu_timer_clock); + last_frame_tick = currentTick; +#endif + printf("\rfps: %8.8f frames : %5i", fps, wiiu->frames++); + fflush(stdout); + + GX2ClearColor(&wiiu->color_buffer, 0.0f, 0.0f, 0.0f, 1.0f); + /* can't call GX2ClearColor after GX2SetContextState for whatever reason */ + GX2SetContextState(wiiu->ctx_state); + + if(frame) { if (width > wiiu->texture.surface.width) @@ -424,7 +455,6 @@ static bool wiiu_gfx_frame(void* data, const void* frame, for (i = 0; i < height; i++) { -// memcpy(dst, src, width * sizeof(uint16_t)); int j; for(j = 0; j < width; j++) dst[j] = __builtin_bswap16(src[j]); @@ -461,24 +491,6 @@ static bool wiiu_gfx_frame(void* data, const void* frame, GX2SwapScanBuffers(); GX2Flush(); - if(wiiu->syncframes) - GX2WaitForVsync(); - - static u32 lastTick , currentTick; - currentTick = OSGetSystemTick(); - u32 diff = currentTick - lastTick; - static float fps; - static u32 frames; - frames++; - if(diff > wiiu_timer_clock) - { - fps = (float)frames * ((float) wiiu_timer_clock / (float) diff); - lastTick = currentTick; - frames = 0; - } - - printf("\rfps: %8.4f frames : %5i", fps, wiiu->frames++); - fflush(stdout); return true; } @@ -490,8 +502,8 @@ static void wiiu_gfx_set_nonblock_state(void* data, bool toggle) if (!wiiu) return; - wiiu->noblock = toggle; - GX2SetSwapInterval(!toggle); + wiiu->vsync = !toggle; + /* GX2SetSwapInterval(!toggle); */ /* do we need this ? */ } static bool wiiu_gfx_alive(void* data) diff --git a/wiiu/system/exports/libgx2.h b/wiiu/system/exports/libgx2.h index 90ed1d25a7..7d8ebf90bf 100644 --- a/wiiu/system/exports/libgx2.h +++ b/wiiu/system/exports/libgx2.h @@ -2,5 +2,5 @@ EXPORT_BEGIN(gx2.rpl); #include "../rpl/libgx2/exports.h" - +EXPORT(GX2GetSwapStatus); EXPORT_END(); diff --git a/wiiu/wiiu_dbg.h b/wiiu/wiiu_dbg.h index d596e21284..45c643be3b 100644 --- a/wiiu/wiiu_dbg.h +++ b/wiiu/wiiu_dbg.h @@ -13,7 +13,7 @@ extern "C" { #endif //#define DEBUG_HOLD() do{printf("%s@%s:%d.\n",__FUNCTION__, __FILE__, __LINE__);fflush(stdout);wait_for_input();}while(0) -#define DEBUG_LINE() do{printf("%s:%d.\n",__FUNCTION__, __LINE__);fflush(stdout);}while(0) +#define DEBUG_LINE() do{printf("%s@%s:%d.\n",__FUNCTION__, __FILE__, __LINE__);fflush(stdout);}while(0) #define DEBUG_STR(X) printf( "%s: %s\n", #X, (char*)(X)) #define DEBUG_VAR(X) printf( "%-20s: 0x%08X\n", #X, (u32)(X)) #define DEBUG_VAR2(X) printf( "%-20s: 0x%08X (%i)\n", #X, (u32)(X), (int)(X))