Skip to content

Commit 2f5544f

Browse files
deepak-rawatthomashvmw
authored andcommitted
drm/vmwgfx: Use atomic helper function for dirty fb IOCTL
USe new atomic helper for dirty fb IOCTL which make use of damage interface. Note that this is only done for STDU and SOU, for legacy display unit still using old interface. Signed-off-by: Deepak Rawat <drawat@vmware.com> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
1 parent 61c2138 commit 2f5544f

File tree

1 file changed

+18
-64
lines changed

1 file changed

+18
-64
lines changed

drivers/gpu/drm/vmwgfx/vmwgfx_kms.c

Lines changed: 18 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -847,58 +847,6 @@ static void vmw_framebuffer_surface_destroy(struct drm_framebuffer *framebuffer)
847847
kfree(vfbs);
848848
}
849849

850-
static int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
851-
struct drm_file *file_priv,
852-
unsigned flags, unsigned color,
853-
struct drm_clip_rect *clips,
854-
unsigned num_clips)
855-
{
856-
struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
857-
struct vmw_framebuffer_surface *vfbs =
858-
vmw_framebuffer_to_vfbs(framebuffer);
859-
struct drm_clip_rect norect;
860-
int ret, inc = 1;
861-
862-
/* Legacy Display Unit does not support 3D */
863-
if (dev_priv->active_display_unit == vmw_du_legacy)
864-
return -EINVAL;
865-
866-
drm_modeset_lock_all(dev_priv->dev);
867-
868-
ret = ttm_read_lock(&dev_priv->reservation_sem, true);
869-
if (unlikely(ret != 0)) {
870-
drm_modeset_unlock_all(dev_priv->dev);
871-
return ret;
872-
}
873-
874-
if (!num_clips) {
875-
num_clips = 1;
876-
clips = &norect;
877-
norect.x1 = norect.y1 = 0;
878-
norect.x2 = framebuffer->width;
879-
norect.y2 = framebuffer->height;
880-
} else if (flags & DRM_MODE_FB_DIRTY_ANNOTATE_COPY) {
881-
num_clips /= 2;
882-
inc = 2; /* skip source rects */
883-
}
884-
885-
if (dev_priv->active_display_unit == vmw_du_screen_object)
886-
ret = vmw_kms_sou_do_surface_dirty(dev_priv, &vfbs->base,
887-
clips, NULL, NULL, 0, 0,
888-
num_clips, inc, NULL, NULL);
889-
else
890-
ret = vmw_kms_stdu_surface_dirty(dev_priv, &vfbs->base,
891-
clips, NULL, NULL, 0, 0,
892-
num_clips, inc, NULL, NULL);
893-
894-
vmw_fifo_flush(dev_priv, false);
895-
ttm_read_unlock(&dev_priv->reservation_sem);
896-
897-
drm_modeset_unlock_all(dev_priv->dev);
898-
899-
return 0;
900-
}
901-
902850
/**
903851
* vmw_kms_readback - Perform a readback from the screen system to
904852
* a buffer-object backed framebuffer.
@@ -942,7 +890,7 @@ int vmw_kms_readback(struct vmw_private *dev_priv,
942890

943891
static const struct drm_framebuffer_funcs vmw_framebuffer_surface_funcs = {
944892
.destroy = vmw_framebuffer_surface_destroy,
945-
.dirty = vmw_framebuffer_surface_dirty,
893+
.dirty = drm_atomic_helper_dirtyfb,
946894
};
947895

948896
static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
@@ -1085,16 +1033,6 @@ static int vmw_framebuffer_bo_dirty(struct drm_framebuffer *framebuffer,
10851033
}
10861034

10871035
switch (dev_priv->active_display_unit) {
1088-
case vmw_du_screen_target:
1089-
ret = vmw_kms_stdu_dma(dev_priv, NULL, &vfbd->base, NULL,
1090-
clips, NULL, num_clips, increment,
1091-
true, true, NULL);
1092-
break;
1093-
case vmw_du_screen_object:
1094-
ret = vmw_kms_sou_do_bo_dirty(dev_priv, &vfbd->base,
1095-
clips, NULL, num_clips,
1096-
increment, true, NULL, NULL);
1097-
break;
10981036
case vmw_du_legacy:
10991037
ret = vmw_kms_ldu_do_bo_dirty(dev_priv, &vfbd->base, 0, 0,
11001038
clips, num_clips, increment);
@@ -1113,9 +1051,25 @@ static int vmw_framebuffer_bo_dirty(struct drm_framebuffer *framebuffer,
11131051
return ret;
11141052
}
11151053

1054+
static int vmw_framebuffer_bo_dirty_ext(struct drm_framebuffer *framebuffer,
1055+
struct drm_file *file_priv,
1056+
unsigned int flags, unsigned int color,
1057+
struct drm_clip_rect *clips,
1058+
unsigned int num_clips)
1059+
{
1060+
struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
1061+
1062+
if (dev_priv->active_display_unit == vmw_du_legacy)
1063+
return vmw_framebuffer_bo_dirty(framebuffer, file_priv, flags,
1064+
color, clips, num_clips);
1065+
1066+
return drm_atomic_helper_dirtyfb(framebuffer, file_priv, flags, color,
1067+
clips, num_clips);
1068+
}
1069+
11161070
static const struct drm_framebuffer_funcs vmw_framebuffer_bo_funcs = {
11171071
.destroy = vmw_framebuffer_bo_destroy,
1118-
.dirty = vmw_framebuffer_bo_dirty,
1072+
.dirty = vmw_framebuffer_bo_dirty_ext,
11191073
};
11201074

11211075
/**

0 commit comments

Comments
 (0)