drm/vmwgfx: Fix a screen object framebuffer dirty corner case
authorThomas Hellstrom <thellstrom@vmware.com>
Fri, 12 Feb 2016 07:26:37 +0000 (08:26 +0100)
committerThomas Hellstrom <thellstrom@vmware.com>
Mon, 14 Mar 2016 13:56:06 +0000 (14:56 +0100)
If there are no cliprects for a particular crtc, an invalid command would
have been generated. If that's the case, instead ditch the generated
command sequence.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c

index c5a1a08b0449004670b79947e68f0ba7fb8afb50..cbc1fbaa3d8e52e780151b0456b5ef1fc72993c3 100644 (file)
@@ -738,6 +738,11 @@ static void vmw_sou_surface_fifo_commit(struct vmw_kms_dirty *dirty)
        SVGASignedRect *blit = (SVGASignedRect *) &cmd[1];
        int i;
 
+       if (!dirty->num_hits) {
+               vmw_fifo_commit(dirty->dev_priv, 0);
+               return;
+       }
+
        cmd->header.id = SVGA_3D_CMD_BLIT_SURFACE_TO_SCREEN;
        cmd->header.size = sizeof(cmd->body) + region_size;
 
@@ -875,6 +880,11 @@ int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv,
  */
 static void vmw_sou_dmabuf_fifo_commit(struct vmw_kms_dirty *dirty)
 {
+       if (!dirty->num_hits) {
+               vmw_fifo_commit(dirty->dev_priv, 0);
+               return;
+       }
+
        vmw_fifo_commit(dirty->dev_priv,
                        sizeof(struct vmw_kms_sou_dmabuf_blit) *
                        dirty->num_hits);
@@ -967,6 +977,11 @@ out_revert:
  */
 static void vmw_sou_readback_fifo_commit(struct vmw_kms_dirty *dirty)
 {
+       if (!dirty->num_hits) {
+               vmw_fifo_commit(dirty->dev_priv, 0);
+               return;
+       }
+
        vmw_fifo_commit(dirty->dev_priv,
                        sizeof(struct vmw_kms_sou_readback_blit) *
                        dirty->num_hits);