#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"
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;
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;
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;
}
struct pb_buffer;
struct pipe_fence_handle;
+struct util_hash_table;
/**
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,
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