From 75d1d64c75fd84e5826d0e1a4e1664a45c4324f1 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Fri, 6 Feb 2026 15:25:45 +0300 Subject: [PATCH] Revert "Reverted Vita cliprect changes" This reverts commit aeb4b3d2fc2af3c8fb48c56e7fd1aa6800496769. --- src/render/vitagxm/SDL_render_vita_gxm.c | 78 ++++++++++++++++--- .../vitagxm/SDL_render_vita_gxm_types.h | 1 + 2 files changed, 70 insertions(+), 9 deletions(-) diff --git a/src/render/vitagxm/SDL_render_vita_gxm.c b/src/render/vitagxm/SDL_render_vita_gxm.c index 7c4f2ebc8f..b1c25ccd5c 100644 --- a/src/render/vitagxm/SDL_render_vita_gxm.c +++ b/src/render/vitagxm/SDL_render_vita_gxm.c @@ -821,6 +821,35 @@ 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; @@ -863,9 +892,13 @@ static bool SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd data->drawstate.cliprect_enabled_dirty = false; } - 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); + 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); data->drawstate.cliprect_dirty = false; } @@ -953,20 +986,31 @@ 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); - 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; + } 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; + } + while (cmd) { switch (cmd->command) { @@ -977,6 +1021,16 @@ 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; } @@ -984,9 +1038,15 @@ 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 ac3dcd5633..b7aafd03b5 100644 --- a/src/render/vitagxm/SDL_render_vita_gxm_types.h +++ b/src/render/vitagxm/SDL_render_vita_gxm_types.h @@ -105,6 +105,7 @@ typedef struct { SDL_Rect viewport; bool viewport_dirty; + bool viewport_is_set; SDL_Texture *texture; SDL_Texture *target; SDL_FColor color;