mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 02:20:11 +01:00
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 <thellstrom@vmware.com> Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
parent
a119da3bc9
commit
1a66ead1c7
3 changed files with 33 additions and 27 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue