Commit 1a66ead1 authored by Thomas Hellstrom's avatar Thomas Hellstrom

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: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Charmaine Lee's avatarCharmaine Lee <charmainel@vmware.com>
parent a119da3b
......@@ -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;
}
......
......@@ -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,
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment