From: Dave Airlie Date: Wed, 29 Jun 2016 06:42:29 +0000 (+1000) Subject: virgl: add openarena readpixels workaround. X-Git-Tag: android-x86-6.0-r1~1 X-Git-Url: http://git.osdn.net/view?p=android-x86%2Fexternal-mesa.git;a=commitdiff_plain;h=c3bb2e308704073ef832c1d68846caab25ffc988 virgl: add openarena readpixels workaround. So OA with flares does 8 readback from the depth buffer, each of those was causing a host roundtrip and readback, instead just sync the whole buffer and see how things go. I'm not sure this won't destroy some other apps --- diff --git a/src/gallium/drivers/virgl/virgl_texture.c b/src/gallium/drivers/virgl/virgl_texture.c index c8e8866c41b..f8936a6cd29 100644 --- a/src/gallium/drivers/virgl/virgl_texture.c +++ b/src/gallium/drivers/virgl/virgl_texture.c @@ -179,16 +179,33 @@ static void *virgl_texture_transfer_map(struct pipe_context *ctx, offset = 0; } else { offset = vrend_get_tex_image_offset(vtex, level, box->z); - offset += box->y / util_format_get_blockheight(format) * trans->base.stride + - box->x / util_format_get_blockwidth(format) * util_format_get_blocksize(format); + box->x / util_format_get_blockwidth(format) * util_format_get_blocksize(format); + hw_res = vtex->base.hw_res; trans->resolve_tmp = NULL; } readback = virgl_res_needs_readback(vctx, &vtex->base, usage); - if (readback) - vs->vws->transfer_get(vs->vws, hw_res, box, trans->base.stride, l_stride, offset, level); + + if (readback) { + if (resource->target == PIPE_TEXTURE_2D && + !vs->vws->res_is_synced(vs->vws, hw_res)) { + struct pipe_box sync_box = { + .width = u_minify(vtex->base.u.b.width0, level), + .height = u_minify(vtex->base.u.b.height0, level), + .depth = 1, + }; + + vs->vws->transfer_get(vs->vws, hw_res, &sync_box, trans->base.stride, l_stride, + vrend_get_tex_image_offset(vtex, level, box->z), level); + vs->vws->resource_wait(vs->vws, vtex->base.hw_res); + vs->vws->res_set_synced(vtex->base.hw_res); + doflushwait = false; + readback = false; + } else + vs->vws->transfer_get(vs->vws, hw_res, box, trans->base.stride, l_stride, offset, level); + } if (doflushwait || readback) vs->vws->resource_wait(vs->vws, vtex->base.hw_res);