* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*/
-/*
- * Authors:
- * Marek Olšák <maraeo@gmail.com>
- */
#ifndef AMDGPU_BO_H
#define AMDGPU_BO_H
#include "amdgpu_winsys.h"
-#include "pipebuffer/pb_bufmgr.h"
-struct amdgpu_bo_desc {
- struct pb_desc base;
+#include "pipebuffer/pb_slab.h"
- enum radeon_bo_domain initial_domain;
- unsigned flags;
+struct amdgpu_sparse_backing_chunk;
+
+/*
+ * Sub-allocation information for a real buffer used as backing memory of a
+ * sparse buffer.
+ */
+struct amdgpu_sparse_backing {
+ struct list_head list;
+
+ struct amdgpu_winsys_bo *bo;
+
+ /* Sorted list of free chunks. */
+ struct amdgpu_sparse_backing_chunk *chunks;
+ uint32_t max_chunks;
+ uint32_t num_chunks;
+};
+
+struct amdgpu_sparse_commitment {
+ struct amdgpu_sparse_backing *backing;
+ uint32_t page;
};
struct amdgpu_winsys_bo {
struct pb_buffer base;
+ union {
+ struct {
+ struct pb_cache_entry cache_entry;
+
+ amdgpu_va_handle va_handle;
+ int map_count;
+ bool use_reusable_pool;
+
+ struct list_head global_list_item;
+
+ uint32_t kms_handle;
+ } real;
+ struct {
+ struct pb_slab_entry entry;
+ struct amdgpu_winsys_bo *real;
+ } slab;
+ struct {
+ amdgpu_va_handle va_handle;
+ enum radeon_bo_flag flags;
+
+ uint32_t num_va_pages;
+ uint32_t num_backing_pages;
+
+ struct list_head backing;
- struct amdgpu_winsys *rws;
- void *user_ptr; /* from buffer_from_ptr */
+ /* Commitment information for each page of the virtual memory area. */
+ struct amdgpu_sparse_commitment *commitments;
+ } sparse;
+ } u;
- amdgpu_bo_handle bo;
+ struct amdgpu_winsys *ws;
+ void *cpu_ptr; /* for user_ptr and permanent maps */
+
+ amdgpu_bo_handle bo; /* NULL for slab entries and sparse buffers */
+ bool sparse;
+ bool is_user_ptr;
uint32_t unique_id;
- amdgpu_va_handle va_handle;
uint64_t va;
enum radeon_bo_domain initial_domain;
+ enum radeon_bo_flag flags;
/* how many command streams is this bo referenced in? */
int num_cs_references;
+ /* how many command streams, which are being emitted in a separate
+ * thread, is this bo referenced in? */
+ volatile int num_active_ioctls;
+
/* whether buffer_get_handle or buffer_from_handle was called,
* it can only transition from false to true
*/
volatile int is_shared; /* bool (int for atomicity) */
/* Fences for buffer synchronization. */
- struct pipe_fence_handle *fence[RING_LAST];
+ unsigned num_fences;
+ unsigned max_fences;
+ struct pipe_fence_handle **fences;
+
+ simple_mtx_t lock;
};
-struct pb_manager *amdgpu_bomgr_create(struct amdgpu_winsys *rws);
-void amdgpu_bomgr_init_functions(struct amdgpu_winsys *ws);
+struct amdgpu_slab {
+ struct pb_slab base;
+ struct amdgpu_winsys_bo *buffer;
+ struct amdgpu_winsys_bo *entries;
+};
+
+bool amdgpu_bo_can_reclaim(struct pb_buffer *_buf);
+struct pb_buffer *amdgpu_bo_create(struct amdgpu_winsys *ws,
+ uint64_t size,
+ unsigned alignment,
+ enum radeon_bo_domain domain,
+ enum radeon_bo_flag flags);
+void amdgpu_bo_destroy(struct pb_buffer *_buf);
+void *amdgpu_bo_map(struct pb_buffer *buf,
+ struct radeon_cmdbuf *rcs,
+ enum pipe_transfer_usage usage);
+void amdgpu_bo_unmap(struct pb_buffer *buf);
+void amdgpu_bo_init_functions(struct amdgpu_screen_winsys *ws);
+
+bool amdgpu_bo_can_reclaim_slab(void *priv, struct pb_slab_entry *entry);
+struct pb_slab *amdgpu_bo_slab_alloc_encrypted(void *priv, unsigned heap,
+ unsigned entry_size,
+ unsigned group_index);
+struct pb_slab *amdgpu_bo_slab_alloc_normal(void *priv, unsigned heap,
+ unsigned entry_size,
+ unsigned group_index);
+void amdgpu_bo_slab_free(void *priv, struct pb_slab *slab);
+
+static inline
+struct amdgpu_winsys_bo *amdgpu_winsys_bo(struct pb_buffer *bo)
+{
+ return (struct amdgpu_winsys_bo *)bo;
+}
+
+static inline
+struct amdgpu_slab *amdgpu_slab(struct pb_slab *slab)
+{
+ return (struct amdgpu_slab *)slab;
+}
static inline
void amdgpu_winsys_bo_reference(struct amdgpu_winsys_bo **dst,