Skip to content

Commit 1bd5110

Browse files
Wohlstandslouken
authored andcommitted
Vita: Fixed absence of clipping when viewport is set
#13034 (cherry picked from commit 1c09a71) # Conflicts: # src/render/vitagxm/SDL_render_vita_gxm.c # src/render/vitagxm/SDL_render_vita_gxm_types.h
1 parent eb04219 commit 1bd5110

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

src/render/vitagxm/SDL_render_vita_gxm.c

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,7 @@ static bool SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd
862862
data->drawstate.cliprect_enabled_dirty = false;
863863
}
864864

865-
if (data->drawstate.cliprect_enabled && data->drawstate.cliprect_dirty) {
865+
if ((data->drawstate.cliprect_enabled || data->drawstate.viewport_is_set) && data->drawstate.cliprect_dirty) {
866866
const SDL_Rect *rect = &data->drawstate.cliprect;
867867
set_clip_rectangle(data, rect->x, rect->y, rect->x + rect->w, rect->y + rect->h);
868868
data->drawstate.cliprect_dirty = false;
@@ -952,20 +952,31 @@ static void VITA_GXM_InvalidateCachedState(SDL_Renderer *renderer)
952952
static bool VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
953953
{
954954
VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
955+
int w, h;
956+
955957
StartDrawing(renderer);
956958

957959
data->drawstate.target = renderer->target;
958960
if (!data->drawstate.target) {
959-
int w, h;
960961
SDL_GetWindowSizeInPixels(renderer->window, &w, &h);
961-
if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
962-
data->drawstate.viewport_dirty = true; // if the window dimensions changed, invalidate the current viewport, etc.
963-
data->drawstate.cliprect_dirty = true;
964-
data->drawstate.drawablew = w;
965-
data->drawstate.drawableh = h;
962+
} else {
963+
float fw, fh;
964+
if (!SDL_GetTextureSize(renderer->target, &fw, &fh)) {
965+
w = data->drawstate.drawablew;
966+
h = data->drawstate.drawableh;
967+
} else {
968+
w = (int)SDL_roundf(fw);
969+
h = (int)SDL_roundf(fh);
966970
}
967971
}
968972

973+
if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
974+
data->drawstate.viewport_dirty = true; // if the window dimensions changed, invalidate the current viewport, etc.
975+
data->drawstate.cliprect_dirty = true;
976+
data->drawstate.drawablew = w;
977+
data->drawstate.drawableh = h;
978+
}
979+
969980
while (cmd) {
970981
switch (cmd->command) {
971982

@@ -976,16 +987,32 @@ static bool VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *
976987
SDL_copyp(viewport, &cmd->data.viewport.rect);
977988
data->drawstate.viewport_dirty = true;
978989
data->drawstate.cliprect_dirty = true;
990+
data->drawstate.viewport_is_set = viewport->x != 0 || viewport->y != 0 || viewport->w != data->drawstate.drawablew || viewport->h != data->drawstate.drawableh;
991+
if (!data->drawstate.cliprect_enabled) {
992+
if (data->drawstate.viewport_is_set) {
993+
SDL_copyp(&data->drawstate.cliprect, viewport);
994+
data->drawstate.cliprect.x = 0;
995+
data->drawstate.cliprect.y = 0;
996+
} else {
997+
data->drawstate.cliprect_enabled_dirty = true;
998+
}
999+
}
9791000
}
9801001
break;
9811002
}
9821003

9831004
case SDL_RENDERCMD_SETCLIPRECT:
9841005
{
9851006
const SDL_Rect *rect = &cmd->data.cliprect.rect;
1007+
const SDL_Rect *viewport = &data->drawstate.viewport;
9861008
if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) {
9871009
data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled;
9881010
data->drawstate.cliprect_enabled_dirty = true;
1011+
if (!data->drawstate.cliprect_enabled && data->drawstate.viewport_is_set) {
1012+
SDL_copyp(&data->drawstate.cliprect, viewport);
1013+
data->drawstate.cliprect.x = 0;
1014+
data->drawstate.cliprect.y = 0;
1015+
}
9891016
}
9901017

9911018
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
@@ -105,6 +105,7 @@ typedef struct
105105
{
106106
SDL_Rect viewport;
107107
bool viewport_dirty;
108+
bool viewport_is_set;
108109
SDL_Texture *texture;
109110
SDL_Texture *target;
110111
SDL_FColor color;

0 commit comments

Comments
 (0)