Skip to content

Commit aeac20f

Browse files
committed
Fixing colored triangles support
1 parent 252061b commit aeac20f

File tree

1 file changed

+71
-39
lines changed

1 file changed

+71
-39
lines changed

src/render/psp/SDL_render_psp.c

Lines changed: 71 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,24 @@
3030
#include "SDL_render_psp.h"
3131

3232
static unsigned int __attribute__((aligned(16))) list[262144];
33+
34+
typedef struct
35+
{
36+
uint8_t shade; /**< GU_FLAT or GU_SMOOTH */
37+
uint8_t mode; /**< GU_ADD, GU_SUBTRACT, GU_REVERSE_SUBTRACT, GU_MIN, GU_MAX */
38+
} PSP_BlendInfo;
39+
3340
typedef struct
3441
{
3542
void *frontbuffer; /**< main screen buffer */
3643
void *backbuffer; /**< buffer presented to display */
3744
uint64_t drawColor;
45+
PSP_BlendInfo blendInfo; /**< current blend info */
3846
uint8_t vsync; /* 0 (Disabled), 1 (Enabled), 2 (Dynamic) */
3947
SDL_bool vblank_not_reached; /**< whether vblank wasn't reached */
4048
} PSP_RenderData;
4149

42-
typedef struct PSP_Texture
50+
typedef struct
4351
{
4452
void *data; /**< Image data. */
4553
unsigned int width; /**< Image width. */
@@ -428,53 +436,69 @@ static int PSP_RenderClear(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
428436
return 0;
429437
}
430438

431-
static void PSP_SetBlendMode(PSP_RenderData *data, int blendMode)
439+
static void PSP_SetBlendMode(PSP_RenderData *data, PSP_BlendInfo blendInfo)
432440
{
433-
switch (blendMode) {
434-
case SDL_BLENDMODE_NONE:
435-
{
436-
sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
437-
sceGuDisable(GU_BLEND);
438-
break;
439-
}
440-
case SDL_BLENDMODE_BLEND:
441-
{
442-
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
443-
sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
444-
sceGuEnable(GU_BLEND);
445-
break;
446-
}
447-
case SDL_BLENDMODE_ADD:
448-
{
449-
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
450-
sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_FIX, 0, 0x00FFFFFF);
451-
sceGuEnable(GU_BLEND);
452-
break;
453-
}
454-
case SDL_BLENDMODE_MOD:
455-
{
456-
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
457-
sceGuBlendFunc(GU_ADD, GU_FIX, GU_SRC_COLOR, 0, 0);
458-
sceGuEnable(GU_BLEND);
459-
break;
460-
}
461-
case SDL_BLENDMODE_MUL:
462-
{
463-
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
441+
// Update the blend mode if necessary
442+
if (data->blendInfo.mode != blendInfo.mode) {
443+
switch (blendInfo.mode) {
444+
case SDL_BLENDMODE_NONE:
445+
{
446+
sceGuShadeModel(GU_SMOOTH);
447+
sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
448+
sceGuDisable(GU_BLEND);
449+
break;
450+
}
451+
case SDL_BLENDMODE_BLEND:
452+
{
453+
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
454+
sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
455+
sceGuEnable(GU_BLEND);
456+
break;
457+
}
458+
case SDL_BLENDMODE_ADD:
459+
{
460+
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
461+
sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_FIX, 0, 0x00FFFFFF);
462+
sceGuEnable(GU_BLEND);
463+
break;
464+
}
465+
case SDL_BLENDMODE_MOD:
466+
{
467+
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
468+
sceGuBlendFunc(GU_ADD, GU_FIX, GU_SRC_COLOR, 0, 0);
469+
sceGuEnable(GU_BLEND);
470+
break;
471+
}
472+
case SDL_BLENDMODE_MUL:
473+
{
474+
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
464475
/* FIXME SDL_BLENDMODE_MUL is simplified, and dstA is in fact un-changed.*/
465-
sceGuBlendFunc(GU_ADD, GU_DST_COLOR, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
466-
sceGuEnable(GU_BLEND);
467-
break;
476+
sceGuBlendFunc(GU_ADD, GU_DST_COLOR, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
477+
sceGuEnable(GU_BLEND);
478+
break;
479+
}
480+
}
481+
482+
data->blendInfo.mode = blendInfo.mode;
468483
}
484+
485+
// Update shade model if needed
486+
if (data->blendInfo.shade != blendInfo.shade) {
487+
sceGuShadeModel(blendInfo.shade);
488+
data->blendInfo.shade = blendInfo.shade;
469489
}
470490
}
471491

472492
static int PSP_RenderGeometry(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *cmd)
473493
{
474494
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
475495
const size_t count = cmd->data.draw.count;
496+
PSP_BlendInfo blendInfo = {
497+
.mode = cmd->data.draw.blend,
498+
.shade = GU_SMOOTH
499+
};
476500

477-
PSP_SetBlendMode(data, cmd->data.draw.blend);
501+
PSP_SetBlendMode(data, blendInfo);
478502

479503
if (cmd->data.draw.texture) {
480504
const VertTCV *verts = (VertTCV *)(vertices + cmd->data.draw.first);
@@ -499,8 +523,12 @@ int PSP_RenderLines(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *c
499523
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
500524
const size_t count = cmd->data.draw.count;
501525
const VertV *verts = (VertV *)(vertices + cmd->data.draw.first);
526+
const PSP_BlendInfo blendInfo = {
527+
.mode = cmd->data.draw.blend,
528+
.shade = GU_FLAT
529+
};
502530

503-
PSP_SetBlendMode(data, cmd->data.draw.blend);
531+
PSP_SetBlendMode(data, blendInfo);
504532
sceGuDrawArray(GU_LINES, GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
505533

506534
return 0;
@@ -511,8 +539,12 @@ int PSP_RenderPoints(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *
511539
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
512540
const size_t count = cmd->data.draw.count;
513541
const VertV *verts = (VertV *)(vertices + cmd->data.draw.first);
542+
const PSP_BlendInfo blendInfo = {
543+
.mode = cmd->data.draw.blend,
544+
.shade = GU_FLAT
545+
};
514546

515-
PSP_SetBlendMode(data, cmd->data.draw.blend);
547+
PSP_SetBlendMode(data, blendInfo);
516548
sceGuDrawArray(GU_POINTS, GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
517549

518550
return 0;

0 commit comments

Comments
 (0)