All of lore.kernel.org
 help / color / mirror / Atom feed
From: Deepak Rawat <drawat@vmware.com>
To: dri-devel@lists.freedesktop.org,
	linux-graphics-maintainer@vmware.com, thellstrom@vmware.com,
	syeh@vmware.com
Cc: Deepak Rawat <drawat@vmware.com>
Subject: [PATCH 12/18] drm/vmwgfx: Implement SOU plane update for surface backed fb
Date: Thu, 27 Sep 2018 17:30:14 -0700	[thread overview]
Message-ID: <20180928003020.1737-12-drawat@vmware.com> (raw)
In-Reply-To: <20180928003020.1737-1-drawat@vmware.com>

Using the new interface implement SOU plane update for surface backed
fb.

Signed-off-by: Deepak Rawat <drawat@vmware.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.h  |   3 +
 drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 185 +++++++++++++++++++++++++++
 2 files changed, 188 insertions(+)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
index ed5a8f62bb2b..4c251767d019 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
@@ -147,10 +147,13 @@ struct vmw_du_update_plane {
  * struct vmw_du_update_plane_surface - closure structure for surface
  * @base: base closure structure.
  * @ctx: validation context.
+ * @cmd_start: FIFO command start address (used by SOU only).
  */
 struct vmw_du_update_plane_surface {
 	struct vmw_du_update_plane base;
 	struct vmw_validation_ctx *ctx;
+	/* This member is to handle special case SOU surface update */
+	void *cmd_start;
 };
 
 /**
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
index ad0de7f0cd60..9e5d48d03dd4 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
@@ -499,6 +499,191 @@ vmw_sou_primary_plane_prepare_fb(struct drm_plane *plane,
 	return vmw_bo_pin_in_vram(dev_priv, vps->bo, true);
 }
 
+static int vmw_sou_surface_prepare(struct vmw_du_update_plane *update)
+{
+	struct vmw_du_update_plane_surface *srf_update;
+	struct vmw_framebuffer_surface *vfbs;
+
+	srf_update = container_of(update, typeof(*srf_update), base);
+	vfbs = container_of(update->vfb, typeof(*vfbs), base);
+
+	return vmw_kms_helper_resource_prepare(&vfbs->surface->res, true,
+					       srf_update->ctx);
+}
+
+static uint32_t vmw_sou_surface_fifo_size(struct vmw_du_update_plane *update,
+					  uint32_t num_hits)
+{
+	return sizeof(struct vmw_kms_sou_dirty_cmd) + sizeof(SVGASignedRect) *
+		num_hits;
+}
+
+static uint32_t vmw_sou_surface_post_prepare(struct vmw_du_update_plane *update,
+					     void *cmd)
+{
+	struct vmw_du_update_plane_surface *srf_update;
+
+	srf_update = container_of(update, typeof(*srf_update), base);
+
+	/*
+	 * SOU SVGA_3D_CMD_BLIT_SURFACE_TO_SCREEN is special in the sense that
+	 * it bounding box is filled before iterating over all the clips. So
+	 * store the FIFO start address and revisit to fill the details.
+	 */
+	srf_update->cmd_start = cmd;
+
+	return 0;
+}
+
+static uint32_t vmw_sou_surface_pre_clip(struct vmw_du_update_plane *update,
+					 void *cmd, uint32_t num_hits)
+{
+	struct vmw_kms_sou_dirty_cmd *blit = cmd;
+	struct vmw_framebuffer_surface *vfbs;
+
+	vfbs = container_of(update->vfb, typeof(*vfbs), base);
+
+	blit->header.id = SVGA_3D_CMD_BLIT_SURFACE_TO_SCREEN;
+	blit->header.size = sizeof(blit->body) + sizeof(SVGASignedRect) *
+		num_hits;
+
+	blit->body.srcImage.sid = vfbs->surface->res.id;
+	blit->body.destScreenId = update->du->unit;
+
+	/* Update the source and destination bounding box later in post_clip */
+	blit->body.srcRect.left = 0;
+	blit->body.srcRect.top = 0;
+	blit->body.srcRect.right = 0;
+	blit->body.srcRect.bottom = 0;
+
+	blit->body.destRect.left = 0;
+	blit->body.destRect.top = 0;
+	blit->body.destRect.right = 0;
+	blit->body.destRect.bottom = 0;
+
+	return sizeof(*blit);
+}
+
+static uint32_t vmw_sou_surface_clip_rect(struct vmw_du_update_plane *update,
+					  void *cmd, struct drm_rect *clip,
+					  uint32_t src_x, uint32_t src_y)
+{
+	SVGASignedRect *rect = cmd;
+
+	/*
+	 * rects are relative to dest bounding box rect on screen object, so
+	 * translate to it later in post_clip
+	 */
+	rect->left = clip->x1;
+	rect->top = clip->y1;
+	rect->right = clip->x2;
+	rect->bottom = clip->y2;
+
+	return sizeof(*rect);
+}
+
+static uint32_t vmw_sou_surface_post_clip(struct vmw_du_update_plane *update,
+					  void *cmd, struct drm_rect *bb)
+{
+	struct vmw_du_update_plane_surface *srf_update;
+	struct drm_plane_state *state = update->plane->state;
+	struct drm_rect src_bb;
+	struct vmw_kms_sou_dirty_cmd *blit;
+	SVGASignedRect *rect;
+	uint32_t num_hits;
+	int translate_src_x;
+	int translate_src_y;
+	int i;
+
+	srf_update = container_of(update, typeof(*srf_update), base);
+
+	blit = srf_update->cmd_start;
+	rect = (SVGASignedRect *)&blit[1];
+
+	num_hits = (blit->header.size - sizeof(blit->body))/
+		sizeof(SVGASignedRect);
+
+	src_bb = *bb;
+
+	/* To translate bb back to fb src coord */
+	translate_src_x = (state->src_x >> 16) - state->crtc_x;
+	translate_src_y = (state->src_y >> 16) - state->crtc_y;
+
+	drm_rect_translate(&src_bb, translate_src_x, translate_src_y);
+
+	blit->body.srcRect.left = src_bb.x1;
+	blit->body.srcRect.top = src_bb.y1;
+	blit->body.srcRect.right = src_bb.x2;
+	blit->body.srcRect.bottom = src_bb.y2;
+
+	blit->body.destRect.left = bb->x1;
+	blit->body.destRect.top = bb->y1;
+	blit->body.destRect.right = bb->x2;
+	blit->body.destRect.bottom = bb->y2;
+
+	/* rects are relative to dest bb rect */
+	for (i = 0; i < num_hits; i++) {
+		rect->left -= bb->x1;
+		rect->top -= bb->y1;
+		rect->right -= bb->x1;
+		rect->bottom -= bb->y1;
+		rect++;
+	}
+
+	return 0;
+}
+
+static void vmw_sou_surface_finish(struct vmw_du_update_plane *update)
+{
+	struct vmw_du_update_plane_surface *srf_update =
+		container_of(update, typeof(*srf_update), base);
+
+	vmw_kms_helper_resource_finish(srf_update->ctx, update->out_fence);
+}
+
+/**
+ * vmw_sou_plane_update_surface - Update display unit for surface backed fb.
+ * @dev_priv: Device private.
+ * @plane: Plane state.
+ * @old_state: Old plane state.
+ * @vfb: Framebuffer which is blitted to display unit
+ * @out_fence: If non-NULL, will return a ref-counted pointer to vmw_fence_obj.
+ *             The returned fence pointer may be NULL in which case the device
+ *             has already synchronized.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+static int vmw_sou_plane_update_surface(struct vmw_private *dev_priv,
+					struct drm_plane *plane,
+					struct drm_plane_state *old_state,
+					struct vmw_framebuffer *vfb,
+					struct vmw_fence_obj **out_fence)
+{
+	struct vmw_du_update_plane_surface srf_update;
+	struct vmw_validation_ctx ctx;
+
+	memset(&srf_update, 0, sizeof(struct vmw_du_update_plane_surface));
+	srf_update.base.plane = plane;
+	srf_update.base.old_state = old_state;
+	srf_update.base.dev_priv = dev_priv;
+	srf_update.base.du = vmw_crtc_to_du(plane->state->crtc);
+	srf_update.base.vfb = vfb;
+	srf_update.base.out_fence = out_fence;
+
+	srf_update.ctx = &ctx;
+
+	srf_update.base.prepare = vmw_sou_surface_prepare;
+	srf_update.base.calc_fifo_size = vmw_sou_surface_fifo_size;
+	srf_update.base.post_prepare = vmw_sou_surface_post_prepare;
+	srf_update.base.pre_clip = vmw_sou_surface_pre_clip;
+	srf_update.base.clip = vmw_sou_surface_clip_rect;
+	srf_update.base.post_clip = vmw_sou_surface_post_clip;
+	srf_update.base.finish = vmw_sou_surface_finish;
+	/* Nothing special to do for revert */
+	srf_update.base.revert = vmw_sou_surface_finish;
+
+	return vmw_du_helper_plane_update(&srf_update.base);
+}
 
 static void
 vmw_sou_primary_plane_atomic_update(struct drm_plane *plane,
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2018-09-28  0:30 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-28  0:30 [PATCH 01/18] drm: Add a new plane property to send damage during plane update Deepak Rawat
2018-09-28  0:30 ` [PATCH 02/18] drm: Add a new helper to validate damage during atomic_check Deepak Rawat
2018-09-28  0:30 ` [PATCH 03/18] drm: Add helper iterator functions for plane fb_damage_clips blob Deepak Rawat
2018-09-28  0:30 ` [PATCH 04/18] drm/selftest: Add drm damage helper selftest Deepak Rawat
2018-10-01  8:12   ` Daniel Vetter
2018-10-09 22:43     ` Deepak Singh Rawat
2018-10-11 16:17       ` Daniel Vetter
2018-09-28  0:30 ` [PATCH 05/18] drm: Add helper to implement legacy dirtyfb Deepak Rawat
2018-10-01  8:08   ` Daniel Vetter
2018-10-02 16:30     ` Deepak Singh Rawat
2018-10-03  8:45       ` Daniel Vetter
2018-09-28  0:30 ` [PATCH 06/18] drm/vmwgfx: Add a new interface for plane update on a display unit Deepak Rawat
2018-09-28  0:30 ` [PATCH 07/18] drm/vmwgfx: Implement STDU plane update for surface backed fb Deepak Rawat
2018-09-28  0:30 ` [PATCH 08/18] drm/vmwgfx: Implement STDU plane update for BO " Deepak Rawat
2018-09-28  0:30 ` [PATCH 09/18] drm/vmwgfx: Use the new interface for STDU plane update Deepak Rawat
2018-09-28  0:30 ` [PATCH 10/18] drm/vmwgfx: Updated comment for stdu " Deepak Rawat
2018-09-28  0:30 ` [PATCH 11/18] drm/vmwgfx: Enable FB_DAMAGE_CLIPS property for STDU primary plane Deepak Rawat
2018-09-28  0:30 ` Deepak Rawat [this message]
2018-09-28  0:30 ` [PATCH 13/18] drm/vmwgfx: Implement SOU plane update for BO backed fb Deepak Rawat
2018-09-28  0:30 ` [PATCH 14/18] drm/vmwgfx: Use the new interface for SOU plane update Deepak Rawat
2018-09-28  0:30 ` [PATCH 15/18] drm/vmwgfx: Update comments for sou plane update function Deepak Rawat
2018-09-28  0:30 ` [PATCH 16/18] drm/vmwgfx: Enable FB_DAMAGE_CLIPS property for SOU primary plane Deepak Rawat
2018-09-28  0:30 ` [PATCH 17/18] drm/vmwgfx: Use atomic helper function for dirty fb IOCTL Deepak Rawat
2018-09-28  0:30 ` [PATCH 18/18] drm/vmwgfx: Don't clear mode::type anymore Deepak Rawat

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180928003020.1737-12-drawat@vmware.com \
    --to=drawat@vmware.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-graphics-maintainer@vmware.com \
    --cc=syeh@vmware.com \
    --cc=thellstrom@vmware.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.