32
32
#include <psputils.h>
33
33
#include <pspdisplay.h>
34
34
35
- static unsigned int __attribute__(( aligned ( 16 ))) list [ 262144 ];
35
+ #define GPU_LIST_SIZE 256 * 1024
36
36
37
37
typedef struct
38
38
{
@@ -42,13 +42,14 @@ typedef struct
42
42
43
43
typedef struct
44
44
{
45
+ uint32_t __attribute__((aligned (16 ))) guList [2 ][GPU_LIST_SIZE ];
45
46
void * frontbuffer ; /**< main screen buffer */
46
47
void * backbuffer ; /**< buffer presented to display */
48
+ PSP_BlendInfo blendInfo ; /**< current blend info */
47
49
uint8_t drawBufferFormat ; /**< GU_PSM_8888 or GU_PSM_5650 or GU_PSM_4444 */
48
50
uint8_t currentDrawBufferFormat ; /**< GU_PSM_8888 or GU_PSM_5650 or GU_PSM_4444 */
49
- uint64_t drawColor ;
50
- PSP_BlendInfo blendInfo ; /**< current blend info */
51
51
uint8_t vsync ; /* 0 (Disabled), 1 (Enabled), 2 (Dynamic) */
52
+ uint8_t list_idx ;
52
53
SDL_bool vblank_not_reached ; /**< whether vblank wasn't reached */
53
54
} PSP_RenderData ;
54
55
@@ -69,7 +70,6 @@ typedef struct
69
70
uint8_t format ; /**< Image format - one of ::pgePixelFormat. */
70
71
uint8_t filter ; /**< Image filter - one of GU_NEAREST or GU_LINEAR. */
71
72
uint8_t swizzled ; /**< Whether the image is swizzled or not. */
72
-
73
73
} PSP_Texture ;
74
74
75
75
typedef struct
@@ -539,7 +539,7 @@ static int PSP_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
539
539
sceGuScissor (0 ,0 ,psp_tex -> width , psp_tex -> height );
540
540
541
541
} else {
542
- sceGuDrawBufferList (data -> drawBufferFormat , vrelptr (data -> frontbuffer ), PSP_FRAME_BUFFER_WIDTH );
542
+ sceGuDrawBufferList (data -> drawBufferFormat , vrelptr (data -> backbuffer ), PSP_FRAME_BUFFER_WIDTH );
543
543
data -> currentDrawBufferFormat = data -> drawBufferFormat ;
544
544
}
545
545
@@ -1018,8 +1018,12 @@ static int PSP_RenderPresent(SDL_Renderer *renderer)
1018
1018
{
1019
1019
PSP_RenderData * data = (PSP_RenderData * )renderer -> driverdata ;
1020
1020
1021
- sceGuFinish ();
1022
- sceGuSync (0 ,0 );
1021
+ int g_packet_size = sceGuFinish ();
1022
+ void * pkt = data -> guList [data -> list_idx ];
1023
+ SDL_assert (g_packet_size < GPU_LIST_SIZE );
1024
+ sceKernelDcacheWritebackRange (pkt , g_packet_size ) ;
1025
+
1026
+ sceGuSync (GU_SYNC_FINISH , GU_SYNC_WHAT_DONE );
1023
1027
1024
1028
if (((data -> vsync == 2 ) && (data -> vblank_not_reached )) || // Dynamic
1025
1029
(data -> vsync == 1 )) { // Normal VSync
@@ -1030,8 +1034,14 @@ static int PSP_RenderPresent(SDL_Renderer *renderer)
1030
1034
data -> backbuffer = data -> frontbuffer ;
1031
1035
data -> frontbuffer = vabsptr (sceGuSwapBuffers ());
1032
1036
1037
+ // Send the packet to the GPU
1038
+ sceGuSendList (GU_TAIL , data -> guList [data -> list_idx ], NULL );
1039
+
1033
1040
// Starting a new frame
1034
- sceGuStart (GU_DIRECT ,list );
1041
+ data -> list_idx = (data -> list_idx != 0 ) ? 0 : 1 ;
1042
+
1043
+ sceGuStart (GU_SEND , data -> guList [data -> list_idx ]);
1044
+ sceGuDrawBufferList (data -> drawBufferFormat , vrelptr (data -> backbuffer ), PSP_FRAME_BUFFER_WIDTH );
1035
1045
1036
1046
return 0 ;
1037
1047
}
@@ -1093,7 +1103,6 @@ static int PSP_SetVSync(SDL_Renderer *renderer, const int vsync)
1093
1103
static int PSP_CreateRenderer (SDL_Renderer * renderer , SDL_Window * window , Uint32 flags )
1094
1104
{
1095
1105
PSP_RenderData * data ;
1096
- void * doublebuffer = NULL ;
1097
1106
uint32_t bufferSize = 0 ;
1098
1107
SDL_bool dynamicVsync ;
1099
1108
@@ -1111,15 +1120,13 @@ static int PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, Uint32
1111
1120
1112
1121
/* Specific GU init */
1113
1122
bufferSize = getMemorySize (PSP_FRAME_BUFFER_WIDTH , PSP_SCREEN_HEIGHT , data -> drawBufferFormat );
1114
- doublebuffer = vramalloc (bufferSize * 2 );
1115
- data -> backbuffer = doublebuffer ;
1116
- data -> frontbuffer = ((uint8_t * )doublebuffer ) + bufferSize ;
1123
+ data -> frontbuffer = vramalloc (bufferSize );
1124
+ data -> backbuffer = vramalloc (bufferSize );
1117
1125
1118
1126
sceGuInit ();
1119
- sceGuStart (GU_DIRECT , list );
1127
+ sceGuStart (GU_DIRECT , data -> guList [ 0 ] );
1120
1128
sceGuDrawBuffer (data -> drawBufferFormat , vrelptr (data -> frontbuffer ), PSP_FRAME_BUFFER_WIDTH );
1121
1129
sceGuDispBuffer (PSP_SCREEN_WIDTH , PSP_SCREEN_HEIGHT , vrelptr (data -> backbuffer ), PSP_FRAME_BUFFER_WIDTH );
1122
- sceGuDepthBuffer (vrelptr (data -> backbuffer ), 0 ); // Set the depth buffer to the same space as the framebuffer
1123
1130
1124
1131
sceGuOffset (2048 - (PSP_SCREEN_WIDTH >> 1 ), 2048 - (PSP_SCREEN_HEIGHT >> 1 ));
1125
1132
sceGuViewport (2048 , 2048 , PSP_SCREEN_WIDTH , PSP_SCREEN_HEIGHT );
@@ -1130,12 +1137,16 @@ static int PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, Uint32
1130
1137
sceGuEnable (GU_SCISSOR_TEST );
1131
1138
1132
1139
sceGuFinish ();
1133
- sceGuSync (0 , 0 );
1140
+ sceGuSync (GU_SYNC_FINISH , GU_SYNC_WHAT_DONE );
1134
1141
1135
1142
sceDisplayWaitVblankStart ();
1136
1143
sceGuDisplay (GU_TRUE );
1137
1144
1138
- sceGuStart (GU_DIRECT ,list );
1145
+ // Starting the first frame
1146
+ data -> list_idx = 0 ;
1147
+
1148
+ sceGuStart (GU_SEND , data -> guList [data -> list_idx ]);
1149
+ sceGuDrawBufferList (data -> drawBufferFormat , vrelptr (data -> backbuffer ), PSP_FRAME_BUFFER_WIDTH );
1139
1150
1140
1151
// Clear the screen
1141
1152
sceGuClearColor (0 );
0 commit comments