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:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user