aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hellstrom <[email protected]>2019-05-10 13:45:19 +0200
committerThomas Hellstrom <[email protected]>2019-05-17 08:44:31 +0200
commit1a66ead1c75246224bf43e82a07b4fdb2891959a (patch)
treec878186234c2971df45bf90f05d2d131af0522f2
parenta119da3bc9bde850717f9f03a2eeddef520b9416 (diff)
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 <[email protected]> Reviewed-by: Charmaine Lee <[email protected]>
-rw-r--r--src/gallium/auxiliary/pipebuffer/pb_validate.c32
-rw-r--r--src/gallium/auxiliary/pipebuffer/pb_validate.h5
-rw-r--r--src/gallium/winsys/svga/drm/vmw_context.c23
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