From 99ad0871b1841a31e1a11bc096af8a63f9461dd8 Mon Sep 17 00:00:00 2001
From: Wohlstand <[EMAIL REDACTED]>
Date: Mon, 9 Jun 2025 01:26:08 +0300
Subject: [PATCH] Vita: Fixed absence of clipping when viewport is set
#13034
(cherry picked from commit 1c09a7117a94cdc1838a65df8b8e017a09bc5bc1)
---
src/render/vitagxm/SDL_render_vita_gxm.c | 37 +++++++++++++++----
.../vitagxm/SDL_render_vita_gxm_types.h | 1 +
2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/src/render/vitagxm/SDL_render_vita_gxm.c b/src/render/vitagxm/SDL_render_vita_gxm.c
index 9267b4e0e50ff..0fd4ea0c057da 100644
--- a/src/render/vitagxm/SDL_render_vita_gxm.c
+++ b/src/render/vitagxm/SDL_render_vita_gxm.c
@@ -868,7 +868,7 @@ static int SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd)
data->drawstate.cliprect_enabled_dirty = SDL_FALSE;
}
- if (data->drawstate.cliprect_enabled && data->drawstate.cliprect_dirty) {
+ if ((data->drawstate.cliprect_enabled || data->drawstate.viewport_is_set) && 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 = SDL_FALSE;
@@ -925,20 +925,27 @@ static int SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd)
static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
{
VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->driverdata;
+ int w, h;
+
StartDrawing(renderer);
data->drawstate.target = renderer->target;
if (!data->drawstate.target) {
- int w, h;
SDL_GL_GetDrawableSize(renderer->window, &w, &h);
- if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
- data->drawstate.viewport_dirty = SDL_TRUE; // if the window dimensions changed, invalidate the current viewport, etc.
- data->drawstate.cliprect_dirty = SDL_TRUE;
- data->drawstate.drawablew = w;
- data->drawstate.drawableh = h;
+ } else {
+ if (SDL_QueryTexture(renderer->target, NULL, NULL, &w, &h) < 0) {
+ w = data->drawstate.drawablew;
+ h = data->drawstate.drawableh;
}
}
+ if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
+ data->drawstate.viewport_dirty = SDL_TRUE; // if the window dimensions changed, invalidate the current viewport, etc.
+ data->drawstate.cliprect_dirty = SDL_TRUE;
+ data->drawstate.drawablew = w;
+ data->drawstate.drawableh = h;
+ }
+
while (cmd) {
switch (cmd->command) {
@@ -949,6 +956,16 @@ static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *c
SDL_copyp(viewport, &cmd->data.viewport.rect);
data->drawstate.viewport_dirty = SDL_TRUE;
data->drawstate.cliprect_dirty = SDL_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 = SDL_TRUE;
+ }
+ }
}
break;
}
@@ -956,9 +973,15 @@ static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *c
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 = SDL_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 c72c5eb10d234..d796403752716 100644
--- a/src/render/vitagxm/SDL_render_vita_gxm_types.h
+++ b/src/render/vitagxm/SDL_render_vita_gxm_types.h
@@ -106,6 +106,7 @@ typedef struct
{
SDL_Rect viewport;
SDL_bool viewport_dirty;
+ SDL_bool viewport_is_set;
SDL_Texture *texture;
SDL_Texture *target;
SDL_Color color;