freedreno: add flags param for rb creation

For now, we want a way for gallium to be able to provide hints for the
upcoming rb suballocation.  But could be useful for other things down
the road.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
main
Rob Clark 2018-10-10 08:37:23 -04:00
parent a8a0061926
commit bf001648a9
4 changed files with 25 additions and 14 deletions

View File

@ -48,6 +48,7 @@ fd_ringbuffer_emit_reloc_ring_full
fd_ringbuffer_flush fd_ringbuffer_flush
fd_ringbuffer_grow fd_ringbuffer_grow
fd_ringbuffer_new fd_ringbuffer_new
fd_ringbuffer_new_flags
fd_ringbuffer_new_object fd_ringbuffer_new_object
fd_ringbuffer_ref fd_ringbuffer_ref
fd_ringbuffer_reloc fd_ringbuffer_reloc

View File

@ -115,10 +115,6 @@ drm_private int fd_bo_cache_free(struct fd_bo_cache *cache, struct fd_bo *bo);
/* for where @table_lock is already held: */ /* for where @table_lock is already held: */
drm_private void fd_device_del_locked(struct fd_device *dev); drm_private void fd_device_del_locked(struct fd_device *dev);
enum fd_ringbuffer_flags {
FD_RINGBUFFER_OBJECT = 0x1,
};
struct fd_pipe_funcs { struct fd_pipe_funcs {
struct fd_ringbuffer * (*ringbuffer_new)(struct fd_pipe *pipe, uint32_t size, struct fd_ringbuffer * (*ringbuffer_new)(struct fd_pipe *pipe, uint32_t size,
enum fd_ringbuffer_flags flags); enum fd_ringbuffer_flags flags);

View File

@ -32,12 +32,19 @@
#include "freedreno_priv.h" #include "freedreno_priv.h"
#include "freedreno_ringbuffer.h" #include "freedreno_ringbuffer.h"
static struct fd_ringbuffer * drm_public struct fd_ringbuffer *
ringbuffer_new(struct fd_pipe *pipe, uint32_t size, fd_ringbuffer_new_flags(struct fd_pipe *pipe, uint32_t size,
enum fd_ringbuffer_flags flags) enum fd_ringbuffer_flags flags)
{ {
struct fd_ringbuffer *ring; struct fd_ringbuffer *ring;
/* we can't really support "growable" rb's in general for
* stateobj's since we need a single gpu addr (ie. can't
* do the trick of a chain of IB packets):
*/
if (flags & FD_RINGBUFFER_OBJECT)
assert(size);
ring = pipe->funcs->ringbuffer_new(pipe, size, flags); ring = pipe->funcs->ringbuffer_new(pipe, size, flags);
if (!ring) if (!ring)
return NULL; return NULL;
@ -55,18 +62,13 @@ ringbuffer_new(struct fd_pipe *pipe, uint32_t size,
drm_public struct fd_ringbuffer * drm_public struct fd_ringbuffer *
fd_ringbuffer_new(struct fd_pipe *pipe, uint32_t size) fd_ringbuffer_new(struct fd_pipe *pipe, uint32_t size)
{ {
return ringbuffer_new(pipe, size, 0); return fd_ringbuffer_new_flags(pipe, size, 0);
} }
drm_public struct fd_ringbuffer * drm_public struct fd_ringbuffer *
fd_ringbuffer_new_object(struct fd_pipe *pipe, uint32_t size) fd_ringbuffer_new_object(struct fd_pipe *pipe, uint32_t size)
{ {
/* we can't really support "growable" rb's in general for return fd_ringbuffer_new_flags(pipe, size, FD_RINGBUFFER_OBJECT);
* stateobj's since we need a single gpu addr (ie. can't
* do the trick of a chain of IB packets):
*/
assert(size);
return ringbuffer_new(pipe, size, FD_RINGBUFFER_OBJECT);
} }
drm_public void fd_ringbuffer_del(struct fd_ringbuffer *ring) drm_public void fd_ringbuffer_del(struct fd_ringbuffer *ring)

View File

@ -39,6 +39,15 @@
struct fd_ringbuffer_funcs; struct fd_ringbuffer_funcs;
struct fd_ringmarker; struct fd_ringmarker;
enum fd_ringbuffer_flags {
/* Ringbuffer is a "state object", which is potentially reused
* many times, rather than being used in one-shot mode linked
* to a parent ringbuffer.
*/
FD_RINGBUFFER_OBJECT = 0x1,
};
struct fd_ringbuffer { struct fd_ringbuffer {
int size; int size;
uint32_t *cur, *end, *start, *last_start; uint32_t *cur, *end, *start, *last_start;
@ -52,7 +61,7 @@ struct fd_ringbuffer {
*/ */
void *user; void *user;
uint32_t flags; enum fd_ringbuffer_flags flags;
/* This is a bit gross, but we can't use atomic_t in exported /* This is a bit gross, but we can't use atomic_t in exported
* headers. OTOH, we don't need the refcnt to be publicly * headers. OTOH, we don't need the refcnt to be publicly
@ -70,8 +79,11 @@ struct fd_ringbuffer {
struct fd_ringbuffer * fd_ringbuffer_new(struct fd_pipe *pipe, struct fd_ringbuffer * fd_ringbuffer_new(struct fd_pipe *pipe,
uint32_t size); uint32_t size);
will_be_deprecated
struct fd_ringbuffer * fd_ringbuffer_new_object(struct fd_pipe *pipe, struct fd_ringbuffer * fd_ringbuffer_new_object(struct fd_pipe *pipe,
uint32_t size); uint32_t size);
struct fd_ringbuffer * fd_ringbuffer_new_flags(struct fd_pipe *pipe,
uint32_t size, enum fd_ringbuffer_flags flags);
struct fd_ringbuffer *fd_ringbuffer_ref(struct fd_ringbuffer *ring); struct fd_ringbuffer *fd_ringbuffer_ref(struct fd_ringbuffer *ring);
void fd_ringbuffer_del(struct fd_ringbuffer *ring); void fd_ringbuffer_del(struct fd_ringbuffer *ring);