@@ -47,6 +47,7 @@ typedef struct PSP_Texture
47
47
unsigned int textureWidth ; /**< Texture width (power of two). */
48
48
unsigned int textureHeight ; /**< Texture height (power of two). */
49
49
unsigned int format ; /**< Image format - one of ::pgePixelFormat. */
50
+ unsigned int size ; /**< Image size in bytes. */
50
51
unsigned int filter ; /**< Image filter - one of GU_NEAREST or GU_LINEAR. */
51
52
unsigned int pitch ;
52
53
} PSP_Texture ;
@@ -179,7 +180,8 @@ static int PSP_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
179
180
psp_tex -> height = texture -> h ;
180
181
psp_tex -> textureWidth = calculateNextPow2 (texture -> w );
181
182
psp_tex -> textureHeight = calculateNextPow2 (texture -> h );
182
- psp_tex -> data = SDL_calloc (1 , getMemorySize (psp_tex -> width , psp_tex -> height , psp_tex -> format ));
183
+ psp_tex -> size = getMemorySize (psp_tex -> width , psp_tex -> height , psp_tex -> format );
184
+ psp_tex -> data = SDL_calloc (1 , psp_tex -> size );
183
185
184
186
if (!psp_tex -> data ) {
185
187
SDL_free (psp_tex );
@@ -209,7 +211,7 @@ static void PSP_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
209
211
PSP_Texture * psp_texture = (PSP_Texture * )texture -> driverdata ;
210
212
PSP_RenderData * data = (PSP_RenderData * )renderer -> driverdata ;
211
213
212
- sceKernelDcacheWritebackAll ( );
214
+ sceKernelDcacheWritebackRange ( psp_texture -> data , psp_texture -> size );
213
215
}
214
216
215
217
static int PSP_UpdateTexture (SDL_Renderer * renderer , SDL_Texture * texture ,
@@ -478,10 +480,10 @@ static int PSP_RenderGeometry(SDL_Renderer *renderer, void *vertices, SDL_Render
478
480
const VertTCV * verts = (VertTCV * )(vertices + cmd -> data .draw .first );
479
481
PSP_Texture * psp_tex = (PSP_Texture * )cmd -> data .draw .texture -> driverdata ;
480
482
481
- sceGuEnable (GU_TEXTURE_2D );
482
483
sceGuTexMode (psp_tex -> format , 0 , 0 , GU_FALSE );
483
- sceGuTexFilter (psp_tex -> filter , psp_tex -> filter );
484
484
sceGuTexImage (0 , psp_tex -> textureWidth , psp_tex -> textureHeight , psp_tex -> width , psp_tex -> data );
485
+ sceGuTexFilter (psp_tex -> filter , psp_tex -> filter );
486
+ sceGuEnable (GU_TEXTURE_2D );
485
487
sceGuDrawArray (GU_TRIANGLES , GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D , count , 0 , verts );
486
488
sceGuDisable (GU_TEXTURE_2D );
487
489
} else {
@@ -518,6 +520,18 @@ int PSP_RenderPoints(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *
518
520
519
521
static int PSP_RunCommandQueue (SDL_Renderer * renderer , SDL_RenderCommand * cmd , void * vertices , size_t vertsize )
520
522
{
523
+ /* note that before the renderer interface change, this would do extrememly small
524
+ batches with sceGuGetMemory()--a few vertices at a time--and it's not clear that
525
+ this won't fail if you try to push 100,000 draw calls in a single batch.
526
+ I don't know what the limits on PSP hardware are. It might be useful to have
527
+ rendering backends report a reasonable maximum, so the higher level can flush
528
+ if we appear to be exceeding that. */
529
+ Uint8 * gpumem = (Uint8 * )sceGuGetMemory (vertsize );
530
+ if (gpumem == NULL ) {
531
+ return SDL_SetError ("Couldn't obtain a %d-byte vertex buffer!" , (int )vertsize );
532
+ }
533
+ SDL_memcpy (gpumem , vertices , vertsize );
534
+
521
535
while (cmd ) {
522
536
switch (cmd -> command ) {
523
537
case SDL_RENDERCMD_SETVIEWPORT :
@@ -543,12 +557,12 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
543
557
}
544
558
case SDL_RENDERCMD_DRAW_POINTS :
545
559
{
546
- PSP_RenderPoints (renderer , vertices , cmd );
560
+ PSP_RenderPoints (renderer , gpumem , cmd );
547
561
break ;
548
562
}
549
563
case SDL_RENDERCMD_DRAW_LINES :
550
564
{
551
- PSP_RenderLines (renderer , vertices , cmd );
565
+ PSP_RenderLines (renderer , gpumem , cmd );
552
566
break ;
553
567
}
554
568
case SDL_RENDERCMD_FILL_RECTS : /* unused */
@@ -559,7 +573,7 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
559
573
break ;
560
574
case SDL_RENDERCMD_GEOMETRY :
561
575
{
562
- PSP_RenderGeometry (renderer , vertices , cmd );
576
+ PSP_RenderGeometry (renderer , gpumem , cmd );
563
577
break ;
564
578
}
565
579
case SDL_RENDERCMD_NO_OP :
0 commit comments