virgl: add extra checks in virgl_res_needs_flush_wait
authorGurchetan Singh <gurchetansingh@chromium.org>
Wed, 6 Feb 2019 02:53:23 +0000 (18:53 -0800)
committerGert Wollny <gert.wollny@collabora.com>
Fri, 15 Feb 2019 10:19:05 +0000 (11:19 +0100)
This is motivated by the following scenario:

glSubBufferData(GL_ARRAY_BUFFER, ...)
glFlush(..)
glSubBufferData(GL_ARRAY_BUFFER, ...)
glSubBufferData(GL_ARRAY_BUFFER, ...)
glSubBufferData(GL_ARRAY_BUFFER, ...)

This increases @davidriley's Team Fortress 2 apitrace from
1 fps to 6 fps and helps with the Chromium glbench
microbenchmarks:

Before: texture_update_rgba_texsubimage2d_2048 = 554.96 mtexel_sec
   buffer_upload_dynamic_array_12 = 0.02 mbytes_sec
   buffer_upload_dynamic_array_576 = 1.07 mbytes_sec
After: texture_update_rgba_texsubimage2d_2048 = 612.29 mtexel_sec
   buffer_upload_dynamic_array_12 = 2.22 mbytes_sec
   buffer_upload_dynamic_array_576 = 164.89 mbytes_sec
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
src/gallium/drivers/virgl/virgl_resource.c

index 9b42bd14c420e52ea938232a6a638dca688d3689..ddb6b77b7691d470dfff4469605e21d417db8cb8 100644 (file)
@@ -33,11 +33,16 @@ bool virgl_res_needs_flush_wait(struct virgl_context *vctx,
    struct virgl_screen *vs = virgl_screen(vctx->base.screen);
    struct virgl_resource *res = virgl_resource(trans->base.resource);
 
-   if ((!(trans->base.usage & PIPE_TRANSFER_UNSYNCHRONIZED)) &&
-       vs->vws->res_is_referenced(vs->vws, vctx->cbuf, res->hw_res)) {
-      return true;
+   if (trans->base.usage & PIPE_TRANSFER_UNSYNCHRONIZED)
+      return false;
+   if (!vs->vws->res_is_referenced(vs->vws, vctx->cbuf, res->hw_res))
+      return false;
+   if (res->clean[trans->base.level]) {
+      if (vctx->num_draws == 0 && vctx->num_compute == 0)
+         return false;
    }
-   return false;
+
+   return true;
 }
 
 bool virgl_res_needs_readback(struct virgl_context *vctx,