Home | History | Annotate | Download | only in vulkan
      1 /*
      2  * Copyright  2016 Red Hat.
      3  * Copyright  2016 Bas Nieuwenhuizen
      4  *
      5  * Based on radeon_winsys.h which is:
      6  * Copyright 2008 Corbin Simpson <MostAwesomeDude (at) gmail.com>
      7  * Copyright 2010 Marek Olk <maraeo (at) gmail.com>
      8  *
      9  * Permission is hereby granted, free of charge, to any person obtaining a
     10  * copy of this software and associated documentation files (the "Software"),
     11  * to deal in the Software without restriction, including without limitation
     12  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     13  * and/or sell copies of the Software, and to permit persons to whom the
     14  * Software is furnished to do so, subject to the following conditions:
     15  *
     16  * The above copyright notice and this permission notice (including the next
     17  * paragraph) shall be included in all copies or substantial portions of the
     18  * Software.
     19  *
     20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     23  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     25  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     26  * IN THE SOFTWARE.
     27  */
     28 
     29 #ifndef RADV_RADEON_WINSYS_H
     30 #define RADV_RADEON_WINSYS_H
     31 
     32 #include <stdint.h>
     33 #include <stdbool.h>
     34 #include <stdlib.h>
     35 #include "main/macros.h"
     36 #include "amd_family.h"
     37 
     38 struct radeon_info;
     39 struct ac_surf_info;
     40 struct radeon_surf;
     41 
     42 #define FREE(x) free(x)
     43 
     44 enum radeon_bo_domain { /* bitfield */
     45 	RADEON_DOMAIN_GTT  = 2,
     46 	RADEON_DOMAIN_VRAM = 4,
     47 	RADEON_DOMAIN_VRAM_GTT = RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT
     48 };
     49 
     50 enum radeon_bo_flag { /* bitfield */
     51 	RADEON_FLAG_GTT_WC =        (1 << 0),
     52 	RADEON_FLAG_CPU_ACCESS =    (1 << 1),
     53 	RADEON_FLAG_NO_CPU_ACCESS = (1 << 2),
     54 	RADEON_FLAG_VIRTUAL =       (1 << 3),
     55 	RADEON_FLAG_VA_UNCACHED =   (1 << 4),
     56 	RADEON_FLAG_IMPLICIT_SYNC = (1 << 5),
     57 	RADEON_FLAG_NO_INTERPROCESS_SHARING = (1 << 6),
     58 	RADEON_FLAG_READ_ONLY =     (1 << 7),
     59 };
     60 
     61 enum radeon_bo_usage { /* bitfield */
     62 	RADEON_USAGE_READ = 2,
     63 	RADEON_USAGE_WRITE = 4,
     64 	RADEON_USAGE_READWRITE = RADEON_USAGE_READ | RADEON_USAGE_WRITE
     65 };
     66 
     67 enum ring_type {
     68 	RING_GFX = 0,
     69 	RING_COMPUTE,
     70 	RING_DMA,
     71 	RING_UVD,
     72 	RING_VCE,
     73 	RING_LAST,
     74 };
     75 
     76 enum radeon_ctx_priority {
     77 	RADEON_CTX_PRIORITY_INVALID = -1,
     78 	RADEON_CTX_PRIORITY_LOW = 0,
     79 	RADEON_CTX_PRIORITY_MEDIUM,
     80 	RADEON_CTX_PRIORITY_HIGH,
     81 	RADEON_CTX_PRIORITY_REALTIME,
     82 };
     83 
     84 enum radeon_value_id {
     85 	RADEON_TIMESTAMP,
     86 	RADEON_NUM_BYTES_MOVED,
     87 	RADEON_NUM_EVICTIONS,
     88 	RADEON_NUM_VRAM_CPU_PAGE_FAULTS,
     89 	RADEON_VRAM_USAGE,
     90 	RADEON_VRAM_VIS_USAGE,
     91 	RADEON_GTT_USAGE,
     92 	RADEON_GPU_TEMPERATURE,
     93 	RADEON_CURRENT_SCLK,
     94 	RADEON_CURRENT_MCLK,
     95 };
     96 
     97 struct radeon_winsys_cs {
     98 	unsigned cdw;  /* Number of used dwords. */
     99 	unsigned max_dw; /* Maximum number of dwords. */
    100 	uint32_t *buf; /* The base pointer of the chunk. */
    101 };
    102 
    103 #define RADEON_SURF_TYPE_MASK                   0xFF
    104 #define RADEON_SURF_TYPE_SHIFT                  0
    105 #define     RADEON_SURF_TYPE_1D                     0
    106 #define     RADEON_SURF_TYPE_2D                     1
    107 #define     RADEON_SURF_TYPE_3D                     2
    108 #define     RADEON_SURF_TYPE_CUBEMAP                3
    109 #define     RADEON_SURF_TYPE_1D_ARRAY               4
    110 #define     RADEON_SURF_TYPE_2D_ARRAY               5
    111 #define RADEON_SURF_MODE_MASK                   0xFF
    112 #define RADEON_SURF_MODE_SHIFT                  8
    113 
    114 #define RADEON_SURF_GET(v, field)   (((v) >> RADEON_SURF_ ## field ## _SHIFT) & RADEON_SURF_ ## field ## _MASK)
    115 #define RADEON_SURF_SET(v, field)   (((v) & RADEON_SURF_ ## field ## _MASK) << RADEON_SURF_ ## field ## _SHIFT)
    116 #define RADEON_SURF_CLR(v, field)   ((v) & ~(RADEON_SURF_ ## field ## _MASK << RADEON_SURF_ ## field ## _SHIFT))
    117 
    118 enum radeon_bo_layout {
    119 	RADEON_LAYOUT_LINEAR = 0,
    120 	RADEON_LAYOUT_TILED,
    121 	RADEON_LAYOUT_SQUARETILED,
    122 
    123 	RADEON_LAYOUT_UNKNOWN
    124 };
    125 
    126 /* Tiling info for display code, DRI sharing, and other data. */
    127 struct radeon_bo_metadata {
    128 	/* Tiling flags describing the texture layout for display code
    129 	 * and DRI sharing.
    130 	 */
    131 	union {
    132 		struct {
    133 			enum radeon_bo_layout   microtile;
    134 			enum radeon_bo_layout   macrotile;
    135 			unsigned                pipe_config;
    136 			unsigned                bankw;
    137 			unsigned                bankh;
    138 			unsigned                tile_split;
    139 			unsigned                mtilea;
    140 			unsigned                num_banks;
    141 			unsigned                stride;
    142 			bool                    scanout;
    143 		} legacy;
    144 
    145 		struct {
    146 			/* surface flags */
    147 			unsigned swizzle_mode:5;
    148 		} gfx9;
    149 	} u;
    150 
    151 	/* Additional metadata associated with the buffer, in bytes.
    152 	 * The maximum size is 64 * 4. This is opaque for the winsys & kernel.
    153 	 * Supported by amdgpu only.
    154 	 */
    155 	uint32_t                size_metadata;
    156 	uint32_t                metadata[64];
    157 };
    158 
    159 uint32_t syncobj_handle;
    160 struct radeon_winsys_fence;
    161 
    162 struct radeon_winsys_bo {
    163 	uint64_t va;
    164 	bool is_local;
    165 };
    166 struct radv_winsys_sem_counts {
    167 	uint32_t syncobj_count;
    168 	uint32_t sem_count;
    169 	uint32_t *syncobj;
    170 	struct radeon_winsys_sem **sem;
    171 };
    172 
    173 struct radv_winsys_sem_info {
    174 	bool cs_emit_signal;
    175 	bool cs_emit_wait;
    176 	struct radv_winsys_sem_counts wait;
    177 	struct radv_winsys_sem_counts signal;
    178 };
    179 
    180 struct radeon_winsys {
    181 	void (*destroy)(struct radeon_winsys *ws);
    182 
    183 	void (*query_info)(struct radeon_winsys *ws,
    184 			   struct radeon_info *info);
    185 
    186 	uint64_t (*query_value)(struct radeon_winsys *ws,
    187 				enum radeon_value_id value);
    188 
    189 	bool (*read_registers)(struct radeon_winsys *ws, unsigned reg_offset,
    190 			       unsigned num_registers, uint32_t *out);
    191 
    192 	const char *(*get_chip_name)(struct radeon_winsys *ws);
    193 
    194 	struct radeon_winsys_bo *(*buffer_create)(struct radeon_winsys *ws,
    195 						  uint64_t size,
    196 						  unsigned alignment,
    197 						  enum radeon_bo_domain domain,
    198 						  enum radeon_bo_flag flags);
    199 
    200 	void (*buffer_destroy)(struct radeon_winsys_bo *bo);
    201 	void *(*buffer_map)(struct radeon_winsys_bo *bo);
    202 
    203 	struct radeon_winsys_bo *(*buffer_from_fd)(struct radeon_winsys *ws,
    204 						   int fd,
    205 						   unsigned *stride, unsigned *offset);
    206 
    207 	bool (*buffer_get_fd)(struct radeon_winsys *ws,
    208 			      struct radeon_winsys_bo *bo,
    209 			      int *fd);
    210 
    211 	void (*buffer_unmap)(struct radeon_winsys_bo *bo);
    212 
    213 	void (*buffer_set_metadata)(struct radeon_winsys_bo *bo,
    214 				    struct radeon_bo_metadata *md);
    215 
    216 	void (*buffer_virtual_bind)(struct radeon_winsys_bo *parent,
    217 	                            uint64_t offset, uint64_t size,
    218 	                            struct radeon_winsys_bo *bo, uint64_t bo_offset);
    219 	struct radeon_winsys_ctx *(*ctx_create)(struct radeon_winsys *ws,
    220 						enum radeon_ctx_priority priority);
    221 	void (*ctx_destroy)(struct radeon_winsys_ctx *ctx);
    222 
    223 	bool (*ctx_wait_idle)(struct radeon_winsys_ctx *ctx,
    224 	                      enum ring_type ring_type, int ring_index);
    225 
    226 	struct radeon_winsys_cs *(*cs_create)(struct radeon_winsys *ws,
    227 					      enum ring_type ring_type);
    228 
    229 	void (*cs_destroy)(struct radeon_winsys_cs *cs);
    230 
    231 	void (*cs_reset)(struct radeon_winsys_cs *cs);
    232 
    233 	bool (*cs_finalize)(struct radeon_winsys_cs *cs);
    234 
    235 	void (*cs_grow)(struct radeon_winsys_cs * cs, size_t min_size);
    236 
    237 	int (*cs_submit)(struct radeon_winsys_ctx *ctx,
    238 			 int queue_index,
    239 			 struct radeon_winsys_cs **cs_array,
    240 			 unsigned cs_count,
    241 			 struct radeon_winsys_cs *initial_preamble_cs,
    242 			 struct radeon_winsys_cs *continue_preamble_cs,
    243 			 struct radv_winsys_sem_info *sem_info,
    244 			 bool can_patch,
    245 			 struct radeon_winsys_fence *fence);
    246 
    247 	void (*cs_add_buffer)(struct radeon_winsys_cs *cs,
    248 			      struct radeon_winsys_bo *bo,
    249 			      uint8_t priority);
    250 
    251 	void (*cs_execute_secondary)(struct radeon_winsys_cs *parent,
    252 				    struct radeon_winsys_cs *child);
    253 
    254 	void (*cs_dump)(struct radeon_winsys_cs *cs, FILE* file, const int *trace_ids, int trace_id_count);
    255 
    256 	int (*surface_init)(struct radeon_winsys *ws,
    257 			    const struct ac_surf_info *surf_info,
    258 			    struct radeon_surf *surf);
    259 
    260 	int (*surface_best)(struct radeon_winsys *ws,
    261 			    struct radeon_surf *surf);
    262 
    263 	struct radeon_winsys_fence *(*create_fence)();
    264 	void (*destroy_fence)(struct radeon_winsys_fence *fence);
    265 	bool (*fence_wait)(struct radeon_winsys *ws,
    266 			   struct radeon_winsys_fence *fence,
    267 			   bool absolute,
    268 			   uint64_t timeout);
    269 
    270 	/* old semaphores - non shareable */
    271 	struct radeon_winsys_sem *(*create_sem)(struct radeon_winsys *ws);
    272 	void (*destroy_sem)(struct radeon_winsys_sem *sem);
    273 
    274 	/* new shareable sync objects */
    275 	int (*create_syncobj)(struct radeon_winsys *ws, uint32_t *handle);
    276 	void (*destroy_syncobj)(struct radeon_winsys *ws, uint32_t handle);
    277 
    278 	void (*reset_syncobj)(struct radeon_winsys *ws, uint32_t handle);
    279 	void (*signal_syncobj)(struct radeon_winsys *ws, uint32_t handle);
    280 	bool (*wait_syncobj)(struct radeon_winsys *ws, uint32_t handle, uint64_t timeout);
    281 
    282 	int (*export_syncobj)(struct radeon_winsys *ws, uint32_t syncobj, int *fd);
    283 	int (*import_syncobj)(struct radeon_winsys *ws, int fd, uint32_t *syncobj);
    284 
    285 	int (*export_syncobj_to_sync_file)(struct radeon_winsys *ws, uint32_t syncobj, int *fd);
    286 
    287 	/* Note that this, unlike the normal import, uses an existing syncobj. */
    288 	int (*import_syncobj_from_sync_file)(struct radeon_winsys *ws, uint32_t syncobj, int fd);
    289 
    290 };
    291 
    292 static inline void radeon_emit(struct radeon_winsys_cs *cs, uint32_t value)
    293 {
    294 	cs->buf[cs->cdw++] = value;
    295 }
    296 
    297 static inline void radeon_emit_array(struct radeon_winsys_cs *cs,
    298 				     const uint32_t *values, unsigned count)
    299 {
    300 	memcpy(cs->buf + cs->cdw, values, count * 4);
    301 	cs->cdw += count;
    302 }
    303 
    304 static inline uint64_t radv_buffer_get_va(struct radeon_winsys_bo *bo)
    305 {
    306 	return bo->va;
    307 }
    308 
    309 static inline void radv_cs_add_buffer(struct radeon_winsys *ws,
    310 				      struct radeon_winsys_cs *cs,
    311 				      struct radeon_winsys_bo *bo,
    312 				      uint8_t priority)
    313 {
    314 	if (bo->is_local)
    315 		return;
    316 
    317 	ws->cs_add_buffer(cs, bo, priority);
    318 }
    319 
    320 #endif /* RADV_RADEON_WINSYS_H */
    321