diff --git a/components/st3m/st3m_gfx.c b/components/st3m/st3m_gfx.c
index c1aa54cb6f921aea7df48899cf353b0a071af4ce..876ade3e6069b19d19c5b3e19e1cedb90e8f237b 100644
--- a/components/st3m/st3m_gfx.c
+++ b/components/st3m/st3m_gfx.c
@@ -316,6 +316,8 @@ static void st3m_gfx_init_palette(st3m_gfx_mode mode) {
     }
 }
 
+static unsigned int st3m_clear_fbs = 0;
+
 st3m_gfx_mode st3m_gfx_set_mode(st3m_gfx_mode mode) {
     if ((mode == _st3m_gfx_mode) || (0 != (default_mode & st3m_gfx_lock))) {
         st3m_gfx_init_palette(
@@ -323,8 +325,7 @@ st3m_gfx_mode st3m_gfx_set_mode(st3m_gfx_mode mode) {
         return (mode ? mode : default_mode);
     }
 
-    memset(st3m_fb, 0, sizeof(st3m_fb));
-    memset(st3m_fb2, 0, sizeof(st3m_fb2));
+    st3m_clear_fbs = 1;
 
     if (mode == st3m_gfx_default)
         mode = default_mode;
@@ -438,7 +439,13 @@ static void st3m_gfx_task(void *_arg) {
             st3m_gfx_viewport_transform(fb_RGB8_ctx);
         }
 
-        if ((set_mode & st3m_gfx_direct_ctx) == 0)
+        if (st3m_clear_fbs) {
+            memset(st3m_fb, 0, sizeof(st3m_fb));
+            memset(st3m_fb2, 0, sizeof(st3m_fb2));
+            st3m_clear_fbs = 0;
+        }
+
+        if (((set_mode & st3m_gfx_direct_ctx) == 0))
             ctx_render_ctx(drawlist->user_ctx, user_target);
 
         if ((scale > 1) || ((set_mode & st3m_gfx_osd) &&