winsys/amdgpu: add amdgpu_ib and amdgpu_cs_from_ib helper functions

The latter function allows getting the containing amdgpu_cs from any IB
(including non-main ones).

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Nicolai Hähnle 2016-05-06 21:16:05 -05:00
parent 9e5ed559ba
commit f80c6abb9e
2 changed files with 37 additions and 7 deletions

View file

@ -531,6 +531,10 @@ amdgpu_cs_create(struct radeon_winsys_ctx *rwctx,
cs->flush_data = flush_ctx;
cs->ring_type = ring_type;
cs->main.ib_type = IB_MAIN;
cs->const_ib.ib_type = IB_CONST;
cs->const_preamble_ib.ib_type = IB_CONST_PREAMBLE;
if (!amdgpu_init_cs_context(&cs->csc1, ring_type)) {
FREE(cs);
return NULL;

View file

@ -50,6 +50,13 @@ struct amdgpu_cs_buffer {
enum radeon_bo_domain domains;
};
enum ib_type {
IB_CONST_PREAMBLE = 0,
IB_CONST = 1, /* the const IB must be first */
IB_MAIN = 2,
IB_NUM
};
struct amdgpu_ib {
struct radeon_winsys_cs base;
@ -57,13 +64,7 @@ struct amdgpu_ib {
struct pb_buffer *big_ib_buffer;
uint8_t *ib_mapped;
unsigned used_ib_space;
};
enum ib_type {
IB_CONST_PREAMBLE = 0,
IB_CONST = 1, /* the const IB must be first */
IB_MAIN = 2,
IB_NUM
enum ib_type ib_type;
};
struct amdgpu_cs_context {
@ -148,12 +149,37 @@ static inline void amdgpu_fence_reference(struct pipe_fence_handle **dst,
int amdgpu_lookup_buffer(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo);
static inline struct amdgpu_ib *
amdgpu_ib(struct radeon_winsys_cs *base)
{
return (struct amdgpu_ib *)base;
}
static inline struct amdgpu_cs *
amdgpu_cs(struct radeon_winsys_cs *base)
{
assert(amdgpu_ib(base)->ib_type == IB_MAIN);
return (struct amdgpu_cs*)base;
}
#define get_container(member_ptr, container_type, container_member) \
(container_type *)((char *)(member_ptr) - offsetof(container_type, container_member))
static inline struct amdgpu_cs *
amdgpu_cs_from_ib(struct amdgpu_ib *ib)
{
switch (ib->ib_type) {
case IB_MAIN:
return get_container(ib, struct amdgpu_cs, main);
case IB_CONST:
return get_container(ib, struct amdgpu_cs, const_ib);
case IB_CONST_PREAMBLE:
return get_container(ib, struct amdgpu_cs, const_preamble_ib);
default:
unreachable("bad ib_type");
}
}
static inline boolean
amdgpu_bo_is_referenced_by_cs(struct amdgpu_cs *cs,
struct amdgpu_winsys_bo *bo)