X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fwinsys%2Famdgpu%2Fdrm%2Famdgpu_bo.h;h=ace651dff4f15ded248667f8d6d6c721070116d3;hb=7a6af4c5edb314207bb8fd0faab1becd64b2efa0;hp=cf7f8f475260e42e2fac99c6e1a8e54bc1d9caa6;hpb=6f4e74d165fd6f35ded1a0c2121b659a0c6347b8;p=mesa.git diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h index cf7f8f47526..ace651dff4f 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h @@ -25,46 +25,138 @@ * next paragraph) shall be included in all copies or substantial portions * of the Software. */ -/* - * Authors: - * Marek Olšák - */ #ifndef AMDGPU_BO_H #define AMDGPU_BO_H #include "amdgpu_winsys.h" -#include "pipebuffer/pb_bufmgr.h" + +#include "pipebuffer/pb_slab.h" + +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; - struct pb_cache_entry cache_entry; + 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 amdgpu_winsys *rws; - void *user_ptr; /* from buffer_from_ptr */ + struct list_head backing; - amdgpu_bo_handle bo; + /* Commitment information for each page of the virtual memory area. */ + struct amdgpu_sparse_commitment *commitments; + } sparse; + } u; + + 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; - bool use_reusable_pool; + 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 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_init_functions(struct amdgpu_winsys *ws); +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,