Skip to content

Commit 43b4d75

Browse files
committed
Vita: Fixed absence of clipping when viewport is set
#13034
1 parent 3416296 commit 43b4d75

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

src/render/vitagxm/SDL_render_vita_gxm.c

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,7 @@ static int SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd)
868868
data->drawstate.cliprect_enabled_dirty = SDL_FALSE;
869869
}
870870

871-
if (data->drawstate.cliprect_enabled && data->drawstate.cliprect_dirty) {
871+
if ((data->drawstate.cliprect_enabled || data->drawstate.viewport_is_set) && data->drawstate.cliprect_dirty) {
872872
const SDL_Rect *rect = &data->drawstate.cliprect;
873873
set_clip_rectangle(data, rect->x, rect->y, rect->x + rect->w, rect->y + rect->h);
874874
data->drawstate.cliprect_dirty = SDL_FALSE;
@@ -925,20 +925,27 @@ static int SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd)
925925
static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
926926
{
927927
VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->driverdata;
928+
int w, h;
929+
928930
StartDrawing(renderer);
929931

930932
data->drawstate.target = renderer->target;
931933
if (!data->drawstate.target) {
932-
int w, h;
933934
SDL_GL_GetDrawableSize(renderer->window, &w, &h);
934-
if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
935-
data->drawstate.viewport_dirty = SDL_TRUE; // if the window dimensions changed, invalidate the current viewport, etc.
936-
data->drawstate.cliprect_dirty = SDL_TRUE;
937-
data->drawstate.drawablew = w;
938-
data->drawstate.drawableh = h;
935+
} else {
936+
if (SDL_QueryTexture(renderer->target, NULL, NULL, &w, &h) < 0) {
937+
w = data->drawstate.drawablew;
938+
h = data->drawstate.drawableh;
939939
}
940940
}
941941

942+
if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
943+
data->drawstate.viewport_dirty = SDL_TRUE; // if the window dimensions changed, invalidate the current viewport, etc.
944+
data->drawstate.cliprect_dirty = SDL_TRUE;
945+
data->drawstate.drawablew = w;
946+
data->drawstate.drawableh = h;
947+
}
948+
942949
while (cmd) {
943950
switch (cmd->command) {
944951

@@ -949,6 +956,16 @@ static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *c
949956
SDL_copyp(viewport, &cmd->data.viewport.rect);
950957
data->drawstate.viewport_dirty = SDL_TRUE;
951958
data->drawstate.cliprect_dirty = SDL_TRUE;
959+
data->drawstate.viewport_is_set = viewport->x != 0 || viewport->y != 0 || viewport->w != data->drawstate.drawablew || viewport->h != data->drawstate.drawableh;
960+
if (!data->drawstate.cliprect_enabled) {
961+
if (data->drawstate.viewport_is_set) {
962+
SDL_copyp(&data->drawstate.cliprect, viewport);
963+
data->drawstate.cliprect.x = 0;
964+
data->drawstate.cliprect.y = 0;
965+
} else {
966+
data->drawstate.cliprect_enabled_dirty = SDL_TRUE;
967+
}
968+
}
952969
}
953970
break;
954971
}
@@ -959,6 +976,11 @@ static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *c
959976
if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) {
960977
data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled;
961978
data->drawstate.cliprect_enabled_dirty = SDL_TRUE;
979+
if (!data->drawstate.cliprect_enabled && data->drawstate.viewport_is_set) {
980+
SDL_copyp(&data->drawstate.cliprect, viewport);
981+
data->drawstate.cliprect.x = 0;
982+
data->drawstate.cliprect.y = 0;
983+
}
962984
}
963985

964986
if (SDL_memcmp(&data->drawstate.cliprect, rect, sizeof(*rect)) != 0) {

src/render/vitagxm/SDL_render_vita_gxm_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ typedef struct
106106
{
107107
SDL_Rect viewport;
108108
SDL_bool viewport_dirty;
109+
SDL_bool viewport_is_set;
109110
SDL_Texture *texture;
110111
SDL_Texture *target;
111112
SDL_Color color;

0 commit comments

Comments
 (0)