doc(gpu): add a page for external GPU support and draw_ctx

related to: #2988
This commit is contained in:
Gabor Kiss-Vamosi
2022-01-11 11:35:01 +01:00
parent d6c0d791f7
commit 0645af32a2
9 changed files with 251 additions and 45 deletions

View File

@@ -120,7 +120,7 @@ void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_
bool done = false;
if(dsc->mask == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) {
if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) {
lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
lv_color_t * dest_buf = draw_ctx->buf;

View File

@@ -108,10 +108,10 @@ void lv_draw_sw_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * d
LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
{
const lv_opa_t * mask;
if(dsc->mask == NULL) mask = NULL;
if(dsc->mask && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return;
if(dsc->mask_buf == NULL) mask = NULL;
if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return;
else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL;
else mask = dsc->mask;
else mask = dsc->mask_buf;
lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);

View File

@@ -31,7 +31,7 @@ typedef struct {
* will be clipped to draw_`ctx->clip_area` */
const lv_color_t * src_buf; /**< Pointer to an image to blend. If set `fill_color is ignored`*/
lv_color_t color; /**< Fill color*/
lv_opa_t * mask; /**< NULL if ignored, or an alpha mask to apply on `blend_area`*/
lv_opa_t * mask_buf; /**< NULL if ignored, or an alpha mask to apply on `blend_area`*/
lv_draw_mask_res_t mask_res; /**< The result of the previous mask operation */
const lv_area_t * mask_area; /**< The area of `mask_buf` with absolute coordinates*/
lv_opa_t opa; /**< The overall opacity*/

View File

@@ -91,7 +91,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_c
uint32_t mask_buf_size = lv_area_get_size(&draw_area) > (uint32_t) hor_res ? hor_res : lv_area_get_size(&draw_area);
lv_color_t * src_buf_rgb = lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t));
lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size);
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_dsc.mask_area = &blend_area;
blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
blend_dsc.src_buf = src_buf_rgb;
@@ -150,7 +150,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_c
uint32_t mask_buf_size = lv_area_get_size(&draw_area) > hor_res ? hor_res : lv_area_get_size(&draw_area);
lv_color_t * src_buf_rgb = lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t));
lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size);
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_dsc.mask_area = &blend_area;
blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
blend_dsc.src_buf = src_buf_rgb;

View File

@@ -226,7 +226,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, c
lv_coord_t hor_res = lv_disp_get_hor_res(_lv_refr_get_disp_refreshing());
uint32_t mask_buf_size = box_w * box_h > hor_res ? hor_res : box_w * box_h;
lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size);
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
int32_t mask_p = 0;
lv_area_t fill_area;
@@ -412,7 +412,7 @@ static void draw_letter_subpx(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_
blend_dsc.blend_area = &map_area;
blend_dsc.mask_area = &map_area;
blend_dsc.src_buf = color_buf;
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_dsc.opa = opa;
blend_dsc.blend_mode = dsc->blend_mode;

View File

@@ -156,7 +156,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx
}
lv_opa_t * mask_buf = lv_mem_buf_get(blend_area_w);
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_dsc.mask_area = &blend_area;
int32_t h;
for(h = blend_area.y1; h <= y2; h++) {
@@ -237,7 +237,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx
blend_area.y2 = blend_area.y1;
lv_opa_t * mask_buf = lv_mem_buf_get(draw_area_w);
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_dsc.mask_area = &blend_area;
lv_coord_t dash_start = 0;
@@ -390,7 +390,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ct
blend_dsc.blend_area = &blend_area;
blend_dsc.color = dsc->color;
blend_dsc.opa = dsc->opa;
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_dsc.mask_area = &blend_area;
/*Fill the first row with 'color'*/

View File

@@ -156,7 +156,7 @@ static void draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, co
lv_memset_00(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t));
blend_dsc.blend_mode = dsc->blend_mode;
blend_dsc.color = dsc->bg_color;
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_dsc.opa = LV_OPA_COVER;
blend_dsc.blend_area = &blend_area;
blend_dsc.mask_area = &blend_area;
@@ -238,7 +238,7 @@ static void draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, co
blend_area.y1 = bg_coords.y1 + rout;
blend_area.y2 = bg_coords.y2 - rout;
blend_dsc.opa = opa;
blend_dsc.mask = NULL;
blend_dsc.mask_buf = NULL;
lv_draw_sw_blend(draw_ctx, &blend_dsc);
}
/*With gradient and/or mask draw line by line*/
@@ -484,7 +484,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
lv_memset_00(&blend_dsc, sizeof(blend_dsc));
blend_dsc.blend_area = &blend_area;
blend_dsc.mask_area = &blend_area;
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_dsc.color = dsc->shadow_color;
blend_dsc.opa = dsc->shadow_opa;
blend_dsc.blend_mode = dsc->blend_mode;
@@ -514,7 +514,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true;
else simple_sub = simple;
if(w > 0) {
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_area.x1 = clip_area_sub.x1;
blend_area.x2 = clip_area_sub.x2;
blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/
@@ -528,7 +528,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
}
else {
blend_dsc.mask = sh_buf_tmp;
blend_dsc.mask_buf = sh_buf_tmp;
}
lv_draw_sw_blend(draw_ctx, &blend_dsc);
sh_buf_tmp += corner_size;
@@ -557,7 +557,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
else simple_sub = simple;
if(w > 0) {
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
blend_area.x1 = clip_area_sub.x1;
blend_area.x2 = clip_area_sub.x2;
blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/
@@ -571,7 +571,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
}
else {
blend_dsc.mask = sh_buf_tmp;
blend_dsc.mask_buf = sh_buf_tmp;
}
lv_draw_sw_blend(draw_ctx, &blend_dsc);
sh_buf_tmp += corner_size;
@@ -598,10 +598,10 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
if(w > 0) {
if(!simple_sub) {
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
}
else {
blend_dsc.mask = NULL;
blend_dsc.mask_buf = NULL;
}
blend_area.x1 = clip_area_sub.x1;
blend_area.x2 = clip_area_sub.x2;
@@ -645,10 +645,10 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
else simple_sub = simple;
if(!simple_sub) {
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
}
else {
blend_dsc.mask = NULL;
blend_dsc.mask_buf = NULL;
}
blend_area.x1 = clip_area_sub.x1;
blend_area.x2 = clip_area_sub.x2;
@@ -699,7 +699,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
/*Do not mask if out of the bg*/
if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true;
else simple_sub = simple;
blend_dsc.mask = simple_sub ? sh_buf_tmp : mask_buf;
blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf;
if(w > 0) {
blend_area.x1 = clip_area_sub.x1;
@@ -756,7 +756,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
/*Do not mask if out of the bg*/
if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true;
else simple_sub = simple;
blend_dsc.mask = simple_sub ? sh_buf_tmp : mask_buf;
blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf;
if(w > 0) {
blend_area.x1 = clip_area_sub.x1;
blend_area.x2 = clip_area_sub.x2;
@@ -795,7 +795,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
/*Do not mask if out of the bg*/
if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true;
else simple_sub = simple;
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
if(w > 0) {
blend_area.x1 = clip_area_sub.x1;
@@ -811,7 +811,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
}
else {
blend_dsc.mask = sh_buf_tmp;
blend_dsc.mask_buf = sh_buf_tmp;
}
lv_draw_sw_blend(draw_ctx, &blend_dsc);
@@ -840,7 +840,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
/*Do not mask if out of the bg*/
if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true;
else simple_sub = simple;
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
if(w > 0) {
blend_area.x1 = clip_area_sub.x1;
blend_area.x2 = clip_area_sub.x2;
@@ -855,7 +855,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
}
else {
blend_dsc.mask = sh_buf_tmp;
blend_dsc.mask_buf = sh_buf_tmp;
}
lv_draw_sw_blend(draw_ctx, &blend_dsc);
sh_buf_tmp += corner_size;
@@ -868,7 +868,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
blend_area.x2 = shadow_area.x2 - corner_size;
blend_area.y1 = shadow_area.y1 + corner_size;
blend_area.y2 = shadow_area.y2 - corner_size;
blend_dsc.mask = mask_buf;
blend_dsc.mask_buf = mask_buf;
if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) &&
!_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) {
@@ -1126,7 +1126,7 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
lv_draw_sw_blend_dsc_t blend_dsc;
lv_memset_00(&blend_dsc, sizeof(blend_dsc));
blend_dsc.mask = lv_mem_buf_get(draw_area_w);;
blend_dsc.mask_buf = lv_mem_buf_get(draw_area_w);;
/*Create mask for the outer area*/
@@ -1172,8 +1172,8 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
blend_area.y1 = h;
blend_area.y2 = h;
lv_memset_ff(blend_dsc.mask, draw_area_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask, draw_area.x1, h, draw_area_w);
lv_memset_ff(blend_dsc.mask_buf, draw_area_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, draw_area.x1, h, draw_area_w);
lv_draw_sw_blend(draw_ctx, &blend_dsc);
}
@@ -1183,7 +1183,7 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
lv_draw_mask_free_param(&mask_rout_param);
lv_draw_mask_remove_id(mask_rout_id);
}
lv_mem_buf_release(blend_dsc.mask);
lv_mem_buf_release(blend_dsc.mask_buf);
return;
}
@@ -1245,8 +1245,8 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
lv_coord_t bottom_y = outer_area->y2 - h;
if(top_y < draw_area.y1 && bottom_y > draw_area.y2) continue; /*This line is clipped now*/
lv_memset_ff(blend_dsc.mask, draw_area_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask, blend_area.x1, top_y, draw_area_w);
lv_memset_ff(blend_dsc.mask_buf, draw_area_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, top_y, draw_area_w);
if(top_y >= draw_area.y1) {
blend_area.y1 = top_y;
@@ -1272,8 +1272,8 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
blend_area.y1 = h;
blend_area.y2 = h;
lv_memset_ff(blend_dsc.mask, blend_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask, blend_area.x1, h, blend_w);
lv_memset_ff(blend_dsc.mask_buf, blend_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, h, blend_w);
lv_draw_sw_blend(draw_ctx, &blend_dsc);
}
}
@@ -1283,8 +1283,8 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
blend_area.y1 = h;
blend_area.y2 = h;
lv_memset_ff(blend_dsc.mask, blend_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask, blend_area.x1, h, blend_w);
lv_memset_ff(blend_dsc.mask_buf, blend_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, h, blend_w);
lv_draw_sw_blend(draw_ctx, &blend_dsc);
}
}
@@ -1301,8 +1301,8 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
blend_area.y1 = h;
blend_area.y2 = h;
lv_memset_ff(blend_dsc.mask, blend_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask, blend_area.x1, h, blend_w);
lv_memset_ff(blend_dsc.mask_buf, blend_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, h, blend_w);
lv_draw_sw_blend(draw_ctx, &blend_dsc);
}
}
@@ -1312,8 +1312,8 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
blend_area.y1 = h;
blend_area.y2 = h;
lv_memset_ff(blend_dsc.mask, blend_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask, blend_area.x1, h, blend_w);
lv_memset_ff(blend_dsc.mask_buf, blend_w);
blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, h, blend_w);
lv_draw_sw_blend(draw_ctx, &blend_dsc);
}
}
@@ -1324,7 +1324,7 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area,
lv_draw_mask_remove_id(mask_rin_id);
lv_draw_mask_free_param(&mask_rout_param);
lv_draw_mask_remove_id(mask_rout_id);
lv_mem_buf_release(blend_dsc.mask);
lv_mem_buf_release(blend_dsc.mask_buf);
#else /*LV_DRAW_COMPLEX*/
LV_UNUSED(blend_mode);