From 1a66ead1c75246224bf43e82a07b4fdb2891959a Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Fri, 10 May 2019 13:45:19 +0200 Subject: [PATCH] pipebuffer, winsys/svga: Add functionality to update pb_validate_entry flags In order to be able to add access modes to a pb_validate_entry, update the pb_validate_add_buffer function to take a pointer hash table and also to return whether the buffer was already on the validate list. Update the svga winsys accordingly. Signed-off-by: Thomas Hellstrom Reviewed-by: Charmaine Lee --- .../auxiliary/pipebuffer/pb_validate.c | 32 +++++++++++++------ .../auxiliary/pipebuffer/pb_validate.h | 5 ++- src/gallium/winsys/svga/drm/vmw_context.c | 23 ++++--------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/gallium/auxiliary/pipebuffer/pb_validate.c b/src/gallium/auxiliary/pipebuffer/pb_validate.c index 0c61c906a3a..459dde526c3 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_validate.c +++ b/src/gallium/auxiliary/pipebuffer/pb_validate.c @@ -37,6 +37,7 @@ #include "pipe/p_defines.h" #include "util/u_memory.h" #include "util/u_debug.h" +#include "util/u_hash_table.h" #include "pb_buffer.h" #include "pb_validate.h" @@ -63,9 +64,12 @@ struct pb_validate enum pipe_error pb_validate_add_buffer(struct pb_validate *vl, struct pb_buffer *buf, - enum pb_usage_flags flags) + enum pb_usage_flags flags, + struct util_hash_table *ht, + boolean *already_present) { assert(buf); + *already_present = FALSE; if (!buf) return PIPE_ERROR; @@ -73,15 +77,20 @@ pb_validate_add_buffer(struct pb_validate *vl, assert(!(flags & ~PB_USAGE_GPU_READ_WRITE)); flags &= PB_USAGE_GPU_READ_WRITE; - /* We only need to store one reference for each buffer, so avoid storing - * consecutive references for the same buffer. It might not be the most - * common pattern, but it is easy to implement. - */ - if(vl->used && vl->entries[vl->used - 1].buf == buf) { - vl->entries[vl->used - 1].flags |= flags; - return PIPE_OK; + if (ht) { + unsigned long entry_idx = (unsigned long) util_hash_table_get(ht, buf); + + if (entry_idx) { + struct pb_validate_entry *entry = &vl->entries[entry_idx - 1]; + + assert(entry->buf == buf); + entry->flags |= flags; + *already_present = TRUE; + + return PIPE_OK; + } } - + /* Grow the table */ if(vl->used == vl->size) { unsigned new_size; @@ -107,7 +116,10 @@ pb_validate_add_buffer(struct pb_validate *vl, pb_reference(&vl->entries[vl->used].buf, buf); vl->entries[vl->used].flags = flags; ++vl->used; - + + if (ht) + util_hash_table_set(ht, buf, (void *) (unsigned long) vl->used); + return PIPE_OK; } diff --git a/src/gallium/auxiliary/pipebuffer/pb_validate.h b/src/gallium/auxiliary/pipebuffer/pb_validate.h index ea364330eff..3196d5290fe 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_validate.h +++ b/src/gallium/auxiliary/pipebuffer/pb_validate.h @@ -46,6 +46,7 @@ extern "C" { struct pb_buffer; struct pipe_fence_handle; +struct util_hash_table; /** @@ -59,7 +60,9 @@ struct pb_validate; enum pipe_error pb_validate_add_buffer(struct pb_validate *vl, struct pb_buffer *buf, - enum pb_usage_flags flags); + enum pb_usage_flags flags, + struct util_hash_table *ht, + boolean *already_present); enum pipe_error pb_validate_foreach(struct pb_validate *vl, diff --git a/src/gallium/winsys/svga/drm/vmw_context.c b/src/gallium/winsys/svga/drm/vmw_context.c index addb58d165a..d073cd4859f 100644 --- a/src/gallium/winsys/svga/drm/vmw_context.c +++ b/src/gallium/winsys/svga/drm/vmw_context.c @@ -370,24 +370,15 @@ vmw_swc_add_validate_buffer(struct vmw_svga_winsys_context *vswc, struct pb_buffer *pb_buf, unsigned flags) { - enum pipe_error ret; + MAYBE_UNUSED enum pipe_error ret; unsigned translated_flags; + boolean already_present; - /* - * TODO: Update pb_validate to provide a similar functionality - * (Check buffer already present before adding) - */ - if (util_hash_table_get(vswc->hash, pb_buf) != pb_buf) { - translated_flags = vmw_translate_to_pb_flags(flags); - ret = pb_validate_add_buffer(vswc->validate, pb_buf, translated_flags); - /* TODO: Update pipebuffer to reserve buffers and not fail here */ - assert(ret == PIPE_OK); - (void)ret; - (void)util_hash_table_set(vswc->hash, pb_buf, pb_buf); - return TRUE; - } - - return FALSE; + translated_flags = vmw_translate_to_pb_flags(flags); + ret = pb_validate_add_buffer(vswc->validate, pb_buf, translated_flags, + vswc->hash, &already_present); + assert(ret == PIPE_OK); + return !already_present; } static void -- 2.30.2