Skip to content

Commit 0edb424

Browse files
mardyWinterMute
authored andcommitted
ogc: do not implement clearing by copying the EFB
While copying the EFB is probably more efficient, it causes screen flashes (very noticeable on the console, and more rarely in Dolphin) due to the fact that we might be writing to the XFB while it's been read by the VI interface. So, let's implement clearing by drawing a rectangle over the window; this requires a little more code, but completely eliminates flashes.
1 parent 97df4f2 commit 0edb424

1 file changed

Lines changed: 26 additions & 8 deletions

File tree

src/render/ogc/SDL_render_ogc.c

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
typedef struct
4141
{
4242
SDL_BlendMode current_blend_mode;
43-
GXColor clear_color;
4443
int ops_after_present;
4544
bool vsync;
4645
u8 efb_pixel_format;
@@ -459,16 +458,35 @@ static int OGC_RenderClear(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
459458
cmd->data.color.b,
460459
cmd->data.color.a
461460
};
461+
int16_t x1 = 0;
462+
int16_t y1 = 0;
463+
int16_t x2 = renderer->window->w;
464+
int16_t y2 = renderer->window->h;
465+
OGC_set_viewport(0, 0, renderer->window->w, renderer->window->h);
466+
OGC_SetBlendMode(renderer, SDL_BLENDMODE_NONE);
462467

463-
data->clear_color = c;
464-
GX_SetCopyClear(c, GX_MAX_Z24);
465-
if (renderer->target) {
466-
save_efb_to_texture(renderer->target, true);
467-
} else {
468-
GX_CopyDisp(OGC_video_get_xfb(SDL_GetVideoDevice()), GX_TRUE);
469-
}
468+
GX_ClearVtxDesc();
469+
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
470+
GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_S16, 0);
471+
GX_SetTevColor(GX_TEVREG0, c);
472+
GX_SetTevColorIn(GX_TEVSTAGE0, GX_CC_C0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
473+
GX_SetTevAlphaIn(GX_TEVSTAGE0, GX_CA_A0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
474+
GX_SetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
475+
GX_SetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
476+
GX_SetNumTevStages(1);
477+
GX_SetNumChans(0);
478+
479+
GX_Begin(GX_QUADS, GX_VTXFMT0, 4);
480+
GX_Position2s16(x1, y1);
481+
GX_Position2s16(x2, y1);
482+
GX_Position2s16(x2, y2);
483+
GX_Position2s16(x1, y2);
484+
GX_End();
470485
data->ops_after_present++;
471486

487+
/* Restore the viewport */
488+
OGC_set_viewport(renderer->viewport.x, renderer->viewport.y,
489+
renderer->viewport.w, renderer->viewport.h);
472490
return 0;
473491
}
474492

0 commit comments

Comments
 (0)