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 <gert.wollny@collabora.com>
This commit is contained in:
Gurchetan Singh 2019-02-05 18:53:23 -08:00 committed by Gert Wollny
parent ab6ea6e9ce
commit 90e9650585
1 changed files with 9 additions and 4 deletions

View 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,