From aeb4b3d2fc2af3c8fb48c56e7fd1aa6800496769 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 16 Dec 2025 08:47:45 -0800 Subject: [PATCH] Reverted Vita cliprect changes Temporarily backing out cliprect changes which caused logical presentation regressions. Fixes https://github.com/libsdl-org/SDL/issues/14645 Reopens https://github.com/libsdl-org/SDL/issues/13034 --- src/render/vitagxm/SDL_render_vita_gxm.c | 78 +++---------------- .../vitagxm/SDL_render_vita_gxm_types.h | 1 - 2 files changed, 9 insertions(+), 70 deletions(-) diff --git a/src/render/vitagxm/SDL_render_vita_gxm.c b/src/render/vitagxm/SDL_render_vita_gxm.c index ba49b249a6..cfecedaaa4 100644 --- a/src/render/vitagxm/SDL_render_vita_gxm.c +++ b/src/render/vitagxm/SDL_render_vita_gxm.c @@ -821,35 +821,6 @@ static SceGxmTextureAddrMode TranslateAddressMode(SDL_TextureAddressMode mode) } } -static void ClampCliprectToViewport(SDL_Rect *clip, const SDL_Rect *viewport) -{ - int max_x_v, max_y_v, max_x_c, max_y_c; - - if (clip->x < 0) { - clip->w += clip->x; - clip->x = 0; - } - - if (clip->y < 0) { - clip->h += clip->y; - clip->y = 0; - } - - max_x_c = clip->x + clip->w; - max_y_c = clip->y + clip->h; - - max_x_v = viewport->x + viewport->w; - max_y_v = viewport->y + viewport->h; - - if (max_x_c > max_x_v) { - clip->w -= (max_x_v - max_x_c); - } - - if (max_y_c > max_y_v) { - clip->h -= (max_y_v - max_y_c); - } -} - static bool SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd) { SDL_Texture *texture = cmd->data.draw.texture; @@ -892,13 +863,9 @@ static bool SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd data->drawstate.cliprect_enabled_dirty = false; } - if ((data->drawstate.cliprect_enabled || data->drawstate.viewport_is_set) && data->drawstate.cliprect_dirty) { - SDL_Rect rect; - SDL_copyp(&rect, &data->drawstate.cliprect); - if (data->drawstate.viewport_is_set) { - ClampCliprectToViewport(&rect, &data->drawstate.viewport); - } - set_clip_rectangle(data, rect.x, rect.y, rect.x + rect.w, rect.y + rect.h); + if (data->drawstate.cliprect_enabled && data->drawstate.cliprect_dirty) { + const SDL_Rect *rect = &data->drawstate.cliprect; + set_clip_rectangle(data, rect->x, rect->y, rect->x + rect->w, rect->y + rect->h); data->drawstate.cliprect_dirty = false; } @@ -986,31 +953,20 @@ static void VITA_GXM_InvalidateCachedState(SDL_Renderer *renderer) static bool VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize) { VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal; - int w, h; - StartDrawing(renderer); data->drawstate.target = renderer->target; if (!data->drawstate.target) { + int w, h; SDL_GetWindowSizeInPixels(renderer->window, &w, &h); - } else { - float fw, fh; - if (!SDL_GetTextureSize(renderer->target, &fw, &fh)) { - w = data->drawstate.drawablew; - h = data->drawstate.drawableh; - } else { - w = (int)SDL_roundf(fw); - h = (int)SDL_roundf(fh); + if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) { + data->drawstate.viewport_dirty = true; // if the window dimensions changed, invalidate the current viewport, etc. + data->drawstate.cliprect_dirty = true; + data->drawstate.drawablew = w; + data->drawstate.drawableh = h; } } - if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) { - data->drawstate.viewport_dirty = true; // if the window dimensions changed, invalidate the current viewport, etc. - data->drawstate.cliprect_dirty = true; - data->drawstate.drawablew = w; - data->drawstate.drawableh = h; - } - while (cmd) { switch (cmd->command) { @@ -1021,16 +977,6 @@ static bool VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand * SDL_copyp(viewport, &cmd->data.viewport.rect); data->drawstate.viewport_dirty = true; data->drawstate.cliprect_dirty = true; - data->drawstate.viewport_is_set = viewport->x != 0 || viewport->y != 0 || viewport->w != data->drawstate.drawablew || viewport->h != data->drawstate.drawableh; - if (!data->drawstate.cliprect_enabled) { - if (data->drawstate.viewport_is_set) { - SDL_copyp(&data->drawstate.cliprect, viewport); - data->drawstate.cliprect.x = 0; - data->drawstate.cliprect.y = 0; - } else { - data->drawstate.cliprect_enabled_dirty = true; - } - } } break; } @@ -1038,15 +984,9 @@ static bool VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand * case SDL_RENDERCMD_SETCLIPRECT: { const SDL_Rect *rect = &cmd->data.cliprect.rect; - const SDL_Rect *viewport = &data->drawstate.viewport; if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) { data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled; data->drawstate.cliprect_enabled_dirty = true; - if (!data->drawstate.cliprect_enabled && data->drawstate.viewport_is_set) { - SDL_copyp(&data->drawstate.cliprect, viewport); - data->drawstate.cliprect.x = 0; - data->drawstate.cliprect.y = 0; - } } if (SDL_memcmp(&data->drawstate.cliprect, rect, sizeof(*rect)) != 0) { diff --git a/src/render/vitagxm/SDL_render_vita_gxm_types.h b/src/render/vitagxm/SDL_render_vita_gxm_types.h index 6fc2c9e81f..f56814be6e 100644 --- a/src/render/vitagxm/SDL_render_vita_gxm_types.h +++ b/src/render/vitagxm/SDL_render_vita_gxm_types.h @@ -105,7 +105,6 @@ typedef struct { SDL_Rect viewport; bool viewport_dirty; - bool viewport_is_set; SDL_Texture *texture; SDL_Texture *target; SDL_FColor color;