diff --git a/scripts/gdb/lvgl.py b/scripts/gdb/lvgl.py index feddb1c295..f36d6260b9 100644 --- a/scripts/gdb/lvgl.py +++ b/scripts/gdb/lvgl.py @@ -188,6 +188,13 @@ class LVGL: disp = self.lv_global["disp_default"] return disp["act_scr"] if disp else None + def draw_units(self): + unit = self.lv_global["draw_info"]["unit_head"] + + # Iterate through all draw units + while unit: + yield unit + unit = unit["next"] def set_lvgl_instance(lv_global: gdb.Value): global g_lvgl_instance @@ -306,7 +313,48 @@ class InfoStyle(gdb.Command): print(" ", end="") dump_style_info(style) +class InfoDrawUnit(gdb.Command): + """dump draw unit info""" + + def __init__(self): + super(InfoDrawUnit, self).__init__( + "info draw_unit", gdb.COMMAND_USER, gdb.COMPLETE_EXPRESSION + ) + + def dump_draw_unit(self, draw_unit:gdb.Value): + # Dereference to get the string content of the name from draw_unit + name = draw_unit["name"].string() + + # Print draw_unit information and the name + print(f"Draw Unit: {draw_unit}, Name: {name}") + + # Handle different draw_units based on the name + def lookup_type(name): + try: + return gdb.lookup_type(name) + except gdb.error: + return None + + types = { + "DMA2D": lookup_type("lv_draw_dma2d_unit_t"), + "NEMA_GFX": lookup_type("lv_draw_nema_gfx_unit_t"), + "NXP_PXP": lookup_type("lv_draw_pxp_unit_t"), + "NXP_VGLITE": lookup_type("lv_draw_vglite_unit_t"), + "OPENGLES": lookup_type("lv_draw_opengles_unit_t"), + "DAVE2D": lookup_type("lv_draw_dave2d_unit_t"), + "SDL": lookup_type("lv_draw_sdl_unit_t"), + "SW": lookup_type("lv_draw_sw_unit_t"), + "VG_LITE": lookup_type("lv_draw_vg_lite_unit_t"), + } + + type = types.get(name) or lookup_type("lv_draw_unit_t") + print(draw_unit.cast(type.pointer()).dereference().format_string(pretty_structs=True, symbols=True)) + + def invoke(self, args, from_tty): + for unit in g_lvgl_instance.draw_units(): + self.dump_draw_unit(unit) DumpObj() InfoStyle() +InfoDrawUnit() set_lvgl_instance(None) diff --git a/src/draw/dma2d/lv_draw_dma2d.c b/src/draw/dma2d/lv_draw_dma2d.c index 83659c030f..f616d5b82f 100644 --- a/src/draw/dma2d/lv_draw_dma2d.c +++ b/src/draw/dma2d/lv_draw_dma2d.c @@ -64,6 +64,7 @@ void lv_draw_dma2d_init(void) draw_dma2d_unit->base_unit.evaluate_cb = evaluate_cb; draw_dma2d_unit->base_unit.dispatch_cb = dispatch_cb; draw_dma2d_unit->base_unit.delete_cb = delete_cb; + draw_dma2d_unit->base_unit.name = "DMA2D"; #if LV_DRAW_DMA2D_ASYNC g_unit = draw_dma2d_unit; diff --git a/src/draw/lv_draw_private.h b/src/draw/lv_draw_private.h index e3fd034526..8145cf7f23 100644 --- a/src/draw/lv_draw_private.h +++ b/src/draw/lv_draw_private.h @@ -91,6 +91,11 @@ struct _lv_draw_unit_t { const lv_area_t * clip_area; + /** + * Name of the draw unit, for debugging purposes only. + */ + const char * name; + /** * Called to try to assign a draw task to itself. * `lv_draw_get_next_available_task` can be used to get an independent draw task. diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx.c b/src/draw/nema_gfx/lv_draw_nema_gfx.c index f6f2bac0c0..53f33ebd2a 100644 --- a/src/draw/nema_gfx/lv_draw_nema_gfx.c +++ b/src/draw/nema_gfx/lv_draw_nema_gfx.c @@ -104,6 +104,7 @@ void lv_draw_nema_gfx_init(void) draw_nema_gfx_unit->base_unit.dispatch_cb = nema_gfx_dispatch; draw_nema_gfx_unit->base_unit.evaluate_cb = nema_gfx_evaluate; draw_nema_gfx_unit->base_unit.delete_cb = nema_gfx_delete; + draw_nema_gfx_unit->base_unit.name = "NEMA_GFX"; /*Create GPU Command List*/ draw_nema_gfx_unit->cl = nema_cl_create(); /*Bind Command List*/ diff --git a/src/draw/nxp/pxp/lv_draw_pxp.c b/src/draw/nxp/pxp/lv_draw_pxp.c index b86e30f420..800d834e93 100644 --- a/src/draw/nxp/pxp/lv_draw_pxp.c +++ b/src/draw/nxp/pxp/lv_draw_pxp.c @@ -92,6 +92,7 @@ void lv_draw_pxp_init(void) draw_pxp_unit->base_unit.evaluate_cb = _pxp_evaluate; draw_pxp_unit->base_unit.dispatch_cb = _pxp_dispatch; draw_pxp_unit->base_unit.delete_cb = _pxp_delete; + draw_pxp_unit->base_unit.name = "NXP_PXP"; #if LV_USE_PXP_DRAW_THREAD lv_thread_init(&draw_pxp_unit->thread, LV_THREAD_PRIO_HIGH, _pxp_render_thread_cb, 2 * 1024, draw_pxp_unit); diff --git a/src/draw/nxp/vglite/lv_draw_vglite.c b/src/draw/nxp/vglite/lv_draw_vglite.c index c6fc016f49..34b7c4fdab 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite.c +++ b/src/draw/nxp/vglite/lv_draw_vglite.c @@ -115,6 +115,7 @@ void lv_draw_vglite_init(void) draw_vglite_unit->base_unit.wait_for_finish_cb = _vglite_wait_for_finish; #endif draw_vglite_unit->base_unit.delete_cb = _vglite_delete; + draw_vglite_unit->base_unit.name = "NXP_VGLITE"; #if LV_USE_VGLITE_DRAW_THREAD lv_thread_init(&draw_vglite_unit->thread, LV_THREAD_PRIO_HIGH, _vglite_render_thread_cb, 2 * 1024, draw_vglite_unit); diff --git a/src/draw/opengles/lv_draw_opengles.c b/src/draw/opengles/lv_draw_opengles.c index fb8888f1e7..9d1e83a646 100644 --- a/src/draw/opengles/lv_draw_opengles.c +++ b/src/draw/opengles/lv_draw_opengles.c @@ -94,6 +94,7 @@ void lv_draw_opengles_init(void) lv_draw_opengles_unit_t * draw_opengles_unit = lv_draw_create_unit(sizeof(lv_draw_opengles_unit_t)); draw_opengles_unit->base_unit.dispatch_cb = dispatch; draw_opengles_unit->base_unit.evaluate_cb = evaluate; + draw_opengles_unit->base_unit.name = "OPENGLES"; draw_opengles_unit->texture_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(cache_data_t), 128, (lv_cache_ops_t) { .compare_cb = (lv_cache_compare_cb_t)opengles_texture_cache_compare_cb, diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d.c b/src/draw/renesas/dave2d/lv_draw_dave2d.c index 039b147a7f..66cf8fa5d4 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d.c @@ -79,6 +79,7 @@ void lv_draw_dave2d_init(void) lv_draw_dave2d_unit_t * draw_dave2d_unit = lv_draw_create_unit(sizeof(lv_draw_dave2d_unit_t)); draw_dave2d_unit->base_unit.dispatch_cb = lv_draw_dave2d_dispatch; draw_dave2d_unit->base_unit.evaluate_cb = _dave2d_evaluate; + draw_dave2d_unit->base_unit.name = "DAVE2D"; draw_dave2d_unit->idx = DRAW_UNIT_ID_DAVE2D; result = lv_dave2d_init(); diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index d9c63cfc4a..a6098c7dc5 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -111,6 +111,7 @@ void lv_draw_sdl_init(void) lv_draw_sdl_unit_t * draw_sdl_unit = lv_draw_create_unit(sizeof(lv_draw_sdl_unit_t)); draw_sdl_unit->base_unit.dispatch_cb = dispatch; draw_sdl_unit->base_unit.evaluate_cb = evaluate; + draw_sdl_unit->base_unit.name = "SDL"; draw_sdl_unit->texture_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(cache_data_t), 128, (lv_cache_ops_t) { .compare_cb = (lv_cache_compare_cb_t)sdl_texture_cache_compare_cb, diff --git a/src/draw/sw/lv_draw_sw.c b/src/draw/sw/lv_draw_sw.c index 04bea8d113..44df64eaec 100644 --- a/src/draw/sw/lv_draw_sw.c +++ b/src/draw/sw/lv_draw_sw.c @@ -175,6 +175,7 @@ void lv_draw_sw_init(void) draw_sw_unit->base_unit.evaluate_cb = evaluate; draw_sw_unit->idx = i; draw_sw_unit->base_unit.delete_cb = LV_USE_OS ? lv_draw_sw_delete : NULL; + draw_sw_unit->base_unit.name = "SW"; #if LV_USE_OS lv_thread_init(&draw_sw_unit->thread, LV_THREAD_PRIO_HIGH, render_thread_cb, LV_DRAW_THREAD_STACK_SIZE, draw_sw_unit); diff --git a/src/draw/vg_lite/lv_draw_vg_lite.c b/src/draw/vg_lite/lv_draw_vg_lite.c index a1a1b16a56..86b58068da 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite.c +++ b/src/draw/vg_lite/lv_draw_vg_lite.c @@ -71,6 +71,7 @@ void lv_draw_vg_lite_init(void) unit->base_unit.dispatch_cb = draw_dispatch; unit->base_unit.evaluate_cb = draw_evaluate; unit->base_unit.delete_cb = draw_delete; + unit->base_unit.name = "VG_LITE"; lv_vg_lite_image_dsc_init(unit); #if LV_USE_VECTOR_GRAPHIC