Skip to content

Commit afa67bc

Browse files
authored
ogc: restore blending mode after every frame (#58)
The OGC_video_flip() function does not simply flip the current video frame: if the mouse cursor is visible, it will draw it. If/when we'll add support for the OSK keyboard, that will also be drawn at the end of every frame. Since these operations require a specific blending mode, we must make sure that it is restored to its original value before starting drawing the next frame. We could optimize this by having OGC_video_flip() return a boolean (or a bit mask, in case there are more settings beside the blending mode that it can alter) telling whether the blending mode was changed, in order not to perform an unneeded operation. It might make sense to do it once we decide to do the same for the vertex formats and the texture stages, which change more often and are heavier operations.
1 parent d36a791 commit afa67bc

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/render/ogc/SDL_render_ogc.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,10 @@ static void OGC_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event
6161
{
6262
}
6363

64-
static inline void OGC_SetBlendMode(SDL_Renderer *renderer, SDL_BlendMode blend_mode)
64+
static void set_blend_mode_real(SDL_Renderer *renderer, SDL_BlendMode blend_mode)
6565
{
6666
OGC_RenderData *data = renderer->driverdata;
6767

68-
if (data->ops_after_present > 0 &&
69-
blend_mode == data->current_blend_mode) {
70-
/* Nothing to do */
71-
return;
72-
}
73-
7468
switch (blend_mode) {
7569
case SDL_BLENDMODE_NONE:
7670
GX_SetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_INVSRCALPHA, GX_LO_CLEAR);
@@ -94,6 +88,19 @@ static inline void OGC_SetBlendMode(SDL_Renderer *renderer, SDL_BlendMode blend_
9488
data->current_blend_mode = blend_mode;
9589
}
9690

91+
static inline void OGC_SetBlendMode(SDL_Renderer *renderer, SDL_BlendMode blend_mode)
92+
{
93+
OGC_RenderData *data = renderer->driverdata;
94+
95+
if (data->ops_after_present > 0 &&
96+
blend_mode == data->current_blend_mode) {
97+
/* Nothing to do */
98+
return;
99+
}
100+
101+
set_blend_mode_real(renderer, blend_mode);
102+
}
103+
97104
static void save_efb_to_texture(SDL_Renderer *renderer)
98105
{
99106
SDL_Texture *texture = renderer->target;
@@ -539,6 +546,9 @@ static int OGC_RenderPresent(SDL_Renderer *renderer)
539546

540547
OGC_video_flip(SDL_GetVideoDevice(), data->vsync);
541548

549+
/* Mouse cursor and OSK can change the blending mode; restore it. */
550+
set_blend_mode_real(renderer, data->current_blend_mode);
551+
542552
data->ops_after_present = 0;
543553
return 0;
544554
}

0 commit comments

Comments
 (0)