diff options
author | Gurchetan Singh <[email protected]> | 2019-02-05 18:53:23 -0800 |
---|---|---|
committer | Gert Wollny <[email protected]> | 2019-02-15 11:19:05 +0100 |
commit | 90e96505855442fb235b50e29e548cbf8e559edd (patch) | |
tree | d6c76c7b5f1e181477182112d9af2d955aa26cd6 /src | |
parent | ab6ea6e9cee07dea561426d86f93eff670a53efd (diff) |
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/virgl/virgl_resource.c | 13 |
1 files changed, 9 insertions, 4 deletions
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, |