Home | History | Annotate | Download | only in vulkan
      1 /*
      2  * Copyright  2016 Red Hat.
      3  * Copyright  2016 Bas Nieuwenhuizen
      4  *
      5  * based in part on anv driver which is:
      6  * Copyright  2015 Intel Corporation
      7  *
      8  * Permission is hereby granted, free of charge, to any person obtaining a
      9  * copy of this software and associated documentation files (the "Software"),
     10  * to deal in the Software without restriction, including without limitation
     11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     12  * and/or sell copies of the Software, and to permit persons to whom the
     13  * Software is furnished to do so, subject to the following conditions:
     14  *
     15  * The above copyright notice and this permission notice (including the next
     16  * paragraph) shall be included in all copies or substantial portions of the
     17  * Software.
     18  *
     19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     22  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     23  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     24  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     25  * IN THE SOFTWARE.
     26  */
     27 
     28 #ifndef RADV_PRIVATE_H
     29 #define RADV_PRIVATE_H
     30 
     31 #include <stdlib.h>
     32 #include <stdio.h>
     33 #include <stdbool.h>
     34 #include <pthread.h>
     35 #include <assert.h>
     36 #include <stdint.h>
     37 #include <string.h>
     38 #ifdef HAVE_VALGRIND
     39 #include <valgrind.h>
     40 #include <memcheck.h>
     41 #define VG(x) x
     42 #else
     43 #define VG(x)
     44 #endif
     45 
     46 #include <amdgpu.h>
     47 #include "compiler/shader_enums.h"
     48 #include "util/macros.h"
     49 #include "util/list.h"
     50 #include "util/vk_alloc.h"
     51 #include "main/macros.h"
     52 
     53 #include "radv_radeon_winsys.h"
     54 #include "ac_binary.h"
     55 #include "ac_nir_to_llvm.h"
     56 #include "radv_descriptor_set.h"
     57 
     58 #include <llvm-c/TargetMachine.h>
     59 
     60 /* Pre-declarations needed for WSI entrypoints */
     61 struct wl_surface;
     62 struct wl_display;
     63 typedef struct xcb_connection_t xcb_connection_t;
     64 typedef uint32_t xcb_visualid_t;
     65 typedef uint32_t xcb_window_t;
     66 
     67 #include <vulkan/vulkan.h>
     68 #include <vulkan/vulkan_intel.h>
     69 #include <vulkan/vk_icd.h>
     70 
     71 #include "radv_entrypoints.h"
     72 
     73 #include "wsi_common.h"
     74 
     75 #define MAX_VBS         32
     76 #define MAX_VERTEX_ATTRIBS 32
     77 #define MAX_RTS          8
     78 #define MAX_VIEWPORTS   16
     79 #define MAX_SCISSORS    16
     80 #define MAX_PUSH_CONSTANTS_SIZE 128
     81 #define MAX_DYNAMIC_BUFFERS 16
     82 #define MAX_SAMPLES_LOG2 4
     83 #define NUM_META_FS_KEYS 11
     84 #define RADV_MAX_DRM_DEVICES 8
     85 
     86 #define NUM_DEPTH_CLEAR_PIPELINES 3
     87 
     88 enum radv_mem_heap {
     89 	RADV_MEM_HEAP_VRAM,
     90 	RADV_MEM_HEAP_VRAM_CPU_ACCESS,
     91 	RADV_MEM_HEAP_GTT,
     92 	RADV_MEM_HEAP_COUNT
     93 };
     94 
     95 enum radv_mem_type {
     96 	RADV_MEM_TYPE_VRAM,
     97 	RADV_MEM_TYPE_GTT_WRITE_COMBINE,
     98 	RADV_MEM_TYPE_VRAM_CPU_ACCESS,
     99 	RADV_MEM_TYPE_GTT_CACHED,
    100 	RADV_MEM_TYPE_COUNT
    101 };
    102 
    103 
    104 enum {
    105 	RADV_DEBUG_FAST_CLEARS       =   0x1,
    106 	RADV_DEBUG_NO_DCC            =   0x2,
    107 	RADV_DEBUG_DUMP_SHADERS      =   0x4,
    108 	RADV_DEBUG_NO_CACHE          =   0x8,
    109 	RADV_DEBUG_DUMP_SHADER_STATS =  0x10,
    110 	RADV_DEBUG_NO_HIZ            =  0x20,
    111 	RADV_DEBUG_NO_COMPUTE_QUEUE  =  0x40,
    112 	RADV_DEBUG_UNSAFE_MATH       =  0x80,
    113 };
    114 
    115 #define radv_printflike(a, b) __attribute__((__format__(__printf__, a, b)))
    116 
    117 static inline uint32_t
    118 align_u32(uint32_t v, uint32_t a)
    119 {
    120 	assert(a != 0 && a == (a & -a));
    121 	return (v + a - 1) & ~(a - 1);
    122 }
    123 
    124 static inline uint32_t
    125 align_u32_npot(uint32_t v, uint32_t a)
    126 {
    127 	return (v + a - 1) / a * a;
    128 }
    129 
    130 static inline uint64_t
    131 align_u64(uint64_t v, uint64_t a)
    132 {
    133 	assert(a != 0 && a == (a & -a));
    134 	return (v + a - 1) & ~(a - 1);
    135 }
    136 
    137 static inline int32_t
    138 align_i32(int32_t v, int32_t a)
    139 {
    140 	assert(a != 0 && a == (a & -a));
    141 	return (v + a - 1) & ~(a - 1);
    142 }
    143 
    144 /** Alignment must be a power of 2. */
    145 static inline bool
    146 radv_is_aligned(uintmax_t n, uintmax_t a)
    147 {
    148 	assert(a == (a & -a));
    149 	return (n & (a - 1)) == 0;
    150 }
    151 
    152 static inline uint32_t
    153 round_up_u32(uint32_t v, uint32_t a)
    154 {
    155 	return (v + a - 1) / a;
    156 }
    157 
    158 static inline uint64_t
    159 round_up_u64(uint64_t v, uint64_t a)
    160 {
    161 	return (v + a - 1) / a;
    162 }
    163 
    164 static inline uint32_t
    165 radv_minify(uint32_t n, uint32_t levels)
    166 {
    167 	if (unlikely(n == 0))
    168 		return 0;
    169 	else
    170 		return MAX2(n >> levels, 1);
    171 }
    172 static inline float
    173 radv_clamp_f(float f, float min, float max)
    174 {
    175 	assert(min < max);
    176 
    177 	if (f > max)
    178 		return max;
    179 	else if (f < min)
    180 		return min;
    181 	else
    182 		return f;
    183 }
    184 
    185 static inline bool
    186 radv_clear_mask(uint32_t *inout_mask, uint32_t clear_mask)
    187 {
    188 	if (*inout_mask & clear_mask) {
    189 		*inout_mask &= ~clear_mask;
    190 		return true;
    191 	} else {
    192 		return false;
    193 	}
    194 }
    195 
    196 #define for_each_bit(b, dword)                          \
    197 	for (uint32_t __dword = (dword);		\
    198 	     (b) = __builtin_ffs(__dword) - 1, __dword;	\
    199 	     __dword &= ~(1 << (b)))
    200 
    201 #define typed_memcpy(dest, src, count) ({				\
    202 			STATIC_ASSERT(sizeof(*src) == sizeof(*dest)); \
    203 			memcpy((dest), (src), (count) * sizeof(*(src))); \
    204 		})
    205 
    206 #define zero(x) (memset(&(x), 0, sizeof(x)))
    207 
    208 /* Whenever we generate an error, pass it through this function. Useful for
    209  * debugging, where we can break on it. Only call at error site, not when
    210  * propagating errors. Might be useful to plug in a stack trace here.
    211  */
    212 
    213 VkResult __vk_errorf(VkResult error, const char *file, int line, const char *format, ...);
    214 
    215 #ifdef DEBUG
    216 #define vk_error(error) __vk_errorf(error, __FILE__, __LINE__, NULL);
    217 #define vk_errorf(error, format, ...) __vk_errorf(error, __FILE__, __LINE__, format, ## __VA_ARGS__);
    218 #else
    219 #define vk_error(error) error
    220 #define vk_errorf(error, format, ...) error
    221 #endif
    222 
    223 void __radv_finishme(const char *file, int line, const char *format, ...)
    224 	radv_printflike(3, 4);
    225 void radv_loge(const char *format, ...) radv_printflike(1, 2);
    226 void radv_loge_v(const char *format, va_list va);
    227 
    228 /**
    229  * Print a FINISHME message, including its source location.
    230  */
    231 #define radv_finishme(format, ...)					\
    232 	do { \
    233 		static bool reported = false; \
    234 		if (!reported) { \
    235 			__radv_finishme(__FILE__, __LINE__, format, ##__VA_ARGS__); \
    236 			reported = true; \
    237 		} \
    238 	} while (0)
    239 
    240 /* A non-fatal assert.  Useful for debugging. */
    241 #ifdef DEBUG
    242 #define radv_assert(x) ({						\
    243 			if (unlikely(!(x)))				\
    244 				fprintf(stderr, "%s:%d ASSERT: %s\n", __FILE__, __LINE__, #x); \
    245 		})
    246 #else
    247 #define radv_assert(x)
    248 #endif
    249 
    250 #define stub_return(v)					\
    251 	do {						\
    252 		radv_finishme("stub %s", __func__);	\
    253 		return (v);				\
    254 	} while (0)
    255 
    256 #define stub()						\
    257 	do {						\
    258 		radv_finishme("stub %s", __func__);	\
    259 		return;					\
    260 	} while (0)
    261 
    262 void *radv_resolve_entrypoint(uint32_t index);
    263 void *radv_lookup_entrypoint(const char *name);
    264 
    265 extern struct radv_dispatch_table dtable;
    266 
    267 struct radv_extensions {
    268 	VkExtensionProperties       *ext_array;
    269 	uint32_t                    num_ext;
    270 };
    271 
    272 struct radv_physical_device {
    273 	VK_LOADER_DATA                              _loader_data;
    274 
    275 	struct radv_instance *                       instance;
    276 
    277 	struct radeon_winsys *ws;
    278 	struct radeon_info rad_info;
    279 	char                                        path[20];
    280 	const char *                                name;
    281 	uint8_t                                     uuid[VK_UUID_SIZE];
    282 
    283 	struct wsi_device                       wsi_device;
    284 	struct radv_extensions                      extensions;
    285 };
    286 
    287 struct radv_instance {
    288 	VK_LOADER_DATA                              _loader_data;
    289 
    290 	VkAllocationCallbacks                       alloc;
    291 
    292 	uint32_t                                    apiVersion;
    293 	int                                         physicalDeviceCount;
    294 	struct radv_physical_device                 physicalDevices[RADV_MAX_DRM_DEVICES];
    295 
    296 	uint64_t debug_flags;
    297 };
    298 
    299 VkResult radv_init_wsi(struct radv_physical_device *physical_device);
    300 void radv_finish_wsi(struct radv_physical_device *physical_device);
    301 
    302 struct cache_entry;
    303 
    304 struct radv_pipeline_cache {
    305 	struct radv_device *                          device;
    306 	pthread_mutex_t                              mutex;
    307 
    308 	uint32_t                                     total_size;
    309 	uint32_t                                     table_size;
    310 	uint32_t                                     kernel_count;
    311 	struct cache_entry **                        hash_table;
    312 	bool                                         modified;
    313 
    314 	VkAllocationCallbacks                        alloc;
    315 };
    316 
    317 void
    318 radv_pipeline_cache_init(struct radv_pipeline_cache *cache,
    319 			 struct radv_device *device);
    320 void
    321 radv_pipeline_cache_finish(struct radv_pipeline_cache *cache);
    322 void
    323 radv_pipeline_cache_load(struct radv_pipeline_cache *cache,
    324 			 const void *data, size_t size);
    325 
    326 struct radv_shader_variant *
    327 radv_create_shader_variant_from_pipeline_cache(struct radv_device *device,
    328 					       struct radv_pipeline_cache *cache,
    329 					       const unsigned char *sha1);
    330 
    331 struct radv_shader_variant *
    332 radv_pipeline_cache_insert_shader(struct radv_pipeline_cache *cache,
    333 				  const unsigned char *sha1,
    334 				  struct radv_shader_variant *variant,
    335 				  const void *code, unsigned code_size);
    336 
    337 void radv_shader_variant_destroy(struct radv_device *device,
    338 				 struct radv_shader_variant *variant);
    339 
    340 struct radv_meta_state {
    341 	VkAllocationCallbacks alloc;
    342 
    343 	struct radv_pipeline_cache cache;
    344 
    345 	/**
    346 	 * Use array element `i` for images with `2^i` samples.
    347 	 */
    348 	struct {
    349 		VkRenderPass render_pass[NUM_META_FS_KEYS];
    350 		struct radv_pipeline *color_pipelines[NUM_META_FS_KEYS];
    351 
    352 		VkRenderPass depthstencil_rp;
    353 		struct radv_pipeline *depth_only_pipeline[NUM_DEPTH_CLEAR_PIPELINES];
    354 		struct radv_pipeline *stencil_only_pipeline[NUM_DEPTH_CLEAR_PIPELINES];
    355 		struct radv_pipeline *depthstencil_pipeline[NUM_DEPTH_CLEAR_PIPELINES];
    356 	} clear[1 + MAX_SAMPLES_LOG2];
    357 
    358 	struct {
    359 		VkRenderPass render_pass[NUM_META_FS_KEYS];
    360 
    361 		/** Pipeline that blits from a 1D image. */
    362 		VkPipeline pipeline_1d_src[NUM_META_FS_KEYS];
    363 
    364 		/** Pipeline that blits from a 2D image. */
    365 		VkPipeline pipeline_2d_src[NUM_META_FS_KEYS];
    366 
    367 		/** Pipeline that blits from a 3D image. */
    368 		VkPipeline pipeline_3d_src[NUM_META_FS_KEYS];
    369 
    370 		VkRenderPass depth_only_rp;
    371 		VkPipeline depth_only_1d_pipeline;
    372 		VkPipeline depth_only_2d_pipeline;
    373 		VkPipeline depth_only_3d_pipeline;
    374 
    375 		VkRenderPass stencil_only_rp;
    376 		VkPipeline stencil_only_1d_pipeline;
    377 		VkPipeline stencil_only_2d_pipeline;
    378 		VkPipeline stencil_only_3d_pipeline;
    379 		VkPipelineLayout                          pipeline_layout;
    380 		VkDescriptorSetLayout                     ds_layout;
    381 	} blit;
    382 
    383 	struct {
    384 		VkRenderPass render_passes[NUM_META_FS_KEYS];
    385 
    386 		VkPipelineLayout p_layouts[2];
    387 		VkDescriptorSetLayout ds_layouts[2];
    388 		VkPipeline pipelines[2][NUM_META_FS_KEYS];
    389 
    390 		VkRenderPass depth_only_rp;
    391 		VkPipeline depth_only_pipeline[2];
    392 
    393 		VkRenderPass stencil_only_rp;
    394 		VkPipeline stencil_only_pipeline[2];
    395 	} blit2d;
    396 
    397 	struct {
    398 		VkPipelineLayout                          img_p_layout;
    399 		VkDescriptorSetLayout                     img_ds_layout;
    400 		VkPipeline pipeline;
    401 	} itob;
    402 	struct {
    403 		VkRenderPass render_pass;
    404 		VkPipelineLayout                          img_p_layout;
    405 		VkDescriptorSetLayout                     img_ds_layout;
    406 		VkPipeline pipeline;
    407 	} btoi;
    408 	struct {
    409 		VkPipelineLayout                          img_p_layout;
    410 		VkDescriptorSetLayout                     img_ds_layout;
    411 		VkPipeline pipeline;
    412 	} itoi;
    413 	struct {
    414 		VkPipelineLayout                          img_p_layout;
    415 		VkDescriptorSetLayout                     img_ds_layout;
    416 		VkPipeline pipeline;
    417 	} cleari;
    418 
    419 	struct {
    420 		VkPipeline                                pipeline;
    421 		VkRenderPass                              pass;
    422 	} resolve;
    423 
    424 	struct {
    425 		VkDescriptorSetLayout                     ds_layout;
    426 		VkPipelineLayout                          p_layout;
    427 		struct {
    428 			VkPipeline                                pipeline;
    429 			VkPipeline                                i_pipeline;
    430 		} rc[MAX_SAMPLES_LOG2];
    431 	} resolve_compute;
    432 
    433 	struct {
    434 		VkPipeline                                decompress_pipeline;
    435 		VkPipeline                                resummarize_pipeline;
    436 		VkRenderPass                              pass;
    437 	} depth_decomp;
    438 
    439 	struct {
    440 		VkPipeline                                cmask_eliminate_pipeline;
    441 		VkPipeline                                fmask_decompress_pipeline;
    442 		VkRenderPass                              pass;
    443 	} fast_clear_flush;
    444 
    445 	struct {
    446 		VkPipelineLayout fill_p_layout;
    447 		VkPipelineLayout copy_p_layout;
    448 		VkDescriptorSetLayout fill_ds_layout;
    449 		VkDescriptorSetLayout copy_ds_layout;
    450 		VkPipeline fill_pipeline;
    451 		VkPipeline copy_pipeline;
    452 	} buffer;
    453 };
    454 
    455 /* queue types */
    456 #define RADV_QUEUE_GENERAL 0
    457 #define RADV_QUEUE_COMPUTE 1
    458 #define RADV_QUEUE_TRANSFER 2
    459 
    460 #define RADV_MAX_QUEUE_FAMILIES 3
    461 
    462 enum ring_type radv_queue_family_to_ring(int f);
    463 
    464 struct radv_queue {
    465 	VK_LOADER_DATA                              _loader_data;
    466 	struct radv_device *                         device;
    467 	struct radeon_winsys_ctx                    *hw_ctx;
    468 	int queue_family_index;
    469 	int queue_idx;
    470 };
    471 
    472 struct radv_device {
    473 	VK_LOADER_DATA                              _loader_data;
    474 
    475 	VkAllocationCallbacks                       alloc;
    476 
    477 	struct radv_instance *                       instance;
    478 	struct radeon_winsys *ws;
    479 
    480 	struct radv_meta_state                       meta_state;
    481 
    482 	struct radv_queue *queues[RADV_MAX_QUEUE_FAMILIES];
    483 	int queue_count[RADV_MAX_QUEUE_FAMILIES];
    484 	struct radeon_winsys_cs *empty_cs[RADV_MAX_QUEUE_FAMILIES];
    485 
    486 	uint64_t debug_flags;
    487 
    488 	/* MSAA sample locations.
    489 	 * The first index is the sample index.
    490 	 * The second index is the coordinate: X, Y. */
    491 	float sample_locations_1x[1][2];
    492 	float sample_locations_2x[2][2];
    493 	float sample_locations_4x[4][2];
    494 	float sample_locations_8x[8][2];
    495 	float sample_locations_16x[16][2];
    496 
    497 	struct radeon_winsys_bo                      *trace_bo;
    498 	uint32_t                                     *trace_id_ptr;
    499 
    500 	struct radv_physical_device                  *physical_device;
    501 };
    502 
    503 struct radv_device_memory {
    504 	struct radeon_winsys_bo                      *bo;
    505 	uint32_t                                     type_index;
    506 	VkDeviceSize                                 map_size;
    507 	void *                                       map;
    508 };
    509 
    510 
    511 struct radv_descriptor_range {
    512 	uint64_t va;
    513 	uint32_t size;
    514 };
    515 
    516 struct radv_descriptor_set {
    517 	const struct radv_descriptor_set_layout *layout;
    518 	struct list_head descriptor_pool;
    519 	uint32_t size;
    520 
    521 	struct radv_buffer_view *buffer_views;
    522 	struct radeon_winsys_bo *bo;
    523 	uint64_t va;
    524 	uint32_t *mapped_ptr;
    525 	struct radv_descriptor_range *dynamic_descriptors;
    526 	struct radeon_winsys_bo *descriptors[0];
    527 };
    528 
    529 struct radv_descriptor_pool_free_node {
    530 	int next;
    531 	uint32_t offset;
    532 	uint32_t size;
    533 };
    534 
    535 struct radv_descriptor_pool {
    536 	struct list_head descriptor_sets;
    537 
    538 	struct radeon_winsys_bo *bo;
    539 	uint8_t *mapped_ptr;
    540 	uint64_t current_offset;
    541 	uint64_t size;
    542 
    543 	int free_list;
    544 	int full_list;
    545 	uint32_t max_sets;
    546 	uint32_t allocated_sets;
    547 	struct radv_descriptor_pool_free_node free_nodes[];
    548 };
    549 
    550 struct radv_buffer {
    551 	struct radv_device *                          device;
    552 	VkDeviceSize                                 size;
    553 
    554 	VkBufferUsageFlags                           usage;
    555 
    556 	/* Set when bound */
    557 	struct radeon_winsys_bo *                      bo;
    558 	VkDeviceSize                                 offset;
    559 };
    560 
    561 
    562 enum radv_cmd_dirty_bits {
    563 	RADV_CMD_DIRTY_DYNAMIC_VIEWPORT                  = 1 << 0, /* VK_DYNAMIC_STATE_VIEWPORT */
    564 	RADV_CMD_DIRTY_DYNAMIC_SCISSOR                   = 1 << 1, /* VK_DYNAMIC_STATE_SCISSOR */
    565 	RADV_CMD_DIRTY_DYNAMIC_LINE_WIDTH                = 1 << 2, /* VK_DYNAMIC_STATE_LINE_WIDTH */
    566 	RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS                = 1 << 3, /* VK_DYNAMIC_STATE_DEPTH_BIAS */
    567 	RADV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS           = 1 << 4, /* VK_DYNAMIC_STATE_BLEND_CONSTANTS */
    568 	RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS              = 1 << 5, /* VK_DYNAMIC_STATE_DEPTH_BOUNDS */
    569 	RADV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK      = 1 << 6, /* VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK */
    570 	RADV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK        = 1 << 7, /* VK_DYNAMIC_STATE_STENCIL_WRITE_MASK */
    571 	RADV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE         = 1 << 8, /* VK_DYNAMIC_STATE_STENCIL_REFERENCE */
    572 	RADV_CMD_DIRTY_DYNAMIC_ALL                       = (1 << 9) - 1,
    573 	RADV_CMD_DIRTY_PIPELINE                          = 1 << 9,
    574 	RADV_CMD_DIRTY_INDEX_BUFFER                      = 1 << 10,
    575 	RADV_CMD_DIRTY_RENDER_TARGETS                    = 1 << 11,
    576 };
    577 typedef uint32_t radv_cmd_dirty_mask_t;
    578 
    579 enum radv_cmd_flush_bits {
    580 	RADV_CMD_FLAG_INV_ICACHE = 1 << 0,
    581 	/* SMEM L1, other names: KCACHE, constant cache, DCACHE, data cache */
    582 	RADV_CMD_FLAG_INV_SMEM_L1 = 1 << 1,
    583 	/* VMEM L1 can optionally be bypassed (GLC=1). Other names: TC L1 */
    584 	RADV_CMD_FLAG_INV_VMEM_L1 = 1 << 2,
    585 	/* Used by everything except CB/DB, can be bypassed (SLC=1). Other names: TC L2 */
    586 	RADV_CMD_FLAG_INV_GLOBAL_L2 = 1 << 3,
    587 	/* Framebuffer caches */
    588 	RADV_CMD_FLAG_FLUSH_AND_INV_CB_META = 1 << 4,
    589 	RADV_CMD_FLAG_FLUSH_AND_INV_DB_META = 1 << 5,
    590 	RADV_CMD_FLAG_FLUSH_AND_INV_DB = 1 << 6,
    591 	RADV_CMD_FLAG_FLUSH_AND_INV_CB = 1 << 7,
    592 	/* Engine synchronization. */
    593 	RADV_CMD_FLAG_VS_PARTIAL_FLUSH = 1 << 8,
    594 	RADV_CMD_FLAG_PS_PARTIAL_FLUSH = 1 << 9,
    595 	RADV_CMD_FLAG_CS_PARTIAL_FLUSH = 1 << 10,
    596 	RADV_CMD_FLAG_VGT_FLUSH        = 1 << 11,
    597 
    598 	RADV_CMD_FLUSH_AND_INV_FRAMEBUFFER = (RADV_CMD_FLAG_FLUSH_AND_INV_CB |
    599 					      RADV_CMD_FLAG_FLUSH_AND_INV_CB_META |
    600 					      RADV_CMD_FLAG_FLUSH_AND_INV_DB |
    601 					      RADV_CMD_FLAG_FLUSH_AND_INV_DB_META)
    602 };
    603 
    604 struct radv_vertex_binding {
    605 	struct radv_buffer *                          buffer;
    606 	VkDeviceSize                                 offset;
    607 };
    608 
    609 struct radv_dynamic_state {
    610 	struct {
    611 		uint32_t                                  count;
    612 		VkViewport                                viewports[MAX_VIEWPORTS];
    613 	} viewport;
    614 
    615 	struct {
    616 		uint32_t                                  count;
    617 		VkRect2D                                  scissors[MAX_SCISSORS];
    618 	} scissor;
    619 
    620 	float                                        line_width;
    621 
    622 	struct {
    623 		float                                     bias;
    624 		float                                     clamp;
    625 		float                                     slope;
    626 	} depth_bias;
    627 
    628 	float                                        blend_constants[4];
    629 
    630 	struct {
    631 		float                                     min;
    632 		float                                     max;
    633 	} depth_bounds;
    634 
    635 	struct {
    636 		uint32_t                                  front;
    637 		uint32_t                                  back;
    638 	} stencil_compare_mask;
    639 
    640 	struct {
    641 		uint32_t                                  front;
    642 		uint32_t                                  back;
    643 	} stencil_write_mask;
    644 
    645 	struct {
    646 		uint32_t                                  front;
    647 		uint32_t                                  back;
    648 	} stencil_reference;
    649 };
    650 
    651 extern const struct radv_dynamic_state default_dynamic_state;
    652 
    653 void radv_dynamic_state_copy(struct radv_dynamic_state *dest,
    654 			     const struct radv_dynamic_state *src,
    655 			     uint32_t copy_mask);
    656 /**
    657  * Attachment state when recording a renderpass instance.
    658  *
    659  * The clear value is valid only if there exists a pending clear.
    660  */
    661 struct radv_attachment_state {
    662 	VkImageAspectFlags                           pending_clear_aspects;
    663 	VkClearValue                                 clear_value;
    664 	VkImageLayout                                current_layout;
    665 };
    666 
    667 struct radv_cmd_state {
    668 	uint32_t                                      vb_dirty;
    669 	bool                                          vertex_descriptors_dirty;
    670 	radv_cmd_dirty_mask_t                         dirty;
    671 
    672 	struct radv_pipeline *                        pipeline;
    673 	struct radv_pipeline *                        emitted_pipeline;
    674 	struct radv_pipeline *                        compute_pipeline;
    675 	struct radv_pipeline *                        emitted_compute_pipeline;
    676 	struct radv_framebuffer *                     framebuffer;
    677 	struct radv_render_pass *                     pass;
    678 	const struct radv_subpass *                         subpass;
    679 	struct radv_dynamic_state                     dynamic;
    680 	struct radv_vertex_binding                    vertex_bindings[MAX_VBS];
    681 	struct radv_descriptor_set *                  descriptors[MAX_SETS];
    682 	struct radv_attachment_state *                attachments;
    683 	VkRect2D                                     render_area;
    684 	struct radv_buffer *                         index_buffer;
    685 	uint32_t                                     index_type;
    686 	uint32_t                                     index_offset;
    687 	uint32_t                                     last_primitive_reset_index;
    688 	enum radv_cmd_flush_bits                     flush_bits;
    689 	unsigned                                     active_occlusion_queries;
    690 	float					     offset_scale;
    691 	uint32_t                                      descriptors_dirty;
    692 	uint32_t                                      trace_id;
    693 };
    694 
    695 struct radv_cmd_pool {
    696 	VkAllocationCallbacks                        alloc;
    697 	struct list_head                             cmd_buffers;
    698 	uint32_t queue_family_index;
    699 };
    700 
    701 struct radv_cmd_buffer_upload {
    702 	uint8_t *map;
    703 	unsigned offset;
    704 	uint64_t size;
    705 	struct radeon_winsys_bo *upload_bo;
    706 	struct list_head list;
    707 };
    708 
    709 struct radv_cmd_buffer {
    710 	VK_LOADER_DATA                               _loader_data;
    711 
    712 	struct radv_device *                          device;
    713 
    714 	struct radv_cmd_pool *                        pool;
    715 	struct list_head                             pool_link;
    716 
    717 	VkCommandBufferUsageFlags                    usage_flags;
    718 	VkCommandBufferLevel                         level;
    719 	struct radeon_winsys_cs *cs;
    720 	struct radv_cmd_state state;
    721 	uint32_t queue_family_index;
    722 
    723 	uint8_t push_constants[MAX_PUSH_CONSTANTS_SIZE];
    724 	uint32_t dynamic_buffers[16 * MAX_DYNAMIC_BUFFERS];
    725 	VkShaderStageFlags push_constant_stages;
    726 
    727 	struct radv_cmd_buffer_upload upload;
    728 
    729 	bool record_fail;
    730 };
    731 
    732 struct radv_image;
    733 
    734 bool radv_cmd_buffer_uses_mec(struct radv_cmd_buffer *cmd_buffer);
    735 
    736 void si_init_compute(struct radv_physical_device *physical_device,
    737 		     struct radv_cmd_buffer *cmd_buffer);
    738 void si_init_config(struct radv_physical_device *physical_device,
    739 		    struct radv_cmd_buffer *cmd_buffer);
    740 void si_write_viewport(struct radeon_winsys_cs *cs, int first_vp,
    741 		       int count, const VkViewport *viewports);
    742 void si_write_scissors(struct radeon_winsys_cs *cs, int first,
    743 		       int count, const VkRect2D *scissors);
    744 uint32_t si_get_ia_multi_vgt_param(struct radv_cmd_buffer *cmd_buffer);
    745 void si_emit_cache_flush(struct radv_cmd_buffer *cmd_buffer);
    746 void si_cp_dma_buffer_copy(struct radv_cmd_buffer *cmd_buffer,
    747 			   uint64_t src_va, uint64_t dest_va,
    748 			   uint64_t size);
    749 void si_cp_dma_clear_buffer(struct radv_cmd_buffer *cmd_buffer, uint64_t va,
    750 			    uint64_t size, unsigned value);
    751 void radv_set_db_count_control(struct radv_cmd_buffer *cmd_buffer);
    752 void radv_bind_descriptor_set(struct radv_cmd_buffer *cmd_buffer,
    753 			      struct radv_descriptor_set *set,
    754 			      unsigned idx);
    755 bool
    756 radv_cmd_buffer_upload_alloc(struct radv_cmd_buffer *cmd_buffer,
    757 			     unsigned size,
    758 			     unsigned alignment,
    759 			     unsigned *out_offset,
    760 			     void **ptr);
    761 void
    762 radv_cmd_buffer_set_subpass(struct radv_cmd_buffer *cmd_buffer,
    763 			    const struct radv_subpass *subpass,
    764 			    bool transitions);
    765 bool
    766 radv_cmd_buffer_upload_data(struct radv_cmd_buffer *cmd_buffer,
    767 			    unsigned size, unsigned alignmnet,
    768 			    const void *data, unsigned *out_offset);
    769 void
    770 radv_emit_framebuffer_state(struct radv_cmd_buffer *cmd_buffer);
    771 void radv_cmd_buffer_clear_subpass(struct radv_cmd_buffer *cmd_buffer);
    772 void radv_cmd_buffer_resolve_subpass(struct radv_cmd_buffer *cmd_buffer);
    773 void radv_cayman_emit_msaa_sample_locs(struct radeon_winsys_cs *cs, int nr_samples);
    774 unsigned radv_cayman_get_maxdist(int log_samples);
    775 void radv_device_init_msaa(struct radv_device *device);
    776 void radv_set_depth_clear_regs(struct radv_cmd_buffer *cmd_buffer,
    777 			       struct radv_image *image,
    778 			       VkClearDepthStencilValue ds_clear_value,
    779 			       VkImageAspectFlags aspects);
    780 void radv_set_color_clear_regs(struct radv_cmd_buffer *cmd_buffer,
    781 			       struct radv_image *image,
    782 			       int idx,
    783 			       uint32_t color_values[2]);
    784 void radv_fill_buffer(struct radv_cmd_buffer *cmd_buffer,
    785 		      struct radeon_winsys_bo *bo,
    786 		      uint64_t offset, uint64_t size, uint32_t value);
    787 void radv_cmd_buffer_trace_emit(struct radv_cmd_buffer *cmd_buffer);
    788 
    789 /*
    790  * Takes x,y,z as exact numbers of invocations, instead of blocks.
    791  *
    792  * Limitations: Can't call normal dispatch functions without binding or rebinding
    793  *              the compute pipeline.
    794  */
    795 void radv_unaligned_dispatch(
    796 	struct radv_cmd_buffer                      *cmd_buffer,
    797 	uint32_t                                    x,
    798 	uint32_t                                    y,
    799 	uint32_t                                    z);
    800 
    801 struct radv_event {
    802 	struct radeon_winsys_bo *bo;
    803 	uint64_t *map;
    804 };
    805 
    806 struct nir_shader;
    807 
    808 struct radv_shader_module {
    809 	struct nir_shader *                          nir;
    810 	unsigned char                                sha1[20];
    811 	uint32_t                                     size;
    812 	char                                         data[0];
    813 };
    814 
    815 union ac_shader_variant_key;
    816 
    817 void
    818 radv_hash_shader(unsigned char *hash, struct radv_shader_module *module,
    819 		 const char *entrypoint,
    820 		 const VkSpecializationInfo *spec_info,
    821 		 const struct radv_pipeline_layout *layout,
    822 		 const union ac_shader_variant_key *key);
    823 
    824 static inline gl_shader_stage
    825 vk_to_mesa_shader_stage(VkShaderStageFlagBits vk_stage)
    826 {
    827 	assert(__builtin_popcount(vk_stage) == 1);
    828 	return ffs(vk_stage) - 1;
    829 }
    830 
    831 static inline VkShaderStageFlagBits
    832 mesa_to_vk_shader_stage(gl_shader_stage mesa_stage)
    833 {
    834 	return (1 << mesa_stage);
    835 }
    836 
    837 #define RADV_STAGE_MASK ((1 << MESA_SHADER_STAGES) - 1)
    838 
    839 #define radv_foreach_stage(stage, stage_bits)				\
    840 	for (gl_shader_stage stage,					\
    841 		     __tmp = (gl_shader_stage)((stage_bits) & RADV_STAGE_MASK);	\
    842 	     stage = __builtin_ffs(__tmp) - 1, __tmp;			\
    843 	     __tmp &= ~(1 << (stage)))
    844 
    845 struct radv_shader_variant {
    846 	uint32_t ref_count;
    847 
    848 	struct radeon_winsys_bo *bo;
    849 	struct ac_shader_config config;
    850 	struct ac_shader_variant_info info;
    851 	unsigned rsrc1;
    852 	unsigned rsrc2;
    853 	uint32_t code_size;
    854 };
    855 
    856 struct radv_depth_stencil_state {
    857 	uint32_t db_depth_control;
    858 	uint32_t db_stencil_control;
    859 	uint32_t db_render_control;
    860 	uint32_t db_render_override2;
    861 };
    862 
    863 struct radv_blend_state {
    864 	uint32_t cb_color_control;
    865 	uint32_t cb_target_mask;
    866 	uint32_t sx_mrt0_blend_opt[8];
    867 	uint32_t cb_blend_control[8];
    868 
    869 	uint32_t spi_shader_col_format;
    870 	uint32_t cb_shader_mask;
    871 	uint32_t db_alpha_to_mask;
    872 };
    873 
    874 unsigned radv_format_meta_fs_key(VkFormat format);
    875 
    876 struct radv_raster_state {
    877 	uint32_t pa_cl_clip_cntl;
    878 	uint32_t pa_cl_vs_out_cntl;
    879 	uint32_t spi_interp_control;
    880 	uint32_t pa_su_point_size;
    881 	uint32_t pa_su_point_minmax;
    882 	uint32_t pa_su_line_cntl;
    883 	uint32_t pa_su_vtx_cntl;
    884 	uint32_t pa_su_sc_mode_cntl;
    885 };
    886 
    887 struct radv_multisample_state {
    888 	uint32_t db_eqaa;
    889 	uint32_t pa_sc_line_cntl;
    890 	uint32_t pa_sc_mode_cntl_0;
    891 	uint32_t pa_sc_mode_cntl_1;
    892 	uint32_t pa_sc_aa_config;
    893 	uint32_t pa_sc_aa_mask[2];
    894 	unsigned num_samples;
    895 };
    896 
    897 struct radv_pipeline {
    898 	struct radv_device *                          device;
    899 	uint32_t                                     dynamic_state_mask;
    900 	struct radv_dynamic_state                     dynamic_state;
    901 
    902 	struct radv_pipeline_layout *                 layout;
    903 
    904 	bool                                         needs_data_cache;
    905 
    906 	struct radv_shader_variant *                 shaders[MESA_SHADER_STAGES];
    907 	VkShaderStageFlags                           active_stages;
    908 
    909 	uint32_t va_rsrc_word3[MAX_VERTEX_ATTRIBS];
    910 	uint32_t va_format_size[MAX_VERTEX_ATTRIBS];
    911 	uint32_t va_binding[MAX_VERTEX_ATTRIBS];
    912 	uint32_t va_offset[MAX_VERTEX_ATTRIBS];
    913 	uint32_t num_vertex_attribs;
    914 	uint32_t                                     binding_stride[MAX_VBS];
    915 
    916 	union {
    917 		struct {
    918 			struct radv_blend_state blend;
    919 			struct radv_depth_stencil_state ds;
    920 			struct radv_raster_state raster;
    921 			struct radv_multisample_state ms;
    922 			unsigned prim;
    923 			unsigned gs_out;
    924 			bool prim_restart_enable;
    925 		} graphics;
    926 	};
    927 };
    928 
    929 struct radv_graphics_pipeline_create_info {
    930 	bool use_rectlist;
    931 	bool db_depth_clear;
    932 	bool db_stencil_clear;
    933 	bool db_depth_disable_expclear;
    934 	bool db_stencil_disable_expclear;
    935 	bool db_flush_depth_inplace;
    936 	bool db_flush_stencil_inplace;
    937 	bool db_resummarize;
    938 	uint32_t custom_blend_mode;
    939 };
    940 
    941 VkResult
    942 radv_pipeline_init(struct radv_pipeline *pipeline, struct radv_device *device,
    943 		   struct radv_pipeline_cache *cache,
    944 		   const VkGraphicsPipelineCreateInfo *pCreateInfo,
    945 		   const struct radv_graphics_pipeline_create_info *extra,
    946 		   const VkAllocationCallbacks *alloc);
    947 
    948 VkResult
    949 radv_graphics_pipeline_create(VkDevice device,
    950 			      VkPipelineCache cache,
    951 			      const VkGraphicsPipelineCreateInfo *pCreateInfo,
    952 			      const struct radv_graphics_pipeline_create_info *extra,
    953 			      const VkAllocationCallbacks *alloc,
    954 			      VkPipeline *pPipeline);
    955 
    956 struct vk_format_description;
    957 uint32_t radv_translate_buffer_dataformat(const struct vk_format_description *desc,
    958 					  int first_non_void);
    959 uint32_t radv_translate_buffer_numformat(const struct vk_format_description *desc,
    960 					 int first_non_void);
    961 uint32_t radv_translate_colorformat(VkFormat format);
    962 uint32_t radv_translate_color_numformat(VkFormat format,
    963 					const struct vk_format_description *desc,
    964 					int first_non_void);
    965 uint32_t radv_colorformat_endian_swap(uint32_t colorformat);
    966 unsigned radv_translate_colorswap(VkFormat format, bool do_endian_swap);
    967 uint32_t radv_translate_dbformat(VkFormat format);
    968 uint32_t radv_translate_tex_dataformat(VkFormat format,
    969 				       const struct vk_format_description *desc,
    970 				       int first_non_void);
    971 uint32_t radv_translate_tex_numformat(VkFormat format,
    972 				      const struct vk_format_description *desc,
    973 				      int first_non_void);
    974 bool radv_format_pack_clear_color(VkFormat format,
    975 				  uint32_t clear_vals[2],
    976 				  VkClearColorValue *value);
    977 bool radv_is_colorbuffer_format_supported(VkFormat format, bool *blendable);
    978 
    979 struct radv_fmask_info {
    980 	uint64_t offset;
    981 	uint64_t size;
    982 	unsigned alignment;
    983 	unsigned pitch_in_pixels;
    984 	unsigned bank_height;
    985 	unsigned slice_tile_max;
    986 	unsigned tile_mode_index;
    987 };
    988 
    989 struct radv_cmask_info {
    990 	uint64_t offset;
    991 	uint64_t size;
    992 	unsigned alignment;
    993 	unsigned slice_tile_max;
    994 	unsigned base_address_reg;
    995 };
    996 
    997 struct r600_htile_info {
    998 	uint64_t offset;
    999 	uint64_t size;
   1000 	unsigned pitch;
   1001 	unsigned height;
   1002 	unsigned xalign;
   1003 	unsigned yalign;
   1004 };
   1005 
   1006 struct radv_image {
   1007 	VkImageType type;
   1008 	/* The original VkFormat provided by the client.  This may not match any
   1009 	 * of the actual surface formats.
   1010 	 */
   1011 	VkFormat vk_format;
   1012 	VkImageAspectFlags aspects;
   1013 	VkExtent3D extent;
   1014 	uint32_t levels;
   1015 	uint32_t array_size;
   1016 	uint32_t samples; /**< VkImageCreateInfo::samples */
   1017 	VkImageUsageFlags usage; /**< Superset of VkImageCreateInfo::usage. */
   1018 	VkImageTiling tiling; /** VkImageCreateInfo::tiling */
   1019 
   1020 	VkDeviceSize size;
   1021 	uint32_t alignment;
   1022 
   1023 	bool exclusive;
   1024 	unsigned queue_family_mask;
   1025 
   1026 	/* Set when bound */
   1027 	struct radeon_winsys_bo *bo;
   1028 	VkDeviceSize offset;
   1029 	uint32_t dcc_offset;
   1030 	struct radeon_surf surface;
   1031 
   1032 	struct radv_fmask_info fmask;
   1033 	struct radv_cmask_info cmask;
   1034 	uint32_t clear_value_offset;
   1035 
   1036 	/* Depth buffer compression and fast clear. */
   1037 	struct r600_htile_info htile;
   1038 };
   1039 
   1040 bool radv_layout_has_htile(const struct radv_image *image,
   1041                            VkImageLayout layout);
   1042 bool radv_layout_is_htile_compressed(const struct radv_image *image,
   1043                                      VkImageLayout layout);
   1044 bool radv_layout_can_expclear(const struct radv_image *image,
   1045                               VkImageLayout layout);
   1046 bool radv_layout_can_fast_clear(const struct radv_image *image,
   1047 			        VkImageLayout layout,
   1048 			        unsigned queue_mask);
   1049 
   1050 
   1051 unsigned radv_image_queue_family_mask(const struct radv_image *image, int family);
   1052 
   1053 static inline uint32_t
   1054 radv_get_layerCount(const struct radv_image *image,
   1055 		    const VkImageSubresourceRange *range)
   1056 {
   1057 	return range->layerCount == VK_REMAINING_ARRAY_LAYERS ?
   1058 		image->array_size - range->baseArrayLayer : range->layerCount;
   1059 }
   1060 
   1061 static inline uint32_t
   1062 radv_get_levelCount(const struct radv_image *image,
   1063 		    const VkImageSubresourceRange *range)
   1064 {
   1065 	return range->levelCount == VK_REMAINING_MIP_LEVELS ?
   1066 		image->levels - range->baseMipLevel : range->levelCount;
   1067 }
   1068 
   1069 struct radeon_bo_metadata;
   1070 void
   1071 radv_init_metadata(struct radv_device *device,
   1072 		   struct radv_image *image,
   1073 		   struct radeon_bo_metadata *metadata);
   1074 
   1075 struct radv_image_view {
   1076 	struct radv_image *image; /**< VkImageViewCreateInfo::image */
   1077 	struct radeon_winsys_bo *bo;
   1078 
   1079 	VkImageViewType type;
   1080 	VkImageAspectFlags aspect_mask;
   1081 	VkFormat vk_format;
   1082 	uint32_t base_layer;
   1083 	uint32_t layer_count;
   1084 	uint32_t base_mip;
   1085 	VkExtent3D extent; /**< Extent of VkImageViewCreateInfo::baseMipLevel. */
   1086 
   1087 	uint32_t descriptor[8];
   1088 	uint32_t fmask_descriptor[8];
   1089 };
   1090 
   1091 struct radv_image_create_info {
   1092 	const VkImageCreateInfo *vk_info;
   1093 	uint32_t stride;
   1094 	bool scanout;
   1095 };
   1096 
   1097 VkResult radv_image_create(VkDevice _device,
   1098 			   const struct radv_image_create_info *info,
   1099 			   const VkAllocationCallbacks* alloc,
   1100 			   VkImage *pImage);
   1101 
   1102 void radv_image_view_init(struct radv_image_view *view,
   1103 			  struct radv_device *device,
   1104 			  const VkImageViewCreateInfo* pCreateInfo,
   1105 			  struct radv_cmd_buffer *cmd_buffer,
   1106 			  VkImageUsageFlags usage_mask);
   1107 void radv_image_set_optimal_micro_tile_mode(struct radv_device *device,
   1108 					    struct radv_image *image, uint32_t micro_tile_mode);
   1109 struct radv_buffer_view {
   1110 	struct radeon_winsys_bo *bo;
   1111 	VkFormat vk_format;
   1112 	uint64_t range; /**< VkBufferViewCreateInfo::range */
   1113 	uint32_t state[4];
   1114 };
   1115 void radv_buffer_view_init(struct radv_buffer_view *view,
   1116 			   struct radv_device *device,
   1117 			   const VkBufferViewCreateInfo* pCreateInfo,
   1118 			   struct radv_cmd_buffer *cmd_buffer);
   1119 
   1120 static inline struct VkExtent3D
   1121 radv_sanitize_image_extent(const VkImageType imageType,
   1122 			   const struct VkExtent3D imageExtent)
   1123 {
   1124 	switch (imageType) {
   1125 	case VK_IMAGE_TYPE_1D:
   1126 		return (VkExtent3D) { imageExtent.width, 1, 1 };
   1127 	case VK_IMAGE_TYPE_2D:
   1128 		return (VkExtent3D) { imageExtent.width, imageExtent.height, 1 };
   1129 	case VK_IMAGE_TYPE_3D:
   1130 		return imageExtent;
   1131 	default:
   1132 		unreachable("invalid image type");
   1133 	}
   1134 }
   1135 
   1136 static inline struct VkOffset3D
   1137 radv_sanitize_image_offset(const VkImageType imageType,
   1138 			   const struct VkOffset3D imageOffset)
   1139 {
   1140 	switch (imageType) {
   1141 	case VK_IMAGE_TYPE_1D:
   1142 		return (VkOffset3D) { imageOffset.x, 0, 0 };
   1143 	case VK_IMAGE_TYPE_2D:
   1144 		return (VkOffset3D) { imageOffset.x, imageOffset.y, 0 };
   1145 	case VK_IMAGE_TYPE_3D:
   1146 		return imageOffset;
   1147 	default:
   1148 		unreachable("invalid image type");
   1149 	}
   1150 }
   1151 
   1152 struct radv_sampler {
   1153 	uint32_t state[4];
   1154 };
   1155 
   1156 struct radv_color_buffer_info {
   1157 	uint32_t cb_color_base;
   1158 	uint32_t cb_color_pitch;
   1159 	uint32_t cb_color_slice;
   1160 	uint32_t cb_color_view;
   1161 	uint32_t cb_color_info;
   1162 	uint32_t cb_color_attrib;
   1163 	uint32_t cb_dcc_control;
   1164 	uint32_t cb_color_cmask;
   1165 	uint32_t cb_color_cmask_slice;
   1166 	uint32_t cb_color_fmask;
   1167 	uint32_t cb_color_fmask_slice;
   1168 	uint32_t cb_clear_value0;
   1169 	uint32_t cb_clear_value1;
   1170 	uint32_t cb_dcc_base;
   1171 	uint32_t micro_tile_mode;
   1172 };
   1173 
   1174 struct radv_ds_buffer_info {
   1175 	uint32_t db_depth_info;
   1176 	uint32_t db_z_info;
   1177 	uint32_t db_stencil_info;
   1178 	uint32_t db_z_read_base;
   1179 	uint32_t db_stencil_read_base;
   1180 	uint32_t db_z_write_base;
   1181 	uint32_t db_stencil_write_base;
   1182 	uint32_t db_depth_view;
   1183 	uint32_t db_depth_size;
   1184 	uint32_t db_depth_slice;
   1185 	uint32_t db_htile_surface;
   1186 	uint32_t db_htile_data_base;
   1187 	uint32_t pa_su_poly_offset_db_fmt_cntl;
   1188 	float offset_scale;
   1189 };
   1190 
   1191 struct radv_attachment_info {
   1192 	union {
   1193 		struct radv_color_buffer_info cb;
   1194 		struct radv_ds_buffer_info ds;
   1195 	};
   1196 	struct radv_image_view *attachment;
   1197 };
   1198 
   1199 struct radv_framebuffer {
   1200 	uint32_t                                     width;
   1201 	uint32_t                                     height;
   1202 	uint32_t                                     layers;
   1203 
   1204 	uint32_t                                     attachment_count;
   1205 	struct radv_attachment_info                  attachments[0];
   1206 };
   1207 
   1208 struct radv_subpass_barrier {
   1209 	VkPipelineStageFlags src_stage_mask;
   1210 	VkAccessFlags        src_access_mask;
   1211 	VkAccessFlags        dst_access_mask;
   1212 };
   1213 
   1214 struct radv_subpass {
   1215 	uint32_t                                     input_count;
   1216 	VkAttachmentReference *                      input_attachments;
   1217 	uint32_t                                     color_count;
   1218 	VkAttachmentReference *                      color_attachments;
   1219 	VkAttachmentReference *                      resolve_attachments;
   1220 	VkAttachmentReference                        depth_stencil_attachment;
   1221 
   1222 	/** Subpass has at least one resolve attachment */
   1223 	bool                                         has_resolve;
   1224 
   1225 	struct radv_subpass_barrier                  start_barrier;
   1226 };
   1227 
   1228 struct radv_render_pass_attachment {
   1229 	VkFormat                                     format;
   1230 	uint32_t                                     samples;
   1231 	VkAttachmentLoadOp                           load_op;
   1232 	VkAttachmentLoadOp                           stencil_load_op;
   1233 	VkImageLayout                                initial_layout;
   1234 	VkImageLayout                                final_layout;
   1235 };
   1236 
   1237 struct radv_render_pass {
   1238 	uint32_t                                     attachment_count;
   1239 	uint32_t                                     subpass_count;
   1240 	VkAttachmentReference *                      subpass_attachments;
   1241 	struct radv_render_pass_attachment *         attachments;
   1242 	struct radv_subpass_barrier                  end_barrier;
   1243 	struct radv_subpass                          subpasses[0];
   1244 };
   1245 
   1246 VkResult radv_device_init_meta(struct radv_device *device);
   1247 void radv_device_finish_meta(struct radv_device *device);
   1248 
   1249 struct radv_query_pool {
   1250 	struct radeon_winsys_bo *bo;
   1251 	uint32_t stride;
   1252 	uint32_t availability_offset;
   1253 	char *ptr;
   1254 	VkQueryType type;
   1255 };
   1256 
   1257 VkResult
   1258 radv_temp_descriptor_set_create(struct radv_device *device,
   1259 				struct radv_cmd_buffer *cmd_buffer,
   1260 				VkDescriptorSetLayout _layout,
   1261 				VkDescriptorSet *_set);
   1262 
   1263 void
   1264 radv_temp_descriptor_set_destroy(struct radv_device *device,
   1265 				 VkDescriptorSet _set);
   1266 void radv_initialise_cmask(struct radv_cmd_buffer *cmd_buffer,
   1267 			   struct radv_image *image, uint32_t value);
   1268 void radv_initialize_dcc(struct radv_cmd_buffer *cmd_buffer,
   1269 			 struct radv_image *image, uint32_t value);
   1270 
   1271 struct radv_fence {
   1272 	struct radeon_winsys_fence *fence;
   1273 	bool submitted;
   1274 	bool signalled;
   1275 };
   1276 
   1277 #define RADV_DEFINE_HANDLE_CASTS(__radv_type, __VkType)		\
   1278 								\
   1279 	static inline struct __radv_type *			\
   1280 	__radv_type ## _from_handle(__VkType _handle)		\
   1281 	{							\
   1282 		return (struct __radv_type *) _handle;		\
   1283 	}							\
   1284 								\
   1285 	static inline __VkType					\
   1286 	__radv_type ## _to_handle(struct __radv_type *_obj)	\
   1287 	{							\
   1288 		return (__VkType) _obj;				\
   1289 	}
   1290 
   1291 #define RADV_DEFINE_NONDISP_HANDLE_CASTS(__radv_type, __VkType)		\
   1292 									\
   1293 	static inline struct __radv_type *				\
   1294 	__radv_type ## _from_handle(__VkType _handle)			\
   1295 	{								\
   1296 		return (struct __radv_type *)(uintptr_t) _handle;	\
   1297 	}								\
   1298 									\
   1299 	static inline __VkType						\
   1300 	__radv_type ## _to_handle(struct __radv_type *_obj)		\
   1301 	{								\
   1302 		return (__VkType)(uintptr_t) _obj;			\
   1303 	}
   1304 
   1305 #define RADV_FROM_HANDLE(__radv_type, __name, __handle)			\
   1306 	struct __radv_type *__name = __radv_type ## _from_handle(__handle)
   1307 
   1308 RADV_DEFINE_HANDLE_CASTS(radv_cmd_buffer, VkCommandBuffer)
   1309 RADV_DEFINE_HANDLE_CASTS(radv_device, VkDevice)
   1310 RADV_DEFINE_HANDLE_CASTS(radv_instance, VkInstance)
   1311 RADV_DEFINE_HANDLE_CASTS(radv_physical_device, VkPhysicalDevice)
   1312 RADV_DEFINE_HANDLE_CASTS(radv_queue, VkQueue)
   1313 
   1314 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_cmd_pool, VkCommandPool)
   1315 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_buffer, VkBuffer)
   1316 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_buffer_view, VkBufferView)
   1317 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_descriptor_pool, VkDescriptorPool)
   1318 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_descriptor_set, VkDescriptorSet)
   1319 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_descriptor_set_layout, VkDescriptorSetLayout)
   1320 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_device_memory, VkDeviceMemory)
   1321 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_fence, VkFence)
   1322 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_event, VkEvent)
   1323 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_framebuffer, VkFramebuffer)
   1324 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_image, VkImage)
   1325 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_image_view, VkImageView);
   1326 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_pipeline_cache, VkPipelineCache)
   1327 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_pipeline, VkPipeline)
   1328 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_pipeline_layout, VkPipelineLayout)
   1329 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_query_pool, VkQueryPool)
   1330 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_render_pass, VkRenderPass)
   1331 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_sampler, VkSampler)
   1332 RADV_DEFINE_NONDISP_HANDLE_CASTS(radv_shader_module, VkShaderModule)
   1333 
   1334 #endif /* RADV_PRIVATE_H */
   1335