|
|
|
@@ -28,15 +28,15 @@ |
|
|
|
/** |
|
|
|
* \file |
|
|
|
* Generic code for buffers. |
|
|
|
* |
|
|
|
* Behind a pipe buffle handle there can be DMA buffers, client (or user) |
|
|
|
* buffers, regular malloced buffers, etc. This file provides an abstract base |
|
|
|
* buffer handle that allows the driver to cope with all those kinds of buffers |
|
|
|
* |
|
|
|
* Behind a pipe buffle handle there can be DMA buffers, client (or user) |
|
|
|
* buffers, regular malloced buffers, etc. This file provides an abstract base |
|
|
|
* buffer handle that allows the driver to cope with all those kinds of buffers |
|
|
|
* in a more flexible way. |
|
|
|
* |
|
|
|
* |
|
|
|
* There is no obligation of a winsys driver to use this library. And a pipe |
|
|
|
* driver should be completly agnostic about it. |
|
|
|
* |
|
|
|
* |
|
|
|
* \author Jose Fonseca <jfonseca@vmware.com> |
|
|
|
*/ |
|
|
|
|
|
|
|
@@ -76,16 +76,14 @@ enum pb_usage_flags { |
|
|
|
PB_USAGE_DONTBLOCK | \ |
|
|
|
PB_USAGE_UNSYNCHRONIZED) |
|
|
|
|
|
|
|
#define PB_USAGE_CPU_READ_WRITE \ |
|
|
|
( PB_USAGE_CPU_READ | PB_USAGE_CPU_WRITE ) |
|
|
|
#define PB_USAGE_GPU_READ_WRITE \ |
|
|
|
( PB_USAGE_GPU_READ | PB_USAGE_GPU_WRITE ) |
|
|
|
#define PB_USAGE_WRITE \ |
|
|
|
( PB_USAGE_CPU_WRITE | PB_USAGE_GPU_WRITE ) |
|
|
|
#define PB_USAGE_CPU_READ_WRITE (PB_USAGE_CPU_READ | PB_USAGE_CPU_WRITE) |
|
|
|
#define PB_USAGE_GPU_READ_WRITE (PB_USAGE_GPU_READ | PB_USAGE_GPU_WRITE) |
|
|
|
#define PB_USAGE_WRITE (PB_USAGE_CPU_WRITE | PB_USAGE_GPU_WRITE) |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Buffer description. |
|
|
|
* |
|
|
|
* |
|
|
|
* Used when allocating the buffer. |
|
|
|
*/ |
|
|
|
struct pb_desc |
|
|
|
@@ -104,7 +102,7 @@ typedef uint64_t pb_size; |
|
|
|
/** |
|
|
|
* Base class for all pb_* buffers. |
|
|
|
*/ |
|
|
|
struct pb_buffer |
|
|
|
struct pb_buffer |
|
|
|
{ |
|
|
|
struct pipe_reference reference; |
|
|
|
unsigned alignment; |
|
|
|
@@ -114,8 +112,8 @@ struct pb_buffer |
|
|
|
/** |
|
|
|
* Pointer to the virtual function table. |
|
|
|
* |
|
|
|
* Avoid accessing this table directly. Use the inline functions below |
|
|
|
* instead to avoid mistakes. |
|
|
|
* Avoid accessing this table directly. Use the inline functions below |
|
|
|
* instead to avoid mistakes. |
|
|
|
*/ |
|
|
|
const struct pb_vtbl *vtbl; |
|
|
|
}; |
|
|
|
@@ -123,44 +121,43 @@ struct pb_buffer |
|
|
|
|
|
|
|
/** |
|
|
|
* Virtual function table for the buffer storage operations. |
|
|
|
* |
|
|
|
* |
|
|
|
* Note that creation is not done through this table. |
|
|
|
*/ |
|
|
|
struct pb_vtbl |
|
|
|
{ |
|
|
|
void (*destroy)( struct pb_buffer *buf ); |
|
|
|
void (*destroy)(struct pb_buffer *buf); |
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Map the entire data store of a buffer object into the client's address. |
|
|
|
* flags is bitmask of PB_USAGE_CPU_READ/WRITE. |
|
|
|
* flags is bitmask of PB_USAGE_CPU_READ/WRITE. |
|
|
|
*/ |
|
|
|
void *(*map)( struct pb_buffer *buf, |
|
|
|
enum pb_usage_flags flags, void *flush_ctx ); |
|
|
|
|
|
|
|
void (*unmap)( struct pb_buffer *buf ); |
|
|
|
void *(*map)(struct pb_buffer *buf, |
|
|
|
enum pb_usage_flags flags, void *flush_ctx); |
|
|
|
|
|
|
|
void (*unmap)(struct pb_buffer *buf); |
|
|
|
|
|
|
|
enum pipe_error (*validate)( struct pb_buffer *buf, |
|
|
|
struct pb_validate *vl, |
|
|
|
enum pb_usage_flags flags ); |
|
|
|
enum pipe_error (*validate)(struct pb_buffer *buf, |
|
|
|
struct pb_validate *vl, |
|
|
|
enum pb_usage_flags flags); |
|
|
|
|
|
|
|
void (*fence)( struct pb_buffer *buf, |
|
|
|
struct pipe_fence_handle *fence ); |
|
|
|
void (*fence)(struct pb_buffer *buf, |
|
|
|
struct pipe_fence_handle *fence); |
|
|
|
|
|
|
|
/** |
|
|
|
* Get the base buffer and the offset. |
|
|
|
* |
|
|
|
* |
|
|
|
* A buffer can be subdivided in smaller buffers. This method should return |
|
|
|
* the underlaying buffer, and the relative offset. |
|
|
|
* |
|
|
|
* Buffers without an underlaying base buffer should return themselves, with |
|
|
|
* |
|
|
|
* Buffers without an underlaying base buffer should return themselves, with |
|
|
|
* a zero offset. |
|
|
|
* |
|
|
|
* |
|
|
|
* Note that this will increase the reference count of the base buffer. |
|
|
|
*/ |
|
|
|
void (*get_base_buffer)( struct pb_buffer *buf, |
|
|
|
struct pb_buffer **base_buf, |
|
|
|
pb_size *offset ); |
|
|
|
|
|
|
|
void (*get_base_buffer)(struct pb_buffer *buf, |
|
|
|
struct pb_buffer **base_buf, |
|
|
|
pb_size *offset); |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
@@ -168,8 +165,7 @@ struct pb_vtbl |
|
|
|
/* Accessor functions for pb->vtbl: |
|
|
|
*/ |
|
|
|
static inline void * |
|
|
|
pb_map(struct pb_buffer *buf, |
|
|
|
enum pb_usage_flags flags, void *flush_ctx) |
|
|
|
pb_map(struct pb_buffer *buf, enum pb_usage_flags flags, void *flush_ctx) |
|
|
|
{ |
|
|
|
assert(buf); |
|
|
|
if (!buf) |
|
|
|
@@ -179,7 +175,7 @@ pb_map(struct pb_buffer *buf, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline void |
|
|
|
static inline void |
|
|
|
pb_unmap(struct pb_buffer *buf) |
|
|
|
{ |
|
|
|
assert(buf); |
|
|
|
@@ -191,9 +187,9 @@ pb_unmap(struct pb_buffer *buf) |
|
|
|
|
|
|
|
|
|
|
|
static inline void |
|
|
|
pb_get_base_buffer( struct pb_buffer *buf, |
|
|
|
struct pb_buffer **base_buf, |
|
|
|
pb_size *offset ) |
|
|
|
pb_get_base_buffer(struct pb_buffer *buf, |
|
|
|
struct pb_buffer **base_buf, |
|
|
|
pb_size *offset) |
|
|
|
{ |
|
|
|
assert(buf); |
|
|
|
if (!buf) { |
|
|
|
@@ -209,7 +205,7 @@ pb_get_base_buffer( struct pb_buffer *buf, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline enum pipe_error |
|
|
|
static inline enum pipe_error |
|
|
|
pb_validate(struct pb_buffer *buf, struct pb_validate *vl, |
|
|
|
enum pb_usage_flags flags) |
|
|
|
{ |
|
|
|
@@ -221,7 +217,7 @@ pb_validate(struct pb_buffer *buf, struct pb_validate *vl, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline void |
|
|
|
static inline void |
|
|
|
pb_fence(struct pb_buffer *buf, struct pipe_fence_handle *fence) |
|
|
|
{ |
|
|
|
assert(buf); |
|
|
|
@@ -232,7 +228,7 @@ pb_fence(struct pb_buffer *buf, struct pipe_fence_handle *fence) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline void |
|
|
|
static inline void |
|
|
|
pb_destroy(struct pb_buffer *buf) |
|
|
|
{ |
|
|
|
assert(buf); |
|
|
|
@@ -242,6 +238,7 @@ pb_destroy(struct pb_buffer *buf) |
|
|
|
buf->vtbl->destroy(buf); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline void |
|
|
|
pb_reference(struct pb_buffer **dst, |
|
|
|
struct pb_buffer *src) |
|
|
|
@@ -249,7 +246,7 @@ pb_reference(struct pb_buffer **dst, |
|
|
|
struct pb_buffer *old = *dst; |
|
|
|
|
|
|
|
if (pipe_reference(&(*dst)->reference, &src->reference)) |
|
|
|
pb_destroy( old ); |
|
|
|
pb_destroy(old); |
|
|
|
*dst = src; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -261,11 +258,11 @@ pb_reference(struct pb_buffer **dst, |
|
|
|
static inline boolean |
|
|
|
pb_check_alignment(pb_size requested, pb_size provided) |
|
|
|
{ |
|
|
|
if(!requested) |
|
|
|
if (!requested) |
|
|
|
return TRUE; |
|
|
|
if(requested > provided) |
|
|
|
if (requested > provided) |
|
|
|
return FALSE; |
|
|
|
if(provided % requested != 0) |
|
|
|
if (provided % requested != 0) |
|
|
|
return FALSE; |
|
|
|
return TRUE; |
|
|
|
} |
|
|
|
@@ -283,11 +280,11 @@ pb_check_usage(unsigned requested, unsigned provided) |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Malloc-based buffer to store data that can't be used by the graphics |
|
|
|
* Malloc-based buffer to store data that can't be used by the graphics |
|
|
|
* hardware. |
|
|
|
*/ |
|
|
|
struct pb_buffer * |
|
|
|
pb_malloc_buffer_create(pb_size size, |
|
|
|
pb_malloc_buffer_create(pb_size size, |
|
|
|
const struct pb_desc *desc); |
|
|
|
|
|
|
|
|