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 13/18] drm/vmwgfx: Implement SOU plane update for BO backed fb
Date: Thu, 27 Sep 2018 17:30:15 -0700	[thread overview]
Message-ID: <20180928003020.1737-13-drawat@vmware.com> (raw)
In-Reply-To: <20180928003020.1737-1-drawat@vmware.com>

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

Signed-off-by: Deepak Rawat <drawat@vmware.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 132 +++++++++++++++++++++++++++
 1 file changed, 132 insertions(+)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
index 9e5d48d03dd4..402df9a62ef0 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
@@ -76,6 +76,11 @@ struct vmw_kms_sou_dirty_cmd {
 	SVGA3dCmdBlitSurfaceToScreen body;
 };
 
+struct vmw_kms_sou_define_gmrfb {
+	uint32_t header;
+	SVGAFifoCmdDefineGMRFB body;
+};
+
 /**
  * Display unit using screen objects.
  */
@@ -499,6 +504,133 @@ 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_bo_prepare(struct vmw_du_update_plane *update)
+{
+	struct vmw_du_update_plane_buffer *bo_update;
+	struct vmw_framebuffer_bo *vfbbo;
+
+	bo_update = container_of(update, typeof(*bo_update), base);
+	vfbbo = container_of(update->vfb, typeof(*vfbbo), base);
+
+	return vmw_kms_helper_buffer_prepare(update->dev_priv, vfbbo->buffer,
+					     true, false, bo_update->cpu_blit);
+}
+
+static uint32_t vmw_sou_bo_fifo_size(struct vmw_du_update_plane *update,
+				     uint32_t num_hits)
+{
+	return sizeof(struct vmw_kms_sou_define_gmrfb) +
+		sizeof(struct vmw_kms_sou_bo_blit) * num_hits;
+}
+
+static uint32_t vmw_sou_bo_define_gmrfb(struct vmw_du_update_plane *update,
+					void *cmd)
+{
+	struct vmw_framebuffer_bo *vfbbo =
+		container_of(update->vfb, typeof(*vfbbo), base);
+	struct vmw_kms_sou_define_gmrfb *gmr = cmd;
+	int depth = update->vfb->base.format->depth;
+
+	/* Emulate RGBA support, contrary to svga_reg.h this is not
+	 * supported by hosts. This is only a problem if we are reading
+	 * this value later and expecting what we uploaded back.
+	 */
+	if (depth == 32)
+		depth = 24;
+
+	gmr->header = SVGA_CMD_DEFINE_GMRFB;
+
+	gmr->body.format.bitsPerPixel = update->vfb->base.format->cpp[0] * 8;
+	gmr->body.format.colorDepth = depth;
+	gmr->body.format.reserved = 0;
+	gmr->body.bytesPerLine = update->vfb->base.pitches[0];
+	vmw_bo_get_guest_ptr(&vfbbo->buffer->base, &gmr->body.ptr);
+
+	return sizeof(*gmr);
+}
+
+static uint32_t vmw_sou_bo_populate_clip(struct vmw_du_update_plane  *update,
+					 void *cmd, struct drm_rect *clip,
+					 uint32_t fb_x, uint32_t fb_y)
+{
+	struct vmw_kms_sou_bo_blit *blit = cmd;
+
+	blit->header = SVGA_CMD_BLIT_GMRFB_TO_SCREEN;
+	blit->body.destScreenId = update->du->unit;
+	blit->body.srcOrigin.x = fb_x;
+	blit->body.srcOrigin.y = fb_y;
+	blit->body.destRect.left = clip->x1;
+	blit->body.destRect.top = clip->y1;
+	blit->body.destRect.right = clip->x2;
+	blit->body.destRect.bottom = clip->y2;
+
+	return sizeof(*blit);
+}
+
+static uint32_t vmw_stud_bo_post_clip(struct vmw_du_update_plane  *update,
+				      void *cmd, struct drm_rect *bb)
+{
+	return 0;
+}
+
+static void vmw_sou_bo_finish(struct vmw_du_update_plane *update)
+{
+	struct vmw_framebuffer_bo *vfbbo =
+		container_of(update->vfb, typeof(*vfbbo), base);
+
+	vmw_kms_helper_buffer_finish(update->dev_priv, NULL, vfbbo->buffer,
+				     update->out_fence, NULL);
+}
+
+static void vmw_sou_bo_revert(struct vmw_du_update_plane *update)
+{
+	struct vmw_framebuffer_bo *vfbbo =
+		container_of(update->vfb, typeof(*vfbbo), base);
+
+	vmw_kms_helper_buffer_revert(vfbbo->buffer);
+}
+
+/**
+ * vmw_sou_plane_update_bo - Update display unit for bo 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.
+ *
+ * RETURNS: 0 on success or a negative error code on failure.
+ */
+static int vmw_sou_plane_update_bo(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_buffer bo_update;
+
+	memset(&bo_update, 0, sizeof(struct vmw_du_update_plane_buffer));
+	bo_update.base.plane = plane;
+	bo_update.base.old_state = old_state;
+	bo_update.base.dev_priv = dev_priv;
+	bo_update.base.du = vmw_crtc_to_du(plane->state->crtc);
+	bo_update.base.vfb = vfb;
+	bo_update.base.out_fence = out_fence;
+
+	bo_update.cpu_blit = false;
+
+	bo_update.base.prepare = vmw_sou_bo_prepare;
+	bo_update.base.calc_fifo_size = vmw_sou_bo_fifo_size;
+	bo_update.base.post_prepare = vmw_sou_bo_define_gmrfb;
+	bo_update.base.clip = vmw_sou_bo_populate_clip;
+	bo_update.base.post_clip = vmw_stud_bo_post_clip;
+	bo_update.base.finish = vmw_sou_bo_finish;
+	bo_update.base.revert = vmw_sou_bo_revert;
+
+	return vmw_du_helper_plane_update(&bo_update.base);
+}
+
 static int vmw_sou_surface_prepare(struct vmw_du_update_plane *update)
 {
 	struct vmw_du_update_plane_surface *srf_update;
-- 
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 ` [PATCH 12/18] drm/vmwgfx: Implement SOU plane update for surface backed fb Deepak Rawat
2018-09-28  0:30 ` Deepak Rawat [this message]
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-13-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.