drm/vmwgfx: Invalidate surface on non-readback unbind
authorJakob Bornecrantz <jakob@vmware.com>
Fri, 17 Jan 2014 08:12:26 +0000 (09:12 +0100)
committerThomas Hellstrom <thellstrom@vmware.com>
Fri, 17 Jan 2014 08:12:26 +0000 (09:12 +0100)
Fixes error messages in vmware.log

Signed-off-by: Jakob Bornecrantz <jakob@vmware.com>
Reviewed-by: Michael Banack <banackm@vmware.com>
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
drivers/gpu/drm/vmwgfx/vmwgfx_surface.c

index a729b20ee14d635aa8d8325bc14fb33f414bcb99..3bb3331acdaf9c6f875b1eaead138b3b0e3e142a 100644 (file)
@@ -1043,15 +1043,19 @@ static int vmw_gb_surface_unbind(struct vmw_resource *res,
        } *cmd1;
        struct {
                SVGA3dCmdHeader header;
-               SVGA3dCmdBindGBSurface body;
+               SVGA3dCmdInvalidateGBSurface body;
        } *cmd2;
+       struct {
+               SVGA3dCmdHeader header;
+               SVGA3dCmdBindGBSurface body;
+       } *cmd3;
        uint32_t submit_size;
        uint8_t *cmd;
 
 
        BUG_ON(bo->mem.mem_type != VMW_PL_MOB);
 
-       submit_size = sizeof(*cmd2) + (readback ? sizeof(*cmd1) : 0);
+       submit_size = sizeof(*cmd3) + (readback ? sizeof(*cmd1) : sizeof(*cmd2));
        cmd = vmw_fifo_reserve(dev_priv, submit_size);
        if (unlikely(cmd == NULL)) {
                DRM_ERROR("Failed reserving FIFO space for surface "
@@ -1059,18 +1063,24 @@ static int vmw_gb_surface_unbind(struct vmw_resource *res,
                return -ENOMEM;
        }
 
-       cmd2 = (void *) cmd;
        if (readback) {
                cmd1 = (void *) cmd;
                cmd1->header.id = SVGA_3D_CMD_READBACK_GB_SURFACE;
                cmd1->header.size = sizeof(cmd1->body);
                cmd1->body.sid = res->id;
-               cmd2 = (void *) &cmd1[1];
+               cmd3 = (void *) &cmd1[1];
+       } else {
+               cmd2 = (void *) cmd;
+               cmd2->header.id = SVGA_3D_CMD_INVALIDATE_GB_SURFACE;
+               cmd2->header.size = sizeof(cmd2->body);
+               cmd2->body.sid = res->id;
+               cmd3 = (void *) &cmd2[1];
        }
-       cmd2->header.id = SVGA_3D_CMD_BIND_GB_SURFACE;
-       cmd2->header.size = sizeof(cmd2->body);
-       cmd2->body.sid = res->id;
-       cmd2->body.mobid = SVGA3D_INVALID_ID;
+
+       cmd3->header.id = SVGA_3D_CMD_BIND_GB_SURFACE;
+       cmd3->header.size = sizeof(cmd3->body);
+       cmd3->body.sid = res->id;
+       cmd3->body.mobid = SVGA3D_INVALID_ID;
 
        vmw_fifo_commit(dev_priv, submit_size);