pipebuffer, winsys/svga: Add functionality to update pb_validate_entry flags
authorThomas Hellstrom <thellstrom@vmware.com>
Fri, 10 May 2019 11:45:19 +0000 (13:45 +0200)
committerThomas Hellstrom <thellstrom@vmware.com>
Fri, 17 May 2019 06:44:31 +0000 (08:44 +0200)
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@vmware.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
src/gallium/auxiliary/pipebuffer/pb_validate.c
src/gallium/auxiliary/pipebuffer/pb_validate.h
src/gallium/winsys/svga/drm/vmw_context.c

index 0c61c906a3a1710e531f0e5ad1a6856ec63bd5b6..459dde526c3774a5c016071a5d7b18815e64f87a 100644 (file)
@@ -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;
 }
 
index ea364330eff213b74b904865e6af8ee85a4c0178..3196d5290feb75826f8efb92eefa2a814a85725a 100644 (file)
@@ -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,
index addb58d165ac5357fed7b6331a001e2963ccffa2..d073cd4859f6c3e7c80e6a4fc95dd3cd778fa827 100644 (file)
@@ -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