SDL: Presenting while drawing to a render target should fail.

From 5d20bbf348f05cf3d84538caa8e62c0bd180514d Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 a830f3b2b9736..432cacfc4db84 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 6958eeb6f7e1e..5ab1bf7eb04be 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);