@@ -862,7 +862,7 @@ static bool SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd
862
862
data -> drawstate .cliprect_enabled_dirty = false;
863
863
}
864
864
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 ) {
866
866
const SDL_Rect * rect = & data -> drawstate .cliprect ;
867
867
set_clip_rectangle (data , rect -> x , rect -> y , rect -> x + rect -> w , rect -> y + rect -> h );
868
868
data -> drawstate .cliprect_dirty = false;
@@ -952,20 +952,31 @@ static void VITA_GXM_InvalidateCachedState(SDL_Renderer *renderer)
952
952
static bool VITA_GXM_RunCommandQueue (SDL_Renderer * renderer , SDL_RenderCommand * cmd , void * vertices , size_t vertsize )
953
953
{
954
954
VITA_GXM_RenderData * data = (VITA_GXM_RenderData * )renderer -> internal ;
955
+ int w , h ;
956
+
955
957
StartDrawing (renderer );
956
958
957
959
data -> drawstate .target = renderer -> target ;
958
960
if (!data -> drawstate .target ) {
959
- int w , h ;
960
961
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 );
966
970
}
967
971
}
968
972
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
+
969
980
while (cmd ) {
970
981
switch (cmd -> command ) {
971
982
@@ -976,16 +987,32 @@ static bool VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *
976
987
SDL_copyp (viewport , & cmd -> data .viewport .rect );
977
988
data -> drawstate .viewport_dirty = true;
978
989
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
+ }
979
1000
}
980
1001
break ;
981
1002
}
982
1003
983
1004
case SDL_RENDERCMD_SETCLIPRECT :
984
1005
{
985
1006
const SDL_Rect * rect = & cmd -> data .cliprect .rect ;
1007
+ const SDL_Rect * viewport = & data -> drawstate .viewport ;
986
1008
if (data -> drawstate .cliprect_enabled != cmd -> data .cliprect .enabled ) {
987
1009
data -> drawstate .cliprect_enabled = cmd -> data .cliprect .enabled ;
988
1010
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
+ }
989
1016
}
990
1017
991
1018
if (SDL_memcmp (& data -> drawstate .cliprect , rect , sizeof (* rect )) != 0 ) {
0 commit comments