mirror of https://gitee.com/openkylin/linux.git
vmwgfx: Make it possible to get fence from execbuf
Signed-off-by: Jakob Bornecrantz <jakob@vmware.com> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
6b82ef50d8
commit
bb1bd2f43e
|
@ -534,7 +534,8 @@ extern int vmw_execbuf_process(struct drm_file *file_priv,
|
|||
uint32_t command_size,
|
||||
uint64_t throttle_us,
|
||||
struct drm_vmw_fence_rep __user
|
||||
*user_fence_rep);
|
||||
*user_fence_rep,
|
||||
struct vmw_fence_obj **out_fence);
|
||||
|
||||
extern void
|
||||
vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv,
|
||||
|
|
|
@ -1109,10 +1109,11 @@ int vmw_execbuf_process(struct drm_file *file_priv,
|
|||
void *kernel_commands,
|
||||
uint32_t command_size,
|
||||
uint64_t throttle_us,
|
||||
struct drm_vmw_fence_rep __user *user_fence_rep)
|
||||
struct drm_vmw_fence_rep __user *user_fence_rep,
|
||||
struct vmw_fence_obj **out_fence)
|
||||
{
|
||||
struct vmw_sw_context *sw_context = &dev_priv->ctx;
|
||||
struct vmw_fence_obj *fence;
|
||||
struct vmw_fence_obj *fence = NULL;
|
||||
uint32_t handle;
|
||||
void *cmd;
|
||||
int ret;
|
||||
|
@ -1208,8 +1209,13 @@ int vmw_execbuf_process(struct drm_file *file_priv,
|
|||
vmw_execbuf_copy_fence_user(dev_priv, vmw_fpriv(file_priv), ret,
|
||||
user_fence_rep, fence, handle);
|
||||
|
||||
if (likely(fence != NULL))
|
||||
/* Don't unreference when handing fence out */
|
||||
if (unlikely(out_fence != NULL)) {
|
||||
*out_fence = fence;
|
||||
fence = NULL;
|
||||
} else if (likely(fence != NULL)) {
|
||||
vmw_fence_obj_unreference(&fence);
|
||||
}
|
||||
|
||||
mutex_unlock(&dev_priv->cmdbuf_mutex);
|
||||
return 0;
|
||||
|
@ -1362,7 +1368,8 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
|
|||
ret = vmw_execbuf_process(file_priv, dev_priv,
|
||||
(void __user *)(unsigned long)arg->commands,
|
||||
NULL, arg->command_size, arg->throttle_us,
|
||||
(void __user *)(unsigned long)arg->fence_rep);
|
||||
(void __user *)(unsigned long)arg->fence_rep,
|
||||
NULL);
|
||||
|
||||
if (unlikely(ret != 0))
|
||||
goto out_unlock;
|
||||
|
|
|
@ -547,7 +547,7 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv,
|
|||
fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num;
|
||||
cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header));
|
||||
ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd,
|
||||
fifo_size, 0, NULL);
|
||||
fifo_size, 0, NULL, NULL);
|
||||
|
||||
if (unlikely(ret != 0))
|
||||
break;
|
||||
|
@ -809,7 +809,7 @@ static int do_dmabuf_define_gmrfb(struct drm_file *file_priv,
|
|||
cmd->body.ptr.offset = 0;
|
||||
|
||||
ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd,
|
||||
fifo_size, 0, NULL);
|
||||
fifo_size, 0, NULL, NULL);
|
||||
|
||||
kfree(cmd);
|
||||
|
||||
|
@ -896,7 +896,7 @@ static int do_dmabuf_dirty_sou(struct drm_file *file_priv,
|
|||
|
||||
fifo_size = sizeof(*blits) * hit_num;
|
||||
ret = vmw_execbuf_process(file_priv, dev_priv, NULL, blits,
|
||||
fifo_size, 0, NULL);
|
||||
fifo_size, 0, NULL, NULL);
|
||||
|
||||
if (unlikely(ret != 0))
|
||||
break;
|
||||
|
@ -1296,7 +1296,7 @@ int vmw_kms_present(struct vmw_private *dev_priv,
|
|||
fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num;
|
||||
cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header));
|
||||
ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd,
|
||||
fifo_size, 0, NULL);
|
||||
fifo_size, 0, NULL, NULL);
|
||||
|
||||
if (unlikely(ret != 0))
|
||||
break;
|
||||
|
@ -1409,7 +1409,7 @@ int vmw_kms_readback(struct vmw_private *dev_priv,
|
|||
fifo_size = sizeof(*cmd) + sizeof(*blits) * blits_pos;
|
||||
|
||||
ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd, fifo_size,
|
||||
0, user_fence_rep);
|
||||
0, user_fence_rep, NULL);
|
||||
|
||||
kfree(cmd);
|
||||
|
||||
|
|
Loading…
Reference in New Issue