vidconsole: Add damage notifications to all vidconsole drivers
authorAlexander Graf <agraf@csgraf.de>
Thu, 9 Jun 2022 22:59:17 +0000 (00:59 +0200)
committerSimon Glass <sjg@chromium.org>
Thu, 1 May 2025 10:30:53 +0000 (04:30 -0600)
Now that we have a damage tracking API, let's populate damage done by
vidconsole drivers. We try to declare as little memory as damaged as
possible.

Signed-off-by: Alexander Graf <agraf@csgraf.de>
Reported-by: Da Xue <da@libre.computer>
[Alper: Rebase for met->baseline, fontdata->height/width, make rotated
        console_putc_xy() damages pass tests, edit patch message]
Co-developed-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Link: https://lore.kernel.org/u-boot/20230821135111.3558478-7-alpernebiyasak@gmail.com/
drivers/video/console_normal.c
drivers/video/console_rotate.c
drivers/video/console_truetype.c

index 6f4194a..51ac8cc 100644 (file)
@@ -39,6 +39,12 @@ static int console_set_row(struct udevice *dev, uint row, int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    0,
+                    fontdata->height * row,
+                    vid_priv->xsize,
+                    fontdata->height);
+
        return 0;
 }
 
@@ -60,6 +66,12 @@ static int console_move_rows(struct udevice *dev, uint rowdst,
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    0,
+                    fontdata->height * rowdst,
+                    vid_priv->xsize,
+                    fontdata->height * count);
+
        return 0;
 }
 
@@ -91,6 +103,12 @@ static int console_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp)
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    x,
+                    y,
+                    fontdata->width,
+                    fontdata->height);
+
        ret = vidconsole_sync_copy(dev, start, line);
        if (ret)
                return ret;
index a3f8c63..f11dc3a 100644 (file)
@@ -36,6 +36,12 @@ static int console_set_row_1(struct udevice *dev, uint row, int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    vid_priv->xsize - ((row + 1) * fontdata->height),
+                    0,
+                    fontdata->height,
+                    vid_priv->ysize);
+
        return 0;
 }
 
@@ -64,6 +70,12 @@ static int console_move_rows_1(struct udevice *dev, uint rowdst, uint rowsrc,
                dst += vid_priv->line_length;
        }
 
+       video_damage(dev->parent,
+                    vid_priv->xsize - ((rowdst + count) * fontdata->height),
+                    0,
+                    count * fontdata->height,
+                    vid_priv->ysize);
+
        return 0;
 }
 
@@ -97,6 +109,12 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, int cp)
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    vid_priv->xsize - y - fontdata->height,
+                    linenum - 1,
+                    fontdata->height,
+                    fontdata->width);
+
        return VID_TO_POS(fontdata->width);
 }
 
@@ -121,6 +139,12 @@ static int console_set_row_2(struct udevice *dev, uint row, int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    0,
+                    vid_priv->ysize - (row + 1) * fontdata->height,
+                    vid_priv->xsize,
+                    fontdata->height);
+
        return 0;
 }
 
@@ -142,6 +166,12 @@ static int console_move_rows_2(struct udevice *dev, uint rowdst, uint rowsrc,
        vidconsole_memmove(dev, dst, src,
                           fontdata->height * vid_priv->line_length * count);
 
+       video_damage(dev->parent,
+                    0,
+                    vid_priv->ysize - (rowdst + count) * fontdata->height,
+                    vid_priv->xsize,
+                    count * fontdata->height);
+
        return 0;
 }
 
@@ -175,6 +205,12 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, int cp)
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    x - fontdata->width + 1,
+                    linenum - fontdata->height + 1,
+                    fontdata->width,
+                    fontdata->height);
+
        return VID_TO_POS(fontdata->width);
 }
 
@@ -199,6 +235,12 @@ static int console_set_row_3(struct udevice *dev, uint row, int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    row * fontdata->height,
+                    0,
+                    fontdata->height,
+                    vid_priv->ysize);
+
        return 0;
 }
 
@@ -225,6 +267,12 @@ static int console_move_rows_3(struct udevice *dev, uint rowdst, uint rowsrc,
                dst += vid_priv->line_length;
        }
 
+       video_damage(dev->parent,
+                    rowdst * fontdata->height,
+                    0,
+                    count * fontdata->height,
+                    vid_priv->ysize);
+
        return 0;
 }
 
@@ -257,6 +305,12 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, int cp)
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    y,
+                    linenum - fontdata->width + 1,
+                    fontdata->height,
+                    fontdata->width);
+
        return VID_TO_POS(fontdata->width);
 }
 
index 17a2981..073ddcf 100644 (file)
@@ -190,6 +190,7 @@ struct console_tt_store {
 static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
 {
        struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
+       struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
        struct console_tt_priv *priv = dev_get_priv(dev);
        struct console_tt_metrics *met = priv->cur_met;
        void *end, *line;
@@ -233,6 +234,12 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent,
+                    0,
+                    vc_priv->y_charsize * row,
+                    vid_priv->xsize,
+                    vc_priv->y_charsize);
+
        return 0;
 }
 
@@ -240,6 +247,7 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst,
                                     uint rowsrc, uint count)
 {
        struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
+       struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
        struct console_tt_priv *priv = dev_get_priv(dev);
        struct console_tt_metrics *met = priv->cur_met;
        void *dst;
@@ -258,6 +266,12 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst,
        for (i = 0; i < priv->pos_ptr; i++)
                priv->pos[i].ypos -= diff;
 
+       video_damage(dev->parent,
+                    0,
+                    vc_priv->y_charsize * rowdst,
+                    vid_priv->xsize,
+                    vc_priv->y_charsize * count);
+
        return 0;
 }
 
@@ -418,6 +432,13 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
 
                line += vid_priv->line_length;
        }
+
+       video_damage(dev->parent,
+                    VID_TO_PIXEL(x) + xoff,
+                    y + met->baseline + yoff,
+                    width,
+                    height);
+
        ret = vidconsole_sync_copy(dev, start, line);
        if (ret)
                return ret;