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
parent
a8a0061926
commit
bf001648a9
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue