Skip to content

Commit b958d67

Browse files
committed
Improve CPU&GPU parallelization
1 parent 16810a1 commit b958d67

File tree

1 file changed

+27
-16
lines changed

1 file changed

+27
-16
lines changed

src/render/psp/SDL_render_psp.c

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
#include <psputils.h>
3333
#include <pspdisplay.h>
3434

35-
static unsigned int __attribute__((aligned(16))) list[262144];
35+
#define GPU_LIST_SIZE 256 * 1024
3636

3737
typedef struct
3838
{
@@ -42,13 +42,14 @@ typedef struct
4242

4343
typedef struct
4444
{
45+
uint32_t __attribute__((aligned(16))) guList[2][GPU_LIST_SIZE];
4546
void *frontbuffer; /**< main screen buffer */
4647
void *backbuffer; /**< buffer presented to display */
48+
PSP_BlendInfo blendInfo; /**< current blend info */
4749
uint8_t drawBufferFormat; /**< GU_PSM_8888 or GU_PSM_5650 or GU_PSM_4444 */
4850
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 */
5151
uint8_t vsync; /* 0 (Disabled), 1 (Enabled), 2 (Dynamic) */
52+
uint8_t list_idx;
5253
SDL_bool vblank_not_reached; /**< whether vblank wasn't reached */
5354
} PSP_RenderData;
5455

@@ -69,7 +70,6 @@ typedef struct
6970
uint8_t format; /**< Image format - one of ::pgePixelFormat. */
7071
uint8_t filter; /**< Image filter - one of GU_NEAREST or GU_LINEAR. */
7172
uint8_t swizzled; /**< Whether the image is swizzled or not. */
72-
7373
} PSP_Texture;
7474

7575
typedef struct
@@ -539,7 +539,7 @@ static int PSP_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
539539
sceGuScissor(0,0,psp_tex->width, psp_tex->height);
540540

541541
} else {
542-
sceGuDrawBufferList(data->drawBufferFormat, vrelptr(data->frontbuffer), PSP_FRAME_BUFFER_WIDTH);
542+
sceGuDrawBufferList(data->drawBufferFormat, vrelptr(data->backbuffer), PSP_FRAME_BUFFER_WIDTH);
543543
data->currentDrawBufferFormat = data->drawBufferFormat;
544544
}
545545

@@ -1018,8 +1018,12 @@ static int PSP_RenderPresent(SDL_Renderer *renderer)
10181018
{
10191019
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
10201020

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);
10231027

10241028
if (((data->vsync == 2) && (data->vblank_not_reached)) || // Dynamic
10251029
(data->vsync == 1)) { // Normal VSync
@@ -1030,8 +1034,14 @@ static int PSP_RenderPresent(SDL_Renderer *renderer)
10301034
data->backbuffer = data->frontbuffer;
10311035
data->frontbuffer = vabsptr(sceGuSwapBuffers());
10321036

1037+
// Send the packet to the GPU
1038+
sceGuSendList(GU_TAIL, data->guList[data->list_idx], NULL);
1039+
10331040
// 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);
10351045

10361046
return 0;
10371047
}
@@ -1093,7 +1103,6 @@ static int PSP_SetVSync(SDL_Renderer *renderer, const int vsync)
10931103
static int PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, Uint32 flags)
10941104
{
10951105
PSP_RenderData *data;
1096-
void *doublebuffer = NULL;
10971106
uint32_t bufferSize = 0;
10981107
SDL_bool dynamicVsync;
10991108

@@ -1111,15 +1120,13 @@ static int PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, Uint32
11111120

11121121
/* Specific GU init */
11131122
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);
11171125

11181126
sceGuInit();
1119-
sceGuStart(GU_DIRECT, list);
1127+
sceGuStart(GU_DIRECT, data->guList[0]);
11201128
sceGuDrawBuffer(data->drawBufferFormat, vrelptr(data->frontbuffer), PSP_FRAME_BUFFER_WIDTH);
11211129
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
11231130

11241131
sceGuOffset(2048 - (PSP_SCREEN_WIDTH >> 1), 2048 - (PSP_SCREEN_HEIGHT >> 1));
11251132
sceGuViewport(2048, 2048, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);
@@ -1130,12 +1137,16 @@ static int PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, Uint32
11301137
sceGuEnable(GU_SCISSOR_TEST);
11311138

11321139
sceGuFinish();
1133-
sceGuSync(0,0);
1140+
sceGuSync(GU_SYNC_FINISH, GU_SYNC_WHAT_DONE);
11341141

11351142
sceDisplayWaitVblankStart();
11361143
sceGuDisplay(GU_TRUE);
11371144

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);
11391150

11401151
// Clear the screen
11411152
sceGuClearColor(0);

0 commit comments

Comments
 (0)