virgl: remove an incorrect check in virgl_res_needs_flush
authorChia-I Wu <olvaffe@gmail.com>
Wed, 8 May 2019 21:53:47 +0000 (14:53 -0700)
committerChia-I Wu <olvaffe@gmail.com>
Fri, 24 May 2019 17:37:40 +0000 (17:37 +0000)
Imagine this

  resource_copy_region(ctx, dst, ..., src, ...);
  transfer_map(ctx, src, 0, PIPE_TRANSFER_WRITE, ...);

at the beginning of a cmdbuf.  We need to flush in transfer_map so
that the transfer is not reordered before the resource copy.  The
check for "vctx->num_draws == 0 && vctx->num_compute == 0" is not
enough.  Removing the optimization entirely.

Because of the more precise resource tracking in the previous
commit, I hope the performance impact is minimized.  We will have to
go with perfect resource tracking, or attempt a more limited
optimization, if there are specific cases we really need to optimize
for.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
src/gallium/drivers/virgl/virgl_resource.c

index 5d639ce64fdcd8bd5fe04bc4756dc11e303f5169..6e23687b594269bd02825a910f8883549bac8628 100644 (file)
@@ -32,8 +32,6 @@
  *
  *  - synchronization is disabled
  *  - the resource is not referenced by the current cmdbuf
- *  - the current cmdbuf has no draw/compute command that accesses the
- *    resource (XXX there are also clear or blit commands)
  */
 static bool virgl_res_needs_flush(struct virgl_context *vctx,
                                   struct virgl_transfer *trans)
@@ -47,19 +45,6 @@ static bool virgl_res_needs_flush(struct virgl_context *vctx,
    if (!vws->res_is_referenced(vws, vctx->cbuf, res->hw_res))
       return false;
 
-   if (res->clean_mask & (1 << trans->base.level)) {
-      /* XXX Consider
-       *
-       *   glCopyBufferSubData(src, dst, ...);
-       *   glBufferSubData(src, ...);
-       *
-       * at the beginning of a cmdbuf.  glBufferSubData will be incorrectly
-       * reordered before glCopyBufferSubData.
-       */
-      if (vctx->num_draws == 0 && vctx->num_compute == 0)
-         return false;
-   }
-
    return true;
 }