From 00fc50557ec3852ecaa92af942d80a0c7d7f175e Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 3 Jul 2023 18:29:48 -0700
Subject: [PATCH] Make sure logical presentation is complete before destroying
the logical render target
Fixes "testautomation --filter render_testLogicalSize"
---
src/render/SDL_render.c | 110 +++++++++++++++++++----------------
test/testautomation_render.c | 3 -
2 files changed, 61 insertions(+), 52 deletions(-)
diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index bd935ac8288a..82fe65099e44 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -2263,6 +2263,60 @@ int SDL_GetRenderLogicalPresentation(SDL_Renderer *renderer, int *w, int *h, SDL
return 0;
}
+static void SDL_RenderLogicalBorders(SDL_Renderer *renderer)
+{
+ const SDL_FRect *dst = &renderer->logical_dst_rect;
+
+ if (dst->x > 0.0f || dst->y > 0.0f) {
+ SDL_BlendMode saved_blend_mode = renderer->blendMode;
+ SDL_Color saved_color = renderer->color;
+
+ SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE);
+ SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
+
+ if (dst->x > 0.0f) {
+ SDL_FRect rect;
+
+ rect.x = 0.0f;
+ rect.y = 0.0f;
+ rect.w = dst->x;
+ rect.h = (float)renderer->view->pixel_h;
+ SDL_RenderFillRect(renderer, &rect);
+
+ rect.x = dst->x + dst->w;
+ rect.w = (float)renderer->view->pixel_w - rect.x;
+ SDL_RenderFillRect(renderer, &rect);
+ }
+
+ if (dst->y > 0.0f) {
+ SDL_FRect rect;
+
+ rect.x = 0.0f;
+ rect.y = 0.0f;
+ rect.w = (float)renderer->view->pixel_w;
+ rect.h = dst->y;
+ SDL_RenderFillRect(renderer, &rect);
+
+ rect.y = dst->y + dst->h;
+ rect.h = (float)renderer->view->pixel_h - rect.y;
+ SDL_RenderFillRect(renderer, &rect);
+ }
+
+ SDL_SetRenderDrawBlendMode(renderer, saved_blend_mode);
+ SDL_SetRenderDrawColor(renderer, saved_color.r, saved_color.g, saved_color.b, saved_color.a);
+ }
+}
+
+static void SDL_RenderLogicalPresentation(SDL_Renderer *renderer)
+{
+ SDL_assert(renderer->target == NULL);
+ SDL_SetRenderViewport(renderer, NULL);
+ SDL_SetRenderClipRect(renderer, NULL);
+ SDL_SetRenderScale(renderer, 1.0f, 1.0f);
+ SDL_RenderLogicalBorders(renderer);
+ SDL_RenderTexture(renderer, renderer->logical_target, &renderer->logical_src_rect, &renderer->logical_dst_rect);
+}
+
int SDL_RenderCoordinatesFromWindow(SDL_Renderer *renderer, float window_x, float window_y, float *x, float *y)
{
SDL_RenderViewState *view;
@@ -3927,50 +3981,6 @@ static void SDL_SimulateRenderVSync(SDL_Renderer *renderer)
}
}
-static void SDL_RenderLogicalBorders(SDL_Renderer *renderer)
-{
- const SDL_FRect *dst = &renderer->logical_dst_rect;
-
- if (dst->x > 0.0f || dst->y > 0.0f) {
- SDL_BlendMode saved_blend_mode = renderer->blendMode;
- SDL_Color saved_color = renderer->color;
-
- SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE);
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
-
- if (dst->x > 0.0f) {
- SDL_FRect rect;
-
- rect.x = 0.0f;
- rect.y = 0.0f;
- rect.w = dst->x;
- rect.h = (float)renderer->view->pixel_h;
- SDL_RenderFillRect(renderer, &rect);
-
- rect.x = dst->x + dst->w;
- rect.w = (float)renderer->view->pixel_w - rect.x;
- SDL_RenderFillRect(renderer, &rect);
- }
-
- if (dst->y > 0.0f) {
- SDL_FRect rect;
-
- rect.x = 0.0f;
- rect.y = 0.0f;
- rect.w = (float)renderer->view->pixel_w;
- rect.h = dst->y;
- SDL_RenderFillRect(renderer, &rect);
-
- rect.y = dst->y + dst->h;
- rect.h = (float)renderer->view->pixel_h - rect.y;
- SDL_RenderFillRect(renderer, &rect);
- }
-
- SDL_SetRenderDrawBlendMode(renderer, saved_blend_mode);
- SDL_SetRenderDrawColor(renderer, saved_color.r, saved_color.g, saved_color.b, saved_color.a);
- }
-}
-
int SDL_RenderPresent(SDL_Renderer *renderer)
{
SDL_bool presented = SDL_TRUE;
@@ -3979,11 +3989,7 @@ int SDL_RenderPresent(SDL_Renderer *renderer)
if (renderer->logical_target) {
SDL_SetRenderTargetInternal(renderer, NULL);
- SDL_SetRenderViewport(renderer, NULL);
- SDL_SetRenderClipRect(renderer, NULL);
- SDL_SetRenderScale(renderer, 1.0f, 1.0f);
- SDL_RenderLogicalBorders(renderer);
- SDL_RenderTexture(renderer, renderer->logical_target, &renderer->logical_src_rect, &renderer->logical_dst_rect);
+ SDL_RenderLogicalPresentation(renderer);
}
FlushRenderCommands(renderer); /* time to send everything to the GPU! */
@@ -4021,6 +4027,12 @@ static int SDL_DestroyTextureInternal(SDL_Texture *texture, SDL_bool is_destroyi
} else {
if (texture == renderer->target) {
SDL_SetRenderTargetInternal(renderer, NULL); /* implies command queue flush */
+
+ if (texture == renderer->logical_target) {
+ /* Complete any logical presentation */
+ SDL_RenderLogicalPresentation(renderer);
+ FlushRenderCommands(renderer);
+ }
} else {
FlushRenderCommandsIfTextureNeeded(texture);
}
diff --git a/test/testautomation_render.c b/test/testautomation_render.c
index a9a43a4d700c..66288dcc8cb8 100644
--- a/test/testautomation_render.c
+++ b/test/testautomation_render.c
@@ -845,7 +845,6 @@ static int render_testLogicalSize(void *arg)
rect.w = (float)viewport.w / factor;
rect.h = (float)viewport.h / factor;
CHECK_FUNC(SDL_RenderFillRect, (renderer, &rect))
- (void)SDL_RenderPresent(renderer);
CHECK_FUNC(SDL_SetRenderLogicalPresentation, (renderer, 0, 0,
SDL_LOGICAL_PRESENTATION_DISABLED,
SDL_SCALEMODE_NEAREST))
@@ -869,7 +868,6 @@ static int render_testLogicalSize(void *arg)
CHECK_FUNC(SDL_SetRenderDrawColor, (renderer, 0, 255, 0, SDL_ALPHA_OPAQUE))
CHECK_FUNC(SDL_RenderFillRect, (renderer, NULL))
CHECK_FUNC(SDL_SetRenderViewport, (renderer, NULL))
- (void)SDL_RenderPresent(renderer);
CHECK_FUNC(SDL_SetRenderLogicalPresentation, (renderer, 0, 0,
SDL_LOGICAL_PRESENTATION_DISABLED,
SDL_SCALEMODE_NEAREST))
@@ -902,7 +900,6 @@ static int render_testLogicalSize(void *arg)
SDL_SCALEMODE_LINEAR))
CHECK_FUNC(SDL_SetRenderDrawColor, (renderer, 0, 255, 0, SDL_ALPHA_OPAQUE))
CHECK_FUNC(SDL_RenderFillRect, (renderer, NULL))
- (void)SDL_RenderPresent(renderer);
CHECK_FUNC(SDL_SetRenderLogicalPresentation, (renderer, 0, 0,
SDL_LOGICAL_PRESENTATION_DISABLED,
SDL_SCALEMODE_NEAREST))