From: Gurchetan Singh Date: Wed, 6 Feb 2019 02:53:23 +0000 (-0800) Subject: virgl: add extra checks in virgl_res_needs_flush_wait X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=90e96505855442fb235b50e29e548cbf8e559edd;p=mesa.git virgl: add extra checks in virgl_res_needs_flush_wait 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 --- diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c index 9b42bd14c42..ddb6b77b769 100644 --- a/src/gallium/drivers/virgl/virgl_resource.c +++ b/src/gallium/drivers/virgl/virgl_resource.c @@ -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,