[Mesa-dev] [PATCH 4/5] pipebuffer, winsys/svga: Add functionality to update pb_validate_entry flags

Thomas Hellstrom thellstrom at vmware.com
Thu May 16 09:13:41 UTC 2019


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 <thellstrom at vmware.com>
Reviewed-by: Charmaine Lee <charmainel at vmware.com>
---
 .../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.20.1



More information about the mesa-dev mailing list