Skip to content

Commit 252061b

Browse files
committed
Fix weird texture issues
1 parent da10818 commit 252061b

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2727,9 +2727,9 @@ elseif(PSP)
27272727
pspvram
27282728
pspaudio
27292729
pspvfpu
2730+
pspdisplay
27302731
pspgu
27312732
pspge
2732-
pspdisplay
27332733
psphprm
27342734
pspctrl
27352735
psppower

src/render/psp/SDL_render_psp.c

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ typedef struct PSP_Texture
4747
unsigned int textureWidth; /**< Texture width (power of two). */
4848
unsigned int textureHeight; /**< Texture height (power of two). */
4949
unsigned int format; /**< Image format - one of ::pgePixelFormat. */
50+
unsigned int size; /**< Image size in bytes. */
5051
unsigned int filter; /**< Image filter - one of GU_NEAREST or GU_LINEAR. */
5152
unsigned int pitch;
5253
} PSP_Texture;
@@ -179,7 +180,8 @@ static int PSP_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
179180
psp_tex->height = texture->h;
180181
psp_tex->textureWidth = calculateNextPow2(texture->w);
181182
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);
183185

184186
if (!psp_tex->data) {
185187
SDL_free(psp_tex);
@@ -209,7 +211,7 @@ static void PSP_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
209211
PSP_Texture *psp_texture = (PSP_Texture *)texture->driverdata;
210212
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
211213

212-
sceKernelDcacheWritebackAll();
214+
sceKernelDcacheWritebackRange(psp_texture->data, psp_texture->size);
213215
}
214216

215217
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
478480
const VertTCV *verts = (VertTCV *)(vertices + cmd->data.draw.first);
479481
PSP_Texture *psp_tex = (PSP_Texture *)cmd->data.draw.texture->driverdata;
480482

481-
sceGuEnable(GU_TEXTURE_2D);
482483
sceGuTexMode(psp_tex->format, 0, 0, GU_FALSE);
483-
sceGuTexFilter(psp_tex->filter, psp_tex->filter);
484484
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);
485487
sceGuDrawArray(GU_TRIANGLES, GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
486488
sceGuDisable(GU_TEXTURE_2D);
487489
} else {
@@ -518,6 +520,18 @@ int PSP_RenderPoints(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *
518520

519521
static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
520522
{
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+
521535
while (cmd) {
522536
switch (cmd->command) {
523537
case SDL_RENDERCMD_SETVIEWPORT:
@@ -543,12 +557,12 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
543557
}
544558
case SDL_RENDERCMD_DRAW_POINTS:
545559
{
546-
PSP_RenderPoints(renderer, vertices, cmd);
560+
PSP_RenderPoints(renderer, gpumem, cmd);
547561
break;
548562
}
549563
case SDL_RENDERCMD_DRAW_LINES:
550564
{
551-
PSP_RenderLines(renderer, vertices, cmd);
565+
PSP_RenderLines(renderer, gpumem, cmd);
552566
break;
553567
}
554568
case SDL_RENDERCMD_FILL_RECTS: /* unused */
@@ -559,7 +573,7 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
559573
break;
560574
case SDL_RENDERCMD_GEOMETRY:
561575
{
562-
PSP_RenderGeometry(renderer, vertices, cmd);
576+
PSP_RenderGeometry(renderer, gpumem, cmd);
563577
break;
564578
}
565579
case SDL_RENDERCMD_NO_OP:

0 commit comments

Comments
 (0)