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, with the exception of rotated screens that I couldn't get my
head wrapped around. On those, we revert to the old behavior and mark
the full screen as damaged on every update.

Signed-off-by: Alexander Graf <ag...@csgraf.de>
Reported-by: Da Xue <da@libre.computer>
---
 drivers/video/console_normal.c   | 10 ++++++++++
 drivers/video/console_rotate.c   | 18 ++++++++++++++++++
 drivers/video/console_truetype.c | 12 ++++++++++++
 3 files changed, 40 insertions(+)

diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c
index 04f022491e..5b5586fd3e 100644
--- a/drivers/video/console_normal.c
+++ b/drivers/video/console_normal.c
@@ -57,6 +57,9 @@ static int console_normal_set_row(struct udevice *dev, uint 
row, int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent, 0, VIDEO_FONT_HEIGHT * row, vid_priv->xsize,
+                    VIDEO_FONT_HEIGHT);
+
        return 0;
 }
 
@@ -76,6 +79,9 @@ static int console_normal_move_rows(struct udevice *dev, uint 
rowdst,
        if (ret)
                return ret;
 
+       video_damage(dev->parent, 0, VIDEO_FONT_HEIGHT * rowdst, 
vid_priv->xsize,
+                    VIDEO_FONT_HEIGHT * count);
+
        return 0;
 }
 
@@ -143,6 +149,10 @@ static int console_normal_putc_xy(struct udevice *dev, 
uint x_frac, uint y,
                }
                line += vid_priv->line_length;
        }
+
+       video_damage(dev->parent, VID_TO_PIXEL(x_frac), y, VIDEO_FONT_WIDTH,
+                    VIDEO_FONT_HEIGHT);
+
        ret = vidconsole_sync_copy(dev, start, line);
        if (ret)
                return ret;
diff --git a/drivers/video/console_rotate.c b/drivers/video/console_rotate.c
index 36c8d0609d..4d5084e8d1 100644
--- a/drivers/video/console_rotate.c
+++ b/drivers/video/console_rotate.c
@@ -57,6 +57,8 @@ static int console_set_row_1(struct udevice *dev, uint row, 
int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent, 0, 0, vid_priv->xsize, vid_priv->ysize);
+
        return 0;
 }
 
@@ -83,6 +85,8 @@ static int console_move_rows_1(struct udevice *dev, uint 
rowdst, uint rowsrc,
                dst += vid_priv->line_length;
        }
 
+       video_damage(dev->parent, 0, 0, vid_priv->xsize, vid_priv->ysize);
+
        return 0;
 }
 
@@ -150,6 +154,8 @@ static int console_putc_xy_1(struct udevice *dev, uint 
x_frac, uint y, char ch)
        if (ret)
                return ret;
 
+       video_damage(dev->parent, 0, 0, vid_priv->xsize, vid_priv->ysize);
+
        return VID_TO_POS(VIDEO_FONT_WIDTH);
 }
 
@@ -199,6 +205,8 @@ static int console_set_row_2(struct udevice *dev, uint row, 
int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent, 0, 0, vid_priv->xsize, vid_priv->ysize);
+
        return 0;
 }
 
@@ -218,6 +226,8 @@ static int console_move_rows_2(struct udevice *dev, uint 
rowdst, uint rowsrc,
        vidconsole_memmove(dev, dst, src,
                           VIDEO_FONT_HEIGHT * vid_priv->line_length * count);
 
+       video_damage(dev->parent, 0, 0, vid_priv->xsize, vid_priv->ysize);
+
        return 0;
 }
 
@@ -288,6 +298,8 @@ static int console_putc_xy_2(struct udevice *dev, uint 
x_frac, uint y, char ch)
        if (ret)
                return ret;
 
+       video_damage(dev->parent, 0, 0, vid_priv->xsize, vid_priv->ysize);
+
        return VID_TO_POS(VIDEO_FONT_WIDTH);
 }
 
@@ -335,6 +347,8 @@ static int console_set_row_3(struct udevice *dev, uint row, 
int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent, 0, 0, vid_priv->xsize, vid_priv->ysize);
+
        return 0;
 }
 
@@ -359,6 +373,8 @@ static int console_move_rows_3(struct udevice *dev, uint 
rowdst, uint rowsrc,
                dst += vid_priv->line_length;
        }
 
+       video_damage(dev->parent, 0, 0, vid_priv->xsize, vid_priv->ysize);
+
        return 0;
 }
 
@@ -424,6 +440,8 @@ static int console_putc_xy_3(struct udevice *dev, uint 
x_frac, uint y, char ch)
        if (ret)
                return ret;
 
+       video_damage(dev->parent, 0, 0, vid_priv->xsize, vid_priv->ysize);
+
        return VID_TO_POS(VIDEO_FONT_WIDTH);
 }
 
diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
index c04b449a6d..8fab28fd15 100644
--- a/drivers/video/console_truetype.c
+++ b/drivers/video/console_truetype.c
@@ -168,6 +168,9 @@ static int console_truetype_set_row(struct udevice *dev, 
uint row, int clr)
        if (ret)
                return ret;
 
+       video_damage(dev->parent, 0, priv->y_charsize * rowdst, vid_priv->xsize,
+                    priv->y_charsize);
+
        return 0;
 }
 
@@ -192,6 +195,9 @@ 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, priv->y_charsize * rowdst, vid_priv->xsize,
+                    priv->y_charsize * count);
+
        return 0;
 }
 
@@ -348,6 +354,9 @@ static int console_truetype_putc_xy(struct udevice *dev, 
uint x, uint y,
 
                line += vid_priv->line_length;
        }
+
+       video_damage(dev->parent, x, y, width, height);
+
        ret = vidconsole_sync_copy(dev, start, line);
        if (ret)
                return ret;
@@ -415,6 +424,9 @@ static int console_truetype_erase(struct udevice *dev, int 
xstart, int ystart,
                }
                line += vid_priv->line_length;
        }
+
+       video_damage(dev->parent, xstart, ystart, xend - xstart, yend - ystart);
+
        ret = vidconsole_sync_copy(dev, start, line);
        if (ret)
                return ret;
-- 
2.32.1 (Apple Git-133)

Reply via email to