[PATCH v2 4/8] drm/ast: Remove cursor double buffering

Thomas Zimmermann tzimmermann at suse.de
Thu Oct 13 11:29:19 UTC 2022


Update the cursor image via damage handling in-place. The cursor's
double buffering has no visible effect on the output, so remove it.

Done in preparation of switching ast to GEM SHMEM helpers. Removing
double buffering will allow us to use the same data structure for
primary and cursor plane.

Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe at redhat.com>
Tested-by: Jocelyn Falempe <jfalempe at redhat.com>
---
 drivers/gpu/drm/ast/ast_drv.h  | 12 ++---
 drivers/gpu/drm/ast/ast_mode.c | 83 +++++++++++++---------------------
 2 files changed, 35 insertions(+), 60 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 2e44b971c3a6..12294c74d0fc 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -96,8 +96,6 @@ enum ast_tx_chip {
 #define AST_HWC_SIZE		(AST_MAX_HWC_WIDTH * AST_MAX_HWC_HEIGHT * 2)
 #define AST_HWC_SIGNATURE_SIZE	32
 
-#define AST_DEFAULT_HWC_NUM	2
-
 /* define for signature structure */
 #define AST_HWC_SIGNATURE_CHECKSUM	0x00
 #define AST_HWC_SIGNATURE_SizeX		0x04
@@ -110,13 +108,9 @@ enum ast_tx_chip {
 struct ast_cursor_plane {
 	struct drm_plane base;
 
-	struct {
-		struct drm_gem_vram_object *gbo;
-		struct iosys_map map;
-		u64 off;
-	} hwc[AST_DEFAULT_HWC_NUM];
-
-	unsigned int next_hwc_index;
+	struct drm_gem_vram_object *gbo;
+	struct iosys_map map;
+	u64 off;
 };
 
 static inline struct ast_cursor_plane *
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index 059e4906507d..06ee79ec86f1 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -837,10 +837,8 @@ ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
 	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(new_state);
 	struct drm_framebuffer *fb = new_state->fb;
 	struct ast_private *ast = to_ast_private(plane->dev);
-	struct iosys_map dst_map =
-		ast_cursor_plane->hwc[ast_cursor_plane->next_hwc_index].map;
-	u64 dst_off =
-		ast_cursor_plane->hwc[ast_cursor_plane->next_hwc_index].off;
+	struct iosys_map dst_map = ast_cursor_plane->map;
+	u64 dst_off = ast_cursor_plane->off;
 	struct iosys_map src_map = shadow_plane_state->data[0];
 	unsigned int offset_x, offset_y;
 	u16 x, y;
@@ -860,13 +858,9 @@ ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
 
 	ast_update_cursor_image(dst, src, fb->width, fb->height);
 
-	if (new_state->fb != old_state->fb) {
+	if (new_state->fb != old_state->fb)
 		ast_set_cursor_base(ast, dst_off);
 
-		++ast_cursor_plane->next_hwc_index;
-		ast_cursor_plane->next_hwc_index %= ARRAY_SIZE(ast_cursor_plane->hwc);
-	}
-
 	/*
 	 * Update location in HWC signature and registers.
 	 */
@@ -917,17 +911,12 @@ static const struct drm_plane_helper_funcs ast_cursor_plane_helper_funcs = {
 static void ast_cursor_plane_destroy(struct drm_plane *plane)
 {
 	struct ast_cursor_plane *ast_cursor_plane = to_ast_cursor_plane(plane);
-	size_t i;
-	struct drm_gem_vram_object *gbo;
-	struct iosys_map map;
+	struct drm_gem_vram_object *gbo = ast_cursor_plane->gbo;
+	struct iosys_map map = ast_cursor_plane->map;
 
-	for (i = 0; i < ARRAY_SIZE(ast_cursor_plane->hwc); ++i) {
-		gbo = ast_cursor_plane->hwc[i].gbo;
-		map = ast_cursor_plane->hwc[i].map;
-		drm_gem_vram_vunmap(gbo, &map);
-		drm_gem_vram_unpin(gbo);
-		drm_gem_vram_put(gbo);
-	}
+	drm_gem_vram_vunmap(gbo, &map);
+	drm_gem_vram_unpin(gbo);
+	drm_gem_vram_put(gbo);
 
 	drm_plane_cleanup(plane);
 }
@@ -944,7 +933,7 @@ static int ast_cursor_plane_init(struct ast_private *ast)
 	struct drm_device *dev = &ast->base;
 	struct ast_cursor_plane *ast_cursor_plane = &ast->cursor_plane;
 	struct drm_plane *cursor_plane = &ast_cursor_plane->base;
-	size_t size, i;
+	size_t size;
 	struct drm_gem_vram_object *gbo;
 	struct iosys_map map;
 	int ret;
@@ -957,29 +946,27 @@ static int ast_cursor_plane_init(struct ast_private *ast)
 
 	size = roundup(AST_HWC_SIZE + AST_HWC_SIGNATURE_SIZE, PAGE_SIZE);
 
-	for (i = 0; i < ARRAY_SIZE(ast_cursor_plane->hwc); ++i) {
-		gbo = drm_gem_vram_create(dev, size, 0);
-		if (IS_ERR(gbo)) {
-			ret = PTR_ERR(gbo);
-			goto err_hwc;
-		}
-		ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM |
-					    DRM_GEM_VRAM_PL_FLAG_TOPDOWN);
-		if (ret)
-			goto err_drm_gem_vram_put;
-		ret = drm_gem_vram_vmap(gbo, &map);
-		if (ret)
-			goto err_drm_gem_vram_unpin;
-		off = drm_gem_vram_offset(gbo);
-		if (off < 0) {
-			ret = off;
-			goto err_drm_gem_vram_vunmap;
-		}
-		ast_cursor_plane->hwc[i].gbo = gbo;
-		ast_cursor_plane->hwc[i].map = map;
-		ast_cursor_plane->hwc[i].off = off;
+	gbo = drm_gem_vram_create(dev, size, 0);
+	if (IS_ERR(gbo))
+		return PTR_ERR(gbo);
+
+	ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM |
+				    DRM_GEM_VRAM_PL_FLAG_TOPDOWN);
+	if (ret)
+		goto err_drm_gem_vram_put;
+	ret = drm_gem_vram_vmap(gbo, &map);
+	if (ret)
+		goto err_drm_gem_vram_unpin;
+	off = drm_gem_vram_offset(gbo);
+	if (off < 0) {
+		ret = off;
+		goto err_drm_gem_vram_vunmap;
 	}
 
+	ast_cursor_plane->gbo = gbo;
+	ast_cursor_plane->map = map;
+	ast_cursor_plane->off = off;
+
 	/*
 	 * Create the cursor plane. The plane's destroy callback will release
 	 * the backing storages' BO memory.
@@ -992,24 +979,18 @@ static int ast_cursor_plane_init(struct ast_private *ast)
 				       NULL, DRM_PLANE_TYPE_CURSOR, NULL);
 	if (ret) {
 		drm_err(dev, "drm_universal_plane failed(): %d\n", ret);
-		goto err_hwc;
+		goto err_drm_gem_vram_vunmap;
 	}
 	drm_plane_helper_add(cursor_plane, &ast_cursor_plane_helper_funcs);
 
 	return 0;
 
-err_hwc:
-	while (i) {
-		--i;
-		gbo = ast_cursor_plane->hwc[i].gbo;
-		map = ast_cursor_plane->hwc[i].map;
 err_drm_gem_vram_vunmap:
-		drm_gem_vram_vunmap(gbo, &map);
+	drm_gem_vram_vunmap(gbo, &map);
 err_drm_gem_vram_unpin:
-		drm_gem_vram_unpin(gbo);
+	drm_gem_vram_unpin(gbo);
 err_drm_gem_vram_put:
-		drm_gem_vram_put(gbo);
-	}
+	drm_gem_vram_put(gbo);
 	return ret;
 }
 
-- 
2.37.3



More information about the dri-devel mailing list