30
30
#include "SDL_render_psp.h"
31
31
32
32
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
+
33
40
typedef struct
34
41
{
35
42
void * frontbuffer ; /**< main screen buffer */
36
43
void * backbuffer ; /**< buffer presented to display */
37
44
uint64_t drawColor ;
45
+ PSP_BlendInfo blendInfo ; /**< current blend info */
38
46
uint8_t vsync ; /* 0 (Disabled), 1 (Enabled), 2 (Dynamic) */
39
47
SDL_bool vblank_not_reached ; /**< whether vblank wasn't reached */
40
48
} PSP_RenderData ;
41
49
42
- typedef struct PSP_Texture
50
+ typedef struct
43
51
{
44
52
void * data ; /**< Image data. */
45
53
unsigned int width ; /**< Image width. */
@@ -428,53 +436,69 @@ static int PSP_RenderClear(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
428
436
return 0 ;
429
437
}
430
438
431
- static void PSP_SetBlendMode (PSP_RenderData * data , int blendMode )
439
+ static void PSP_SetBlendMode (PSP_RenderData * data , PSP_BlendInfo blendInfo )
432
440
{
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 );
464
475
/* 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 ;
468
483
}
484
+
485
+ // Update shade model if needed
486
+ if (data -> blendInfo .shade != blendInfo .shade ) {
487
+ sceGuShadeModel (blendInfo .shade );
488
+ data -> blendInfo .shade = blendInfo .shade ;
469
489
}
470
490
}
471
491
472
492
static int PSP_RenderGeometry (SDL_Renderer * renderer , void * vertices , SDL_RenderCommand * cmd )
473
493
{
474
494
PSP_RenderData * data = (PSP_RenderData * )renderer -> driverdata ;
475
495
const size_t count = cmd -> data .draw .count ;
496
+ PSP_BlendInfo blendInfo = {
497
+ .mode = cmd -> data .draw .blend ,
498
+ .shade = GU_SMOOTH
499
+ };
476
500
477
- PSP_SetBlendMode (data , cmd -> data . draw . blend );
501
+ PSP_SetBlendMode (data , blendInfo );
478
502
479
503
if (cmd -> data .draw .texture ) {
480
504
const VertTCV * verts = (VertTCV * )(vertices + cmd -> data .draw .first );
@@ -499,8 +523,12 @@ int PSP_RenderLines(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *c
499
523
PSP_RenderData * data = (PSP_RenderData * )renderer -> driverdata ;
500
524
const size_t count = cmd -> data .draw .count ;
501
525
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
+ };
502
530
503
- PSP_SetBlendMode (data , cmd -> data . draw . blend );
531
+ PSP_SetBlendMode (data , blendInfo );
504
532
sceGuDrawArray (GU_LINES , GU_VERTEX_32BITF | GU_TRANSFORM_2D , count , 0 , verts );
505
533
506
534
return 0 ;
@@ -511,8 +539,12 @@ int PSP_RenderPoints(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *
511
539
PSP_RenderData * data = (PSP_RenderData * )renderer -> driverdata ;
512
540
const size_t count = cmd -> data .draw .count ;
513
541
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
+ };
514
546
515
- PSP_SetBlendMode (data , cmd -> data . draw . blend );
547
+ PSP_SetBlendMode (data , blendInfo );
516
548
sceGuDrawArray (GU_POINTS , GU_VERTEX_32BITF | GU_TRANSFORM_2D , count , 0 , verts );
517
549
518
550
return 0 ;
0 commit comments