[PATCH] drm/vmwgfx: Invalidate surface on non-readback unbind

Thomas Hellstrom thellstrom at vmware.com
Fri Jan 17 00:27:15 PST 2014


From: Jakob Bornecrantz <jakob at vmware.com>

Fixes error messages in vmware.log

Signed-off-by: Jakob Bornecrantz <jakob at vmware.com>
Reviewed-by: Michael Banack <banackm at vmware.com>
Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
index a729b20..3bb3331 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
@@ -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);
 
-- 
1.8.3.2


More information about the dri-devel mailing list