vmwgfx: Make it possible to get fence from execbuf
Jakob Bornecrantz [Thu, 9 Feb 2012 15:56:43 +0000 (16:56 +0100)]
Signed-off-by: Jakob Bornecrantz <jakob@vmware.com>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c

index 93505ce..14c2f49 100644 (file)
@@ -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,
index 40932fb..4acced4 100644 (file)
@@ -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;
index b66ef0e..12619c3 100644 (file)
@@ -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);