From 5d20bbf348f05cf3d84538caa8e62c0bd180514d Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 4 Mar 2025 08:46:13 -0800 Subject: [PATCH] Presenting while drawing to a render target should fail. People are adding present calls while rendering to render targets, not understanding that this doesn't make sense, and wondering why they get flicker on some systems. If there are programs that relied on the previous behavior we can add a hint to control this. Fixes https://github.com/libsdl-org/SDL/issues/12432 --- include/SDL3/SDL_render.h | 3 +-- src/render/SDL_render.c | 9 ++------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/include/SDL3/SDL_render.h b/include/SDL3/SDL_render.h index a830f3b2b9..432cacfc4d 100644 --- a/include/SDL3/SDL_render.h +++ b/include/SDL3/SDL_render.h @@ -2385,8 +2385,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *ren * should not be done; you are only required to change back the rendering * target to default via `SDL_SetRenderTarget(renderer, NULL)` afterwards, as * textures by themselves do not have a concept of backbuffers. Calling - * SDL_RenderPresent while rendering to a texture will still update the screen - * with any current drawing that has been done _to the window itself_. + * SDL_RenderPresent while rendering to a texture will fail. * * \param renderer the rendering context. * \returns true on success or false on failure; call SDL_GetError() for more diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 6958eeb6f7..5ab1bf7eb0 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -5276,9 +5276,8 @@ bool SDL_RenderPresent(SDL_Renderer *renderer) CHECK_RENDERER_MAGIC(renderer, false); - SDL_Texture *target = renderer->target; - if (target) { - SDL_SetRenderTarget(renderer, NULL); + if (renderer->target) { + return SDL_SetError("You can't present on a render target"); } SDL_RenderLogicalPresentation(renderer); @@ -5299,10 +5298,6 @@ bool SDL_RenderPresent(SDL_Renderer *renderer) presented = false; } - if (target) { - SDL_SetRenderTarget(renderer, target); - } - if (renderer->simulate_vsync || (!presented && renderer->wanted_vsync)) { SDL_SimulateRenderVSync(renderer);