From b276d8cec2fa77d6b6082fa5e5570e19307ebcaf Mon Sep 17 00:00:00 2001 From: fincs Date: Fri, 22 Jan 2016 00:06:15 +0100 Subject: [PATCH] Fix APT suspend with renderqueues --- source/base.c | 5 ++++- source/context.h | 1 + source/renderqueue.c | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/source/base.c b/source/base.c index 9db1a55..28aac3e 100644 --- a/source/base.c +++ b/source/base.c @@ -42,8 +42,9 @@ static void C3Di_AptEventHook(APT_HookType hookType, void* param) switch (hookType) { case APTHOOK_ONSUSPEND: - default: { + if (ctx->renderQueueWaitDone) + ctx->renderQueueWaitDone(); break; } case APTHOOK_ONRESTORE: @@ -62,6 +63,8 @@ static void C3Di_AptEventHook(APT_HookType hookType, void* param) env->Dirty(env); break; } + default: + break; } } diff --git a/source/context.h b/source/context.h index 97bc3b1..48fa053 100644 --- a/source/context.h +++ b/source/context.h @@ -50,6 +50,7 @@ typedef struct u16 fixedAttribDirty, fixedAttribEverDirty; C3D_FVec fixedAttribs[12]; + void (* renderQueueWaitDone)(void); void (* renderQueueExit)(void); } C3D_Context; diff --git a/source/renderqueue.c b/source/renderqueue.c index 527538b..8cea983 100644 --- a/source/renderqueue.c +++ b/source/renderqueue.c @@ -204,6 +204,12 @@ static void C3Di_RenderQueueExit(void) queuedState = 0; } +static void C3Di_RenderQueueWaitDone(void) +{ + while (queuedCount || transferQueue || clearQueue) + gspWaitForAnyEvent(); +} + bool checkRenderQueueInit(void) { C3D_Context* ctx = C3Di_GetContext(); @@ -214,6 +220,7 @@ bool checkRenderQueueInit(void) if (!ctx->renderQueueExit) { C3Di_RenderQueueInit(); + ctx->renderQueueWaitDone = C3Di_RenderQueueWaitDone; ctx->renderQueueExit = C3Di_RenderQueueExit; }