feat(scripts/gdb): add draw unit debug info support (#7095)

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
Co-authored-by: Neo Xu <neo.xu1990@gmail.com>
This commit is contained in:
VIFEX
2024-10-19 03:13:15 +08:00
committed by GitHub
parent 92d424ec74
commit a29c7dd44f
11 changed files with 62 additions and 0 deletions

View File

@@ -188,6 +188,13 @@ class LVGL:
disp = self.lv_global["disp_default"] disp = self.lv_global["disp_default"]
return disp["act_scr"] if disp else None 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): def set_lvgl_instance(lv_global: gdb.Value):
global g_lvgl_instance global g_lvgl_instance
@@ -306,7 +313,48 @@ class InfoStyle(gdb.Command):
print(" ", end="") print(" ", end="")
dump_style_info(style) 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() DumpObj()
InfoStyle() InfoStyle()
InfoDrawUnit()
set_lvgl_instance(None) set_lvgl_instance(None)

View File

@@ -64,6 +64,7 @@ void lv_draw_dma2d_init(void)
draw_dma2d_unit->base_unit.evaluate_cb = evaluate_cb; draw_dma2d_unit->base_unit.evaluate_cb = evaluate_cb;
draw_dma2d_unit->base_unit.dispatch_cb = dispatch_cb; draw_dma2d_unit->base_unit.dispatch_cb = dispatch_cb;
draw_dma2d_unit->base_unit.delete_cb = delete_cb; draw_dma2d_unit->base_unit.delete_cb = delete_cb;
draw_dma2d_unit->base_unit.name = "DMA2D";
#if LV_DRAW_DMA2D_ASYNC #if LV_DRAW_DMA2D_ASYNC
g_unit = draw_dma2d_unit; g_unit = draw_dma2d_unit;

View File

@@ -91,6 +91,11 @@ struct _lv_draw_unit_t {
const lv_area_t * clip_area; 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. * 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. * `lv_draw_get_next_available_task` can be used to get an independent draw task.

View File

@@ -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.dispatch_cb = nema_gfx_dispatch;
draw_nema_gfx_unit->base_unit.evaluate_cb = nema_gfx_evaluate; 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.delete_cb = nema_gfx_delete;
draw_nema_gfx_unit->base_unit.name = "NEMA_GFX";
/*Create GPU Command List*/ /*Create GPU Command List*/
draw_nema_gfx_unit->cl = nema_cl_create(); draw_nema_gfx_unit->cl = nema_cl_create();
/*Bind Command List*/ /*Bind Command List*/

View File

@@ -92,6 +92,7 @@ void lv_draw_pxp_init(void)
draw_pxp_unit->base_unit.evaluate_cb = _pxp_evaluate; draw_pxp_unit->base_unit.evaluate_cb = _pxp_evaluate;
draw_pxp_unit->base_unit.dispatch_cb = _pxp_dispatch; draw_pxp_unit->base_unit.dispatch_cb = _pxp_dispatch;
draw_pxp_unit->base_unit.delete_cb = _pxp_delete; draw_pxp_unit->base_unit.delete_cb = _pxp_delete;
draw_pxp_unit->base_unit.name = "NXP_PXP";
#if LV_USE_PXP_DRAW_THREAD #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); lv_thread_init(&draw_pxp_unit->thread, LV_THREAD_PRIO_HIGH, _pxp_render_thread_cb, 2 * 1024, draw_pxp_unit);

View File

@@ -115,6 +115,7 @@ void lv_draw_vglite_init(void)
draw_vglite_unit->base_unit.wait_for_finish_cb = _vglite_wait_for_finish; draw_vglite_unit->base_unit.wait_for_finish_cb = _vglite_wait_for_finish;
#endif #endif
draw_vglite_unit->base_unit.delete_cb = _vglite_delete; draw_vglite_unit->base_unit.delete_cb = _vglite_delete;
draw_vglite_unit->base_unit.name = "NXP_VGLITE";
#if LV_USE_VGLITE_DRAW_THREAD #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); lv_thread_init(&draw_vglite_unit->thread, LV_THREAD_PRIO_HIGH, _vglite_render_thread_cb, 2 * 1024, draw_vglite_unit);

View File

@@ -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)); 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.dispatch_cb = dispatch;
draw_opengles_unit->base_unit.evaluate_cb = evaluate; 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, draw_opengles_unit->texture_cache = lv_cache_create(&lv_cache_class_lru_rb_count,
sizeof(cache_data_t), 128, (lv_cache_ops_t) { sizeof(cache_data_t), 128, (lv_cache_ops_t) {
.compare_cb = (lv_cache_compare_cb_t)opengles_texture_cache_compare_cb, .compare_cb = (lv_cache_compare_cb_t)opengles_texture_cache_compare_cb,

View File

@@ -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)); 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.dispatch_cb = lv_draw_dave2d_dispatch;
draw_dave2d_unit->base_unit.evaluate_cb = _dave2d_evaluate; draw_dave2d_unit->base_unit.evaluate_cb = _dave2d_evaluate;
draw_dave2d_unit->base_unit.name = "DAVE2D";
draw_dave2d_unit->idx = DRAW_UNIT_ID_DAVE2D; draw_dave2d_unit->idx = DRAW_UNIT_ID_DAVE2D;
result = lv_dave2d_init(); result = lv_dave2d_init();

View File

@@ -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)); 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.dispatch_cb = dispatch;
draw_sdl_unit->base_unit.evaluate_cb = evaluate; 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, draw_sdl_unit->texture_cache = lv_cache_create(&lv_cache_class_lru_rb_count,
sizeof(cache_data_t), 128, (lv_cache_ops_t) { sizeof(cache_data_t), 128, (lv_cache_ops_t) {
.compare_cb = (lv_cache_compare_cb_t)sdl_texture_cache_compare_cb, .compare_cb = (lv_cache_compare_cb_t)sdl_texture_cache_compare_cb,

View File

@@ -175,6 +175,7 @@ void lv_draw_sw_init(void)
draw_sw_unit->base_unit.evaluate_cb = evaluate; draw_sw_unit->base_unit.evaluate_cb = evaluate;
draw_sw_unit->idx = i; 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.delete_cb = LV_USE_OS ? lv_draw_sw_delete : NULL;
draw_sw_unit->base_unit.name = "SW";
#if LV_USE_OS #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); lv_thread_init(&draw_sw_unit->thread, LV_THREAD_PRIO_HIGH, render_thread_cb, LV_DRAW_THREAD_STACK_SIZE, draw_sw_unit);

View File

@@ -71,6 +71,7 @@ void lv_draw_vg_lite_init(void)
unit->base_unit.dispatch_cb = draw_dispatch; unit->base_unit.dispatch_cb = draw_dispatch;
unit->base_unit.evaluate_cb = draw_evaluate; unit->base_unit.evaluate_cb = draw_evaluate;
unit->base_unit.delete_cb = draw_delete; unit->base_unit.delete_cb = draw_delete;
unit->base_unit.name = "VG_LITE";
lv_vg_lite_image_dsc_init(unit); lv_vg_lite_image_dsc_init(unit);
#if LV_USE_VECTOR_GRAPHIC #if LV_USE_VECTOR_GRAPHIC