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