[Mesa-dev] [PATCH 1/4] i965: Track last location of bo used for the batch
Daniel Vetter
daniel at ffwll.ch
Fri Jul 7 09:55:49 UTC 2017
On Mon, Jun 19, 2017 at 11:06:47AM +0100, Chris Wilson wrote:
> Borrow a trick from anv, and use the last known index for the bo to skip
> a search of the batch->exec_bo when adding a new relocation. In defence
> against the bo being used in multiple batches simultaneously, we check
> that this slot exists and points back to us.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Kenneth Graunke <kenneth at whitecape.org>
> Cc: Matt Turner <mattst88 at gmail.com>
> Cc: Jason Ekstrand <jason.ekstrand at intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_bufmgr.h | 5 +++++
> src/mesa/drivers/dri/i965/intel_batchbuffer.c | 14 ++++++++++++--
> 2 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h b/src/mesa/drivers/dri/i965/brw_bufmgr.h
> index 48488bc33b..dd3a37040a 100644
> --- a/src/mesa/drivers/dri/i965/brw_bufmgr.h
> +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h
> @@ -76,6 +76,11 @@ struct brw_bo {
> uint64_t offset64;
>
> /**
> + * Index of this buffer inside the batch, -1 when not in a batch.
> + */
> + unsigned int index;
> +
> + /**
> * Boolean of whether the GPU is definitely not accessing the buffer.
> *
> * This is only valid when reusable, since non-reusable
> diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> index 62d2fe8ef3..ca7d6b81b1 100644
> --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> @@ -515,12 +515,20 @@ throttle(struct brw_context *brw)
> }
> }
>
> +#define READ_ONCE(x) (*(volatile __typeof__(x) *)&(x))
> +
> static void
> add_exec_bo(struct intel_batchbuffer *batch, struct brw_bo *bo)
> {
> if (bo != batch->bo) {
> - for (int i = 0; i < batch->exec_count; i++) {
> - if (batch->exec_bos[i] == bo)
> + unsigned int index = READ_ONCE(bo->index);
> +
> + if (index < batch->exec_count && batch->exec_bos[index] == bo)
> + return;
> +
> + /* May have been shared between multiple active batches */
> + for (index = 0; index < batch->exec_count; index++) {
> + if (batch->exec_bos[index] == bo)
> return;
> }
>
> @@ -553,6 +561,7 @@ add_exec_bo(struct intel_batchbuffer *batch, struct brw_bo *bo)
> validation_entry->rsvd1 = 0;
> validation_entry->rsvd2 = 0;
>
> + bo->index = batch->exec_count;
> batch->exec_bos[batch->exec_count] = bo;
> batch->exec_count++;
> batch->aperture_space += bo->size;
> @@ -597,6 +606,7 @@ execbuffer(int fd,
> struct brw_bo *bo = batch->exec_bos[i];
>
> bo->idle = false;
> + bo->index = -1;
Since we check for matching backpointer I don't think we even need to
clear this here, but it's cheap. For consistency I think we should also
clear when allocating a bo:
diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c b/src/mesa/drivers/dri/i965/brw_bufmgr.c
index da12a131526a..0c3199690257 100644
--- a/src/mesa/drivers/dri/i965/brw_bufmgr.c
+++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c
@@ -325,6 +325,7 @@ retry:
bo->size = bo_size;
bo->idle = true;
+ bo->index = -1;
memclear(create);
create.size = bo_size;
With that: Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
>
> /* Update brw_bo::offset64 */
> if (batch->exec_objects[i].offset != bo->offset64) {
> --
> 2.11.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the mesa-dev
mailing list