radv/winsys: Add binary syncobj ABI changes for timeline semaphores.
[mesa.git] / src / amd / vulkan / radv_radeon_winsys.h
index d9b46d89cf3402b6d79c4fdc63c8184a07a2f0db..37576327dfd6c01cc46b04f5fa555fa895e7081d 100644 (file)
 #include <stdint.h>
 #include <stdbool.h>
 #include <stdlib.h>
-#include "main/macros.h"
+#include <string.h>
+#include <vulkan/vulkan.h>
 #include "amd_family.h"
+#include "util/u_memory.h"
+#include "util/u_math.h"
 
 struct radeon_info;
 struct ac_surf_info;
 struct radeon_surf;
 
-#define FREE(x) free(x)
-
 enum radeon_bo_domain { /* bitfield */
        RADEON_DOMAIN_GTT  = 2,
        RADEON_DOMAIN_VRAM = 4,
-       RADEON_DOMAIN_VRAM_GTT = RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT
+       RADEON_DOMAIN_VRAM_GTT = RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT,
+       RADEON_DOMAIN_GDS = 8,
+       RADEON_DOMAIN_OA = 16,
 };
 
 enum radeon_bo_flag { /* bitfield */
@@ -58,6 +61,8 @@ enum radeon_bo_flag { /* bitfield */
        RADEON_FLAG_NO_INTERPROCESS_SHARING = (1 << 6),
        RADEON_FLAG_READ_ONLY =     (1 << 7),
        RADEON_FLAG_32BIT =         (1 << 8),
+       RADEON_FLAG_PREFER_LOCAL_BO = (1 << 9),
+       RADEON_FLAG_ZERO_VRAM = (1 << 10),
 };
 
 enum radeon_bo_usage { /* bitfield */
@@ -66,15 +71,6 @@ enum radeon_bo_usage { /* bitfield */
        RADEON_USAGE_READWRITE = RADEON_USAGE_READ | RADEON_USAGE_WRITE
 };
 
-enum ring_type {
-       RING_GFX = 0,
-       RING_COMPUTE,
-       RING_DMA,
-       RING_UVD,
-       RING_VCE,
-       RING_LAST,
-};
-
 enum radeon_ctx_priority {
        RADEON_CTX_PRIORITY_INVALID = -1,
        RADEON_CTX_PRIORITY_LOW = 0,
@@ -150,6 +146,7 @@ struct radeon_bo_metadata {
                struct {
                        /* surface flags */
                        unsigned swizzle_mode:5;
+                       bool scanout;
                } gfx9;
        } u;
 
@@ -161,16 +158,17 @@ struct radeon_bo_metadata {
        uint32_t                metadata[64];
 };
 
-uint32_t syncobj_handle;
 struct radeon_winsys_fence;
+struct radeon_winsys_ctx;
 
 struct radeon_winsys_bo {
        uint64_t va;
        bool is_local;
-       bool vram_cpu_access;
+       bool vram_no_cpu_access;
 };
 struct radv_winsys_sem_counts {
        uint32_t syncobj_count;
+       uint32_t syncobj_reset_count; /* for wait only, whether to reset the syncobj */
        uint32_t sem_count;
        uint32_t *syncobj;
        struct radeon_winsys_sem **sem;
@@ -188,6 +186,27 @@ struct radv_winsys_bo_list {
        unsigned count;
 };
 
+/* Kernel effectively allows 0-31. This sets some priorities for fixed
+ * functionality buffers */
+enum {
+       RADV_BO_PRIORITY_APPLICATION_MAX = 28,
+
+       /* virtual buffers have 0 priority since the priority is not used. */
+       RADV_BO_PRIORITY_VIRTUAL = 0,
+
+       /* This should be considerably lower than most of the stuff below,
+        * but how much lower is hard to say since we don't know application
+        * assignments. Put it pretty high since it is GTT anyway. */
+       RADV_BO_PRIORITY_QUERY_POOL = 29,
+
+       RADV_BO_PRIORITY_DESCRIPTOR = 30,
+       RADV_BO_PRIORITY_UPLOAD_BUFFER = 30,
+       RADV_BO_PRIORITY_FENCE = 30,
+       RADV_BO_PRIORITY_SHADER = 31,
+       RADV_BO_PRIORITY_SCRATCH = 31,
+       RADV_BO_PRIORITY_CS = 31,
+};
+
 struct radeon_winsys {
        void (*destroy)(struct radeon_winsys *ws);
 
@@ -206,23 +225,30 @@ struct radeon_winsys {
                                                  uint64_t size,
                                                  unsigned alignment,
                                                  enum radeon_bo_domain domain,
-                                                 enum radeon_bo_flag flags);
+                                                 enum radeon_bo_flag flags,
+                                                 unsigned priority);
 
        void (*buffer_destroy)(struct radeon_winsys_bo *bo);
        void *(*buffer_map)(struct radeon_winsys_bo *bo);
 
        struct radeon_winsys_bo *(*buffer_from_ptr)(struct radeon_winsys *ws,
                                                    void *pointer,
-                                                   uint64_t size);
+                                                   uint64_t size,
+                                                   unsigned priority);
 
        struct radeon_winsys_bo *(*buffer_from_fd)(struct radeon_winsys *ws,
                                                   int fd,
-                                                  unsigned *stride, unsigned *offset);
+                                                  unsigned priority,
+                                                  uint64_t *alloc_size);
 
        bool (*buffer_get_fd)(struct radeon_winsys *ws,
                              struct radeon_winsys_bo *bo,
                              int *fd);
 
+       bool (*buffer_get_flags_from_fd)(struct radeon_winsys *ws, int fd,
+                                        enum radeon_bo_domain *domains,
+                                        enum radeon_bo_flag *flags);
+
        void (*buffer_unmap)(struct radeon_winsys_bo *bo);
 
        void (*buffer_set_metadata)(struct radeon_winsys_bo *bo,
@@ -230,11 +256,12 @@ struct radeon_winsys {
        void (*buffer_get_metadata)(struct radeon_winsys_bo *bo,
                                    struct radeon_bo_metadata *md);
 
-       void (*buffer_virtual_bind)(struct radeon_winsys_bo *parent,
-                                   uint64_t offset, uint64_t size,
-                                   struct radeon_winsys_bo *bo, uint64_t bo_offset);
-       struct radeon_winsys_ctx *(*ctx_create)(struct radeon_winsys *ws,
-                                               enum radeon_ctx_priority priority);
+       VkResult (*buffer_virtual_bind)(struct radeon_winsys_bo *parent,
+                                       uint64_t offset, uint64_t size,
+                                       struct radeon_winsys_bo *bo, uint64_t bo_offset);
+       VkResult (*ctx_create)(struct radeon_winsys *ws,
+                              enum radeon_ctx_priority priority,
+                              struct radeon_winsys_ctx **ctx);
        void (*ctx_destroy)(struct radeon_winsys_ctx *ctx);
 
        bool (*ctx_wait_idle)(struct radeon_winsys_ctx *ctx,
@@ -247,20 +274,20 @@ struct radeon_winsys {
 
        void (*cs_reset)(struct radeon_cmdbuf *cs);
 
-       bool (*cs_finalize)(struct radeon_cmdbuf *cs);
+       VkResult (*cs_finalize)(struct radeon_cmdbuf *cs);
 
        void (*cs_grow)(struct radeon_cmdbuf * cs, size_t min_size);
 
-       int (*cs_submit)(struct radeon_winsys_ctx *ctx,
-                        int queue_index,
-                        struct radeon_cmdbuf **cs_array,
-                        unsigned cs_count,
-                        struct radeon_cmdbuf *initial_preamble_cs,
-                        struct radeon_cmdbuf *continue_preamble_cs,
-                        struct radv_winsys_sem_info *sem_info,
-                        const struct radv_winsys_bo_list *bo_list, /* optional */
-                        bool can_patch,
-                        struct radeon_winsys_fence *fence);
+       VkResult (*cs_submit)(struct radeon_winsys_ctx *ctx,
+                             int queue_index,
+                             struct radeon_cmdbuf **cs_array,
+                             unsigned cs_count,
+                             struct radeon_cmdbuf *initial_preamble_cs,
+                             struct radeon_cmdbuf *continue_preamble_cs,
+                             struct radv_winsys_sem_info *sem_info,
+                             const struct radv_winsys_bo_list *bo_list, /* optional */
+                             bool can_patch,
+                             struct radeon_winsys_fence *fence);
 
        void (*cs_add_buffer)(struct radeon_cmdbuf *cs,
                              struct radeon_winsys_bo *bo);
@@ -276,6 +303,9 @@ struct radeon_winsys {
 
        struct radeon_winsys_fence *(*create_fence)();
        void (*destroy_fence)(struct radeon_winsys_fence *fence);
+       void (*reset_fence)(struct radeon_winsys_fence *fence);
+       void (*signal_fence)(struct radeon_winsys_fence *fence);
+       bool (*is_fence_waitable)(struct radeon_winsys_fence *fence);
        bool (*fence_wait)(struct radeon_winsys *ws,
                           struct radeon_winsys_fence *fence,
                           bool absolute,
@@ -291,7 +321,8 @@ struct radeon_winsys {
        void (*destroy_sem)(struct radeon_winsys_sem *sem);
 
        /* new shareable sync objects */
-       int (*create_syncobj)(struct radeon_winsys *ws, uint32_t *handle);
+       int (*create_syncobj)(struct radeon_winsys *ws, bool create_signaled,
+                             uint32_t *handle);
        void (*destroy_syncobj)(struct radeon_winsys *ws, uint32_t handle);
 
        void (*reset_syncobj)(struct radeon_winsys *ws, uint32_t handle);