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>
This commit is contained in:
parent
61c21387c8
commit
2f5544ff03
|
@ -847,58 +847,6 @@ static void vmw_framebuffer_surface_destroy(struct drm_framebuffer *framebuffer)
|
||||||
kfree(vfbs);
|
kfree(vfbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
|
|
||||||
struct drm_file *file_priv,
|
|
||||||
unsigned flags, unsigned color,
|
|
||||||
struct drm_clip_rect *clips,
|
|
||||||
unsigned num_clips)
|
|
||||||
{
|
|
||||||
struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
|
|
||||||
struct vmw_framebuffer_surface *vfbs =
|
|
||||||
vmw_framebuffer_to_vfbs(framebuffer);
|
|
||||||
struct drm_clip_rect norect;
|
|
||||||
int ret, inc = 1;
|
|
||||||
|
|
||||||
/* Legacy Display Unit does not support 3D */
|
|
||||||
if (dev_priv->active_display_unit == vmw_du_legacy)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
drm_modeset_lock_all(dev_priv->dev);
|
|
||||||
|
|
||||||
ret = ttm_read_lock(&dev_priv->reservation_sem, true);
|
|
||||||
if (unlikely(ret != 0)) {
|
|
||||||
drm_modeset_unlock_all(dev_priv->dev);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!num_clips) {
|
|
||||||
num_clips = 1;
|
|
||||||
clips = &norect;
|
|
||||||
norect.x1 = norect.y1 = 0;
|
|
||||||
norect.x2 = framebuffer->width;
|
|
||||||
norect.y2 = framebuffer->height;
|
|
||||||
} else if (flags & DRM_MODE_FB_DIRTY_ANNOTATE_COPY) {
|
|
||||||
num_clips /= 2;
|
|
||||||
inc = 2; /* skip source rects */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev_priv->active_display_unit == vmw_du_screen_object)
|
|
||||||
ret = vmw_kms_sou_do_surface_dirty(dev_priv, &vfbs->base,
|
|
||||||
clips, NULL, NULL, 0, 0,
|
|
||||||
num_clips, inc, NULL, NULL);
|
|
||||||
else
|
|
||||||
ret = vmw_kms_stdu_surface_dirty(dev_priv, &vfbs->base,
|
|
||||||
clips, NULL, NULL, 0, 0,
|
|
||||||
num_clips, inc, NULL, NULL);
|
|
||||||
|
|
||||||
vmw_fifo_flush(dev_priv, false);
|
|
||||||
ttm_read_unlock(&dev_priv->reservation_sem);
|
|
||||||
|
|
||||||
drm_modeset_unlock_all(dev_priv->dev);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vmw_kms_readback - Perform a readback from the screen system to
|
* vmw_kms_readback - Perform a readback from the screen system to
|
||||||
* a buffer-object backed framebuffer.
|
* a buffer-object backed framebuffer.
|
||||||
|
@ -942,7 +890,7 @@ int vmw_kms_readback(struct vmw_private *dev_priv,
|
||||||
|
|
||||||
static const struct drm_framebuffer_funcs vmw_framebuffer_surface_funcs = {
|
static const struct drm_framebuffer_funcs vmw_framebuffer_surface_funcs = {
|
||||||
.destroy = vmw_framebuffer_surface_destroy,
|
.destroy = vmw_framebuffer_surface_destroy,
|
||||||
.dirty = vmw_framebuffer_surface_dirty,
|
.dirty = drm_atomic_helper_dirtyfb,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
|
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (dev_priv->active_display_unit) {
|
switch (dev_priv->active_display_unit) {
|
||||||
case vmw_du_screen_target:
|
|
||||||
ret = vmw_kms_stdu_dma(dev_priv, NULL, &vfbd->base, NULL,
|
|
||||||
clips, NULL, num_clips, increment,
|
|
||||||
true, true, NULL);
|
|
||||||
break;
|
|
||||||
case vmw_du_screen_object:
|
|
||||||
ret = vmw_kms_sou_do_bo_dirty(dev_priv, &vfbd->base,
|
|
||||||
clips, NULL, num_clips,
|
|
||||||
increment, true, NULL, NULL);
|
|
||||||
break;
|
|
||||||
case vmw_du_legacy:
|
case vmw_du_legacy:
|
||||||
ret = vmw_kms_ldu_do_bo_dirty(dev_priv, &vfbd->base, 0, 0,
|
ret = vmw_kms_ldu_do_bo_dirty(dev_priv, &vfbd->base, 0, 0,
|
||||||
clips, num_clips, increment);
|
clips, num_clips, increment);
|
||||||
|
@ -1113,9 +1051,25 @@ static int vmw_framebuffer_bo_dirty(struct drm_framebuffer *framebuffer,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vmw_framebuffer_bo_dirty_ext(struct drm_framebuffer *framebuffer,
|
||||||
|
struct drm_file *file_priv,
|
||||||
|
unsigned int flags, unsigned int color,
|
||||||
|
struct drm_clip_rect *clips,
|
||||||
|
unsigned int num_clips)
|
||||||
|
{
|
||||||
|
struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
|
||||||
|
|
||||||
|
if (dev_priv->active_display_unit == vmw_du_legacy)
|
||||||
|
return vmw_framebuffer_bo_dirty(framebuffer, file_priv, flags,
|
||||||
|
color, clips, num_clips);
|
||||||
|
|
||||||
|
return drm_atomic_helper_dirtyfb(framebuffer, file_priv, flags, color,
|
||||||
|
clips, num_clips);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct drm_framebuffer_funcs vmw_framebuffer_bo_funcs = {
|
static const struct drm_framebuffer_funcs vmw_framebuffer_bo_funcs = {
|
||||||
.destroy = vmw_framebuffer_bo_destroy,
|
.destroy = vmw_framebuffer_bo_destroy,
|
||||||
.dirty = vmw_framebuffer_bo_dirty,
|
.dirty = vmw_framebuffer_bo_dirty_ext,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue