summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2016-05-06 21:16:05 -0500
committerNicolai Hähnle <[email protected]>2016-06-01 22:52:19 +0200
commitf80c6abb9e591d788c7c8f5167dcd7cb744e8b4a (patch)
treecfc95e5fb031ec4f4fb7ac2d2b5eb94baa11616d /src
parent9e5ed559babc468b94877ecc8e2367b70c43122f (diff)
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/winsys/amdgpu/drm/amdgpu_cs.c4
-rw-r--r--src/gallium/winsys/amdgpu/drm/amdgpu_cs.h40
2 files changed, 37 insertions, 7 deletions
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
index 100b8372c3c..f070307e25e 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
@@ -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;
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
index 69e5995f2c8..25bad07af3e 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
@@ -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)