1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-14 06:42:58 +08:00

feat(NemaGFX): add TSC color formats

This commit is contained in:
liamHowatt 2024-10-15 10:49:55 +02:00 committed by Gabor Kiss-Vamosi
parent 3c07bd9456
commit 07854b1d0b
11 changed files with 72 additions and 2 deletions

View File

@ -54,6 +54,27 @@ no locking is done). It may conflict with existing definitions
if you have an existing Nema HAL implementation. You may
simply be able to remove yours.
TSC Images
**********
TSC (ThinkSillicon Compression) images can be drawn by this renderer. The
TSC 4/6/6A/12/12A color formats are part of :cpp:type:`lv_color_format_t`.
All other renderers will ignore images with these color formats.
Define an image descriptor variable with the corresponding
TSC color format and the GPU will be able to draw it directly.
Stride does not need to be specified because it will be computed by the
renderer.
.. code-block:: c
const lv_image_dsc_t img_demo_widgets_avatar_tsc6a = {
.header.cf = LV_COLOR_FORMAT_NEMA_TSC6A,
.header.w = 144,
.header.h = 144,
.data = img_demo_widgets_avatar_tsc6a_map,
.data_size = sizeof(img_demo_widgets_avatar_tsc6a_map),
};
DMA2D
*****

View File

@ -292,7 +292,8 @@ static int32_t evaluate_cb(lv_draw_unit_t * draw_unit, lv_draw_task_t * task)
break;
case LV_DRAW_TASK_TYPE_IMAGE: {
lv_draw_image_dsc_t * dsc = task->draw_dsc;
if(!(dsc->clip_radius == 0
if(!(dsc->header.cf < LV_COLOR_FORMAT_PROPRIETARY_START
&& dsc->clip_radius == 0
&& dsc->bitmap_mask_src == NULL
&& dsc->sup == NULL
&& dsc->tile == 0

View File

@ -140,7 +140,9 @@ static void _draw_nema_gfx_img(lv_draw_unit_t * draw_unit, const lv_draw_image_d
}
uint32_t src_nema_cf = lv_nemagfx_cf_to_nema(src_cf);
uint32_t src_stride = img_dsc->header.stride;
/* the stride should be computed internally for NEMA_TSC images and images missing a stride value */
uint32_t src_stride = (src_cf >= LV_COLOR_FORMAT_NEMA_TSC_START && src_cf <= LV_COLOR_FORMAT_NEMA_TSC_END)
|| img_dsc->header.stride == 0 ? -1 : img_dsc->header.stride;
nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)),
lv_area_get_height(&(layer->buf_area)), dst_nema_cf,

View File

@ -68,6 +68,16 @@ uint32_t lv_nemagfx_cf_to_nema(lv_color_format_t cf)
return NEMA_BGRA8888;
case LV_COLOR_FORMAT_XRGB8888:
return NEMA_BGRX8888;
case LV_COLOR_FORMAT_NEMA_TSC4:
return NEMA_TSC4;
case LV_COLOR_FORMAT_NEMA_TSC6:
return NEMA_TSC6;
case LV_COLOR_FORMAT_NEMA_TSC6A:
return NEMA_TSC6A;
case LV_COLOR_FORMAT_NEMA_TSC12:
return NEMA_TSC12;
case LV_COLOR_FORMAT_NEMA_TSC12A:
return NEMA_TSC12A;
default:
return LV_NEMA_GFX_COLOR_FORMAT;
}

View File

@ -288,6 +288,9 @@ static int32_t _pxp_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t)
lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc;
const lv_image_dsc_t * img_dsc = draw_dsc->src;
if(img_dsc->header.cf >= LV_COLOR_FORMAT_PROPRIETARY_START)
return 0;
if(draw_dsc->tile)
return 0;

View File

@ -252,6 +252,10 @@ static int32_t _vglite_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t)
lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc;
const lv_image_dsc_t * img_dsc = draw_dsc->src;
if(img_dsc->header.cf >= LV_COLOR_FORMAT_PROPRIETARY_START) {
return 0;
}
#if LV_USE_VGLITE_BLIT_SPLIT
bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE ||
draw_dsc->scale_y != LV_SCALE_NONE);

View File

@ -219,6 +219,11 @@ static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task)
{
LV_UNUSED(draw_unit);
if(task->type == LV_DRAW_TASK_TYPE_IMAGE &&
((lv_draw_image_dsc_t *)task->draw_dsc)->header.cf >= LV_COLOR_FORMAT_PROPRIETARY_START) {
return 0;
}
/*If not refreshing the display probably it's a canvas rendering
*which his not support in SDL as it's not a texture.*/
if(lv_refr_get_disp_refreshing() == NULL) return 0;

View File

@ -243,6 +243,11 @@ static int32_t _dave2d_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t)
}
case LV_DRAW_TASK_TYPE_IMAGE: {
lv_draw_image_dsc_t * dsc = t->draw_dsc;
if(dsc->header.cf >= LV_COLOR_FORMAT_PROPRIETARY_START) {
ret = 0;
break;
}
#if USE_D2
t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D;
t->preference_score = 0;

View File

@ -168,6 +168,11 @@ static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task)
{
LV_UNUSED(draw_unit);
if(task->type == LV_DRAW_TASK_TYPE_IMAGE &&
((lv_draw_image_dsc_t *)task->draw_dsc)->header.cf >= LV_COLOR_FORMAT_PROPRIETARY_START) {
return 0;
}
/*If not refreshing the display probably it's a canvas rendering
*which his not support in SDL as it's not a texture.*/
if(lv_refr_get_disp_refreshing() == NULL) return 0;

View File

@ -414,6 +414,10 @@ static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task)
if(masked && (cf == LV_COLOR_FORMAT_A8 || cf == LV_COLOR_FORMAT_RGB565A8)) {
return 0;
}
if(cf >= LV_COLOR_FORMAT_PROPRIETARY_START) {
return 0;
}
}
break;
default:

View File

@ -171,6 +171,16 @@ typedef enum {
LV_COLOR_FORMAT_YUV_END = LV_COLOR_FORMAT_UYVY,
LV_COLOR_FORMAT_PROPRIETARY_START = 0x30,
LV_COLOR_FORMAT_NEMA_TSC_START = LV_COLOR_FORMAT_PROPRIETARY_START,
LV_COLOR_FORMAT_NEMA_TSC4 = LV_COLOR_FORMAT_NEMA_TSC_START,
LV_COLOR_FORMAT_NEMA_TSC6 = 0x31,
LV_COLOR_FORMAT_NEMA_TSC6A = 0x32,
LV_COLOR_FORMAT_NEMA_TSC12 = 0x33,
LV_COLOR_FORMAT_NEMA_TSC12A = 0x34,
LV_COLOR_FORMAT_NEMA_TSC_END = LV_COLOR_FORMAT_NEMA_TSC12A,
/*Color formats in which LVGL can render*/
#if LV_COLOR_DEPTH == 1
LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_I1,