diff --git a/components/st3m/st3m_gfx.c b/components/st3m/st3m_gfx.c index 099c6b7bc9f45d987f49ed671a7d38b23bbcdc20..687cbbf748c9a6c6de975f4bbd213cdf74a1c550 100644 --- a/components/st3m/st3m_gfx.c +++ b/components/st3m/st3m_gfx.c @@ -332,14 +332,7 @@ st3m_gfx_mode st3m_gfx_set_mode(st3m_gfx_mode mode) { _st3m_gfx_mode = (mode == default_mode) ? st3m_gfx_default : mode; _st3m_gfx_low_latency = ((mode & st3m_gfx_low_latency) != 0); - switch ((int)mode) { - case st3m_gfx_16bpp_direct_ctx: - case st3m_gfx_16bpp_direct_ctx_osd: - case st3m_gfx_8bpp_direct_ctx: - case st3m_gfx_32bpp_direct_ctx: - case st3m_gfx_24bpp_direct_ctx: - _st3m_gfx_low_latency = 1; - } + if (mode & st3m_gfx_direct_ctx) _st3m_gfx_low_latency = 1; return mode; } @@ -377,6 +370,7 @@ uint8_t *st3m_gfx_fb(st3m_gfx_mode mode, int *width, int *height, int *stride) { return st3m_fb2; } +static int fb_ready = 1; // ugly synch hack static void st3m_gfx_task(void *_arg) { (void)_arg; st3m_gfx_set_mode(st3m_gfx_default); @@ -387,6 +381,7 @@ static void st3m_gfx_task(void *_arg) { xQueueReceiveNotifyStarved(user_ctx_rastq, &desc_no, "rast task starved (user_ctx)!"); st3m_gfx_drawlist *drawlist = &drawlists[desc_no]; + fb_ready = 0; ctx_set_textureclock(fb_RGB565_BS_ctx, ctx_textureclock(fb_RGB565_BS_ctx) + 1); @@ -456,9 +451,12 @@ static void st3m_gfx_task(void *_arg) { } else { flow3r_bsp_display_send_fb(user_fb, bits); } + fb_ready = 1; - ctx_drawlist_clear(drawlist->user_ctx); - st3m_gfx_viewport_transform(drawlist->user_ctx); + if ((set_mode & st3m_gfx_direct_ctx) == 0) { + ctx_drawlist_clear(drawlist->user_ctx); + st3m_gfx_viewport_transform(drawlist->user_ctx); + } xQueueSend(user_ctx_freeq, &desc_no, portMAX_DELAY); st3m_counter_rate_sample(&rast_rate); @@ -778,7 +776,6 @@ void st3m_gfx_init(void) { ESP_TASK_PRIO_MIN + 1, &graphics_task); assert(res == pdPASS); } - static int last_descno = 0; static Ctx *st3m_gfx_drawctx_free_get(TickType_t ticks_to_wait) { BaseType_t res = xQueueReceive(user_ctx_freeq, &last_descno, ticks_to_wait); @@ -791,11 +788,21 @@ static Ctx *st3m_gfx_drawctx_free_get(TickType_t ticks_to_wait) { drawlist->osd_y1 = _st3m_osd_y1; st3m_gfx_mode set_mode = _st3m_gfx_mode ? _st3m_gfx_mode : default_mode; - switch ((int)set_mode) { - case st3m_gfx_16bpp_direct_ctx: - case st3m_gfx_16bpp_direct_ctx_osd: - st3m_gfx_viewport_transform(fb_RGB565_BS_ctx); - return fb_RGB565_BS_ctx; + + if (set_mode & st3m_gfx_direct_ctx) { + while (!fb_ready) usleep(1); + + switch (_st3m_gfx_bpp(set_mode)) { + case 16: + st3m_gfx_viewport_transform(fb_RGB565_BS_ctx); + return fb_RGB565_BS_ctx; + case 8: + st3m_gfx_viewport_transform(fb_GRAY8_ctx); + return fb_GRAY8_ctx; + case 24: + st3m_gfx_viewport_transform(fb_RGB8_ctx); + return fb_RGB8_ctx; + } } return drawlist->user_ctx; @@ -816,14 +823,6 @@ void st3m_gfx_end_frame(Ctx *ctx) { } uint8_t st3m_gfx_pipe_full(void) { - st3m_gfx_mode mode = _st3m_gfx_mode ? _st3m_gfx_mode : default_mode; - switch ((int)mode) { - case st3m_gfx_16bpp_direct_ctx: - case st3m_gfx_16bpp_direct_ctx_osd: - return (uxQueueSpacesAvailable(user_ctx_rastq) == 0) || - (uxQueueMessagesWaiting(user_ctx_freeq) <= - _st3m_gfx_low_latency); - } return uxQueueMessagesWaiting(user_ctx_freeq) <= _st3m_gfx_low_latency; } diff --git a/python_payload/apps/graphics_mode/__init__.py b/python_payload/apps/graphics_mode/__init__.py index 14b50772f6d8e9fb3d0d7bd61c7418bdc8a735dd..3740da9a62f9df3dae293095b26b48dd05930db7 100644 --- a/python_payload/apps/graphics_mode/__init__.py +++ b/python_payload/apps/graphics_mode/__init__.py @@ -164,6 +164,8 @@ class App(Application): ctx.text(str(curmode)) bpp = self.draw_choice("bpp", ["8", "16", "24"], bpp) + if bpp > 0: + palette = 0 palette = self.draw_choice("palette", ["RGB", "gray", "sepia", "cool"], palette) scale = self.draw_choice("scale", ["1x", "2x", "3x", "4x"], scale) low_latency = self.draw_boolean("low latency", low_latency) @@ -172,9 +174,6 @@ class App(Application): lock = self.draw_boolean("lock", lock) if direct_ctx: low_latency = True - bpp = 8 - if palette < 1: - palette = 2 if palette != 0: bpp = 0