From: Shixiong Ou <[email protected]>
drm_log_draw_new_line() calls drm_log_clear_line() and drm_log_draw_line(),
which independently call drm_client_buffer_vmap_local(),
drm_client_buffer_vunmap_local(), and drm_client_buffer_flush(). For each
call to drm_log_draw_new_line(), this results in 2 vmap/vunmap pairs and
2 flush calls, even though vmap_local maps the entire framebuffer
each time.
Refactor drm_log_clear_line() and drm_log_draw_line() to accept a
pre-mapped iosys_map by value, removing the per-line vmap/vunmap/flush
calls. Move the single vmap/vunmap pair and flush up to
drm_log_draw_new_line(), which now maps once before clearing and
drawing, then issues a single flush after unmapping.
Also remove the now-unused drm_rect from both functions.
Signed-off-by: Shixiong Ou <[email protected]>
---
v1->v2:
Remove unused drm_rect from drm_log_clear_line() and
drm_log_draw_line().
diff --git a/drivers/gpu/drm/clients/drm_log.c b/drivers/gpu/drm/clients/drm_log.c
index ac10c978f917..52563e2a1c45 100644
--- a/drivers/gpu/drm/clients/drm_log.c
+++ b/drivers/gpu/drm/clients/drm_log.c
@@ -94,37 +94,28 @@ static void drm_log_blit(struct iosys_map *dst, unsigned int dst_pitch,
}
}
-static void drm_log_clear_line(struct drm_log_scanout *scanout, u32 line)
+static void drm_log_clear_line(struct drm_log_scanout *scanout, u32 line,
+ struct iosys_map map)
{
struct drm_framebuffer *fb = scanout->buffer->fb;
unsigned long height = scanout->scaled_font_h;
- struct iosys_map map;
- struct drm_rect r = DRM_RECT_INIT(0, line * height, fb->width, height);
- if (drm_client_buffer_vmap_local(scanout->buffer, &map))
- return;
- iosys_map_memset(&map, r.y1 * fb->pitches[0], 0, height * fb->pitches[0]);
- drm_client_buffer_vunmap_local(scanout->buffer);
- drm_client_buffer_flush(scanout->buffer, &r);
+ iosys_map_memset(&map, line * height * fb->pitches[0], 0, height * fb->pitches[0]);
}
static void drm_log_draw_line(struct drm_log_scanout *scanout, const char *s,
- unsigned int len, unsigned int prefix_len)
+ unsigned int len, unsigned int prefix_len,
+ struct iosys_map map)
{
struct drm_framebuffer *fb = scanout->buffer->fb;
- struct iosys_map map;
const struct font_desc *font = scanout->font;
size_t font_pitch = DIV_ROUND_UP(font->width, 8);
const u8 *src;
u32 px_width = fb->format->cpp[0];
- struct drm_rect r = DRM_RECT_INIT(0, scanout->line * scanout->scaled_font_h,
- fb->width, (scanout->line + 1) * scanout->scaled_font_h);
u32 i;
- if (drm_client_buffer_vmap_local(scanout->buffer, &map))
- return;
+ iosys_map_incr(&map, scanout->line * scanout->scaled_font_h * fb->pitches[0]);
- iosys_map_incr(&map, r.y1 * fb->pitches[0]);
for (i = 0; i < len && i < scanout->columns; i++) {
u32 color = (i < prefix_len) ? scanout->prefix_color : scanout->front_color;
src = font_data_glyph_buf(font->data, font->width, font->height,
@@ -139,21 +130,40 @@ static void drm_log_draw_line(struct drm_log_scanout *scanout, const char *s,
scanout->line++;
if (scanout->line >= scanout->rows)
scanout->line = 0;
- drm_client_buffer_vunmap_local(scanout->buffer);
- drm_client_buffer_flush(scanout->buffer, &r);
}
static void drm_log_draw_new_line(struct drm_log_scanout *scanout,
- const char *s, unsigned int len, unsigned int prefix_len)
+ const char *s, unsigned int len,
+ unsigned int prefix_len)
{
+ struct iosys_map map;
+ struct drm_framebuffer *fb = scanout->buffer->fb;
+ u32 height = scanout->scaled_font_h;
+ u32 line = scanout->line;
+ u32 y2;
+ struct drm_rect dirty;
+
+ if (drm_client_buffer_vmap_local(scanout->buffer, &map))
+ return;
+
if (scanout->line == 0) {
- drm_log_clear_line(scanout, 0);
- drm_log_clear_line(scanout, 1);
- drm_log_clear_line(scanout, 2);
- } else if (scanout->line + 2 < scanout->rows)
- drm_log_clear_line(scanout, scanout->line + 2);
+ drm_log_clear_line(scanout, 0, map);
+ drm_log_clear_line(scanout, 1, map);
+ drm_log_clear_line(scanout, 2, map);
+ y2 = min(3, scanout->rows) * height;
+ } else if (scanout->line + 2 < scanout->rows) {
+ drm_log_clear_line(scanout, scanout->line + 2, map);
+ y2 = (line + 3) * height;
+ } else {
+ y2 = (line + 1) * height;
+ }
+
+ drm_log_draw_line(scanout, s, len, prefix_len, map);
+
+ drm_client_buffer_vunmap_local(scanout->buffer);
- drm_log_draw_line(scanout, s, len, prefix_len);
+ dirty = DRM_RECT_INIT(0, line * height, fb->width, y2 - line * height);
+ drm_client_buffer_flush(scanout->buffer, &dirty);
}
/*
--
2.25.1
No virus found
Checked by Hillstone Network AntiVirus
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.