diff --git a/include/c3d/renderqueue.h b/include/c3d/renderqueue.h index d082a91..6eedd1e 100644 --- a/include/c3d/renderqueue.h +++ b/include/c3d/renderqueue.h @@ -64,6 +64,11 @@ C3D_RenderTarget* C3D_RenderTargetCreateFromTex(C3D_Tex* tex, GPU_TEXFACE face, void C3D_RenderTargetDelete(C3D_RenderTarget* target); void C3D_RenderTargetSetOutput(C3D_RenderTarget* target, gfxScreen_t screen, gfx3dSide_t side, u32 transferFlags); +static inline void C3D_RenderTargetDetachOutput(C3D_RenderTarget* target) +{ + C3D_RenderTargetSetOutput(NULL, target->screen, target->side, 0); +} + static inline void C3D_RenderTargetClear(C3D_RenderTarget* target, C3D_ClearBits clearBits, u32 clearColor, u32 clearDepth) { C3D_FrameBufClear(&target->frameBuf, clearBits, clearColor, clearDepth); diff --git a/source/renderqueue.c b/source/renderqueue.c index 69e539d..97a001c 100644 --- a/source/renderqueue.c +++ b/source/renderqueue.c @@ -355,7 +355,10 @@ void C3D_RenderTargetDelete(C3D_RenderTarget* target) { if (inFrame) svcBreak(USERBREAK_PANIC); // Shouldn't happen. - C3Di_WaitAndClearQueue(-1); + if (target->linked) + C3D_RenderTargetDetachOutput(target); + else + C3Di_WaitAndClearQueue(-1); C3Di_RenderTargetDestroy(target); } @@ -365,12 +368,19 @@ void C3D_RenderTargetSetOutput(C3D_RenderTarget* target, gfxScreen_t screen, gfx if (screen==GFX_BOTTOM) id = 2; else if (side==GFX_RIGHT) id = 1; if (linkedTarget[id]) + { linkedTarget[id]->linked = false; + if (!inFrame) + C3Di_WaitAndClearQueue(-1); + } linkedTarget[id] = target; - target->linked = true; - target->transferFlags = transferFlags; - target->screen = screen; - target->side = side; + if (target) + { + target->linked = true; + target->transferFlags = transferFlags; + target->screen = screen; + target->side = side; + } } static void C3Di_SafeDisplayTransfer(u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 flags)