From 44c0feed99b47895723974f8bef8482f61d5bfec Mon Sep 17 00:00:00 2001
From: Wohlstand <[EMAIL REDACTED]>
Date: Fri, 6 Feb 2026 15:25:45 +0300
Subject: [PATCH] Revert "Reverted Vita cliprect changes"
This reverts commit aeb4b3d2fc2af3c8fb48c56e7fd1aa6800496769.
(cherry picked from commit 75d1d64c75fd84e5826d0e1a4e1664a45c4324f1)
---
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 7c4f2ebc8f95b..b1c25ccd5c81a 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 ac3dcd5633748..b7aafd03b5d7d 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;