1 /* 2 * Copyright 2015 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24 #ifndef ANV_PRIVATE_H 25 #define ANV_PRIVATE_H 26 27 #include <stdlib.h> 28 #include <stdio.h> 29 #include <stdbool.h> 30 #include <pthread.h> 31 #include <assert.h> 32 #include <stdint.h> 33 #include "drm-uapi/i915_drm.h" 34 35 #ifdef HAVE_VALGRIND 36 #include <valgrind.h> 37 #include <memcheck.h> 38 #define VG(x) x 39 #ifndef NDEBUG 40 #define __gen_validate_value(x) VALGRIND_CHECK_MEM_IS_DEFINED(&(x), sizeof(x)) 41 #endif 42 #else 43 #define VG(x) ((void)0) 44 #endif 45 46 #include "common/intel_clflush.h" 47 #include "common/intel_decoder.h" 48 #include "common/intel_gem.h" 49 #include "common/intel_l3_config.h" 50 #include "common/intel_measure.h" 51 #include "dev/intel_device_info.h" 52 #include "blorp/blorp.h" 53 #include "compiler/brw_compiler.h" 54 #include "compiler/brw_rt.h" 55 #include "util/bitset.h" 56 #include "util/bitscan.h" 57 #include "util/macros.h" 58 #include "util/hash_table.h" 59 #include "util/list.h" 60 #include "util/sparse_array.h" 61 #include "util/u_atomic.h" 62 #include "util/u_vector.h" 63 #include "util/u_math.h" 64 #include "util/vma.h" 65 #include "util/xmlconfig.h" 66 #include "vk_alloc.h" 67 #include "vk_debug_report.h" 68 #include "vk_device.h" 69 #include "vk_enum_defines.h" 70 #include "vk_image.h" 71 #include "vk_instance.h" 72 #include "vk_physical_device.h" 73 #include "vk_shader_module.h" 74 #include "vk_util.h" 75 #include "vk_command_buffer.h" 76 #include "vk_queue.h" 77 #include "vk_log.h" 78 79 /* Pre-declarations needed for WSI entrypoints */ 80 struct wl_surface; 81 struct wl_display; 82 typedef struct xcb_connection_t xcb_connection_t; 83 typedef uint32_t xcb_visualid_t; 84 typedef uint32_t xcb_window_t; 85 86 struct anv_batch; 87 struct anv_buffer; 88 struct anv_buffer_view; 89 struct anv_image_view; 90 struct anv_acceleration_structure; 91 struct anv_instance; 92 93 struct intel_aux_map_context; 94 struct intel_perf_config; 95 struct intel_perf_counter_pass; 96 struct intel_perf_query_result; 97 98 #include <vulkan/vulkan.h> 99 #include <vulkan/vk_icd.h> 100 101 #include "anv_android.h" 102 #include "anv_entrypoints.h" 103 #include "isl/isl.h" 104 105 #include "dev/intel_debug.h" 106 #undef MESA_LOG_TAG 107 #define MESA_LOG_TAG "MESA-INTEL" 108 #include "util/log.h" 109 #include "wsi_common.h" 110 111 #define NSEC_PER_SEC 1000000000ull 112 113 /* anv Virtual Memory Layout 114 * ========================= 115 * 116 * When the anv driver is determining the virtual graphics addresses of memory 117 * objects itself using the softpin mechanism, the following memory ranges 118 * will be used. 119 * 120 * Three special considerations to notice: 121 * 122 * (1) the dynamic state pool is located within the same 4 GiB as the low 123 * heap. This is to work around a VF cache issue described in a comment in 124 * anv_physical_device_init_heaps. 125 * 126 * (2) the binding table pool is located at lower addresses than the surface 127 * state pool, within a 4 GiB range. This allows surface state base addresses 128 * to cover both binding tables (16 bit offsets) and surface states (32 bit 129 * offsets). 130 * 131 * (3) the last 4 GiB of the address space is withheld from the high 132 * heap. Various hardware units will read past the end of an object for 133 * various reasons. This healthy margin prevents reads from wrapping around 134 * 48-bit addresses. 135 */ 136 #define GENERAL_STATE_POOL_MIN_ADDRESS 0x000000010000ULL /* 64 KiB */ 137 #define GENERAL_STATE_POOL_MAX_ADDRESS 0x00003fffffffULL 138 #define LOW_HEAP_MIN_ADDRESS 0x000040000000ULL /* 1 GiB */ 139 #define LOW_HEAP_MAX_ADDRESS 0x00007fffffffULL 140 #define DYNAMIC_STATE_POOL_MIN_ADDRESS 0x0000c0000000ULL /* 3 GiB */ 141 #define DYNAMIC_STATE_POOL_MAX_ADDRESS 0x0000ffffffffULL 142 #define BINDING_TABLE_POOL_MIN_ADDRESS 0x000100000000ULL /* 4 GiB */ 143 #define BINDING_TABLE_POOL_MAX_ADDRESS 0x00013fffffffULL 144 #define SURFACE_STATE_POOL_MIN_ADDRESS 0x000140000000ULL /* 5 GiB */ 145 #define SURFACE_STATE_POOL_MAX_ADDRESS 0x00017fffffffULL 146 #define INSTRUCTION_STATE_POOL_MIN_ADDRESS 0x000180000000ULL /* 6 GiB */ 147 #define INSTRUCTION_STATE_POOL_MAX_ADDRESS 0x0001bfffffffULL 148 #define CLIENT_VISIBLE_HEAP_MIN_ADDRESS 0x0001c0000000ULL /* 7 GiB */ 149 #define CLIENT_VISIBLE_HEAP_MAX_ADDRESS 0x0002bfffffffULL 150 #define HIGH_HEAP_MIN_ADDRESS 0x0002c0000000ULL /* 11 GiB */ 151 152 #define GENERAL_STATE_POOL_SIZE \ 153 (GENERAL_STATE_POOL_MAX_ADDRESS - GENERAL_STATE_POOL_MIN_ADDRESS + 1) 154 #define LOW_HEAP_SIZE \ 155 (LOW_HEAP_MAX_ADDRESS - LOW_HEAP_MIN_ADDRESS + 1) 156 #define DYNAMIC_STATE_POOL_SIZE \ 157 (DYNAMIC_STATE_POOL_MAX_ADDRESS - DYNAMIC_STATE_POOL_MIN_ADDRESS + 1) 158 #define BINDING_TABLE_POOL_SIZE \ 159 (BINDING_TABLE_POOL_MAX_ADDRESS - BINDING_TABLE_POOL_MIN_ADDRESS + 1) 160 #define SURFACE_STATE_POOL_SIZE \ 161 (SURFACE_STATE_POOL_MAX_ADDRESS - SURFACE_STATE_POOL_MIN_ADDRESS + 1) 162 #define INSTRUCTION_STATE_POOL_SIZE \ 163 (INSTRUCTION_STATE_POOL_MAX_ADDRESS - INSTRUCTION_STATE_POOL_MIN_ADDRESS + 1) 164 #define CLIENT_VISIBLE_HEAP_SIZE \ 165 (CLIENT_VISIBLE_HEAP_MAX_ADDRESS - CLIENT_VISIBLE_HEAP_MIN_ADDRESS + 1) 166 167 /* Allowing different clear colors requires us to perform a depth resolve at 168 * the end of certain render passes. This is because while slow clears store 169 * the clear color in the HiZ buffer, fast clears (without a resolve) don't. 170 * See the PRMs for examples describing when additional resolves would be 171 * necessary. To enable fast clears without requiring extra resolves, we set 172 * the clear value to a globally-defined one. We could allow different values 173 * if the user doesn't expect coherent data during or after a render passes 174 * (VK_ATTACHMENT_STORE_OP_DONT_CARE), but such users (aside from the CTS) 175 * don't seem to exist yet. In almost all Vulkan applications tested thus far, 176 * 1.0f seems to be the only value used. The only application that doesn't set 177 * this value does so through the usage of an seemingly uninitialized clear 178 * value. 179 */ 180 #define ANV_HZ_FC_VAL 1.0f 181 182 #define MAX_VBS 28 183 #define MAX_XFB_BUFFERS 4 184 #define MAX_XFB_STREAMS 4 185 #define MAX_SETS 8 186 #define MAX_RTS 8 187 #define MAX_VIEWPORTS 16 188 #define MAX_SCISSORS 16 189 #define MAX_PUSH_CONSTANTS_SIZE 128 190 #define MAX_DYNAMIC_BUFFERS 16 191 #define MAX_IMAGES 64 192 #define MAX_PUSH_DESCRIPTORS 32 /* Minimum requirement */ 193 #define MAX_INLINE_UNIFORM_BLOCK_SIZE 4096 194 #define MAX_INLINE_UNIFORM_BLOCK_DESCRIPTORS 32 195 /* We need 16 for UBO block reads to work and 32 for push UBOs. However, we 196 * use 64 here to avoid cache issues. This could most likely bring it back to 197 * 32 if we had different virtual addresses for the different views on a given 198 * GEM object. 199 */ 200 #define ANV_UBO_ALIGNMENT 64 201 #define ANV_SSBO_ALIGNMENT 4 202 #define ANV_SSBO_BOUNDS_CHECK_ALIGNMENT 4 203 #define MAX_VIEWS_FOR_PRIMITIVE_REPLICATION 16 204 #define MAX_SAMPLE_LOCATIONS 16 205 206 /* From the Skylake PRM Vol. 7 "Binding Table Surface State Model": 207 * 208 * "The surface state model is used when a Binding Table Index (specified 209 * in the message descriptor) of less than 240 is specified. In this model, 210 * the Binding Table Index is used to index into the binding table, and the 211 * binding table entry contains a pointer to the SURFACE_STATE." 212 * 213 * Binding table values above 240 are used for various things in the hardware 214 * such as stateless, stateless with incoherent cache, SLM, and bindless. 215 */ 216 #define MAX_BINDING_TABLE_SIZE 240 217 218 /* The kernel relocation API has a limitation of a 32-bit delta value 219 * applied to the address before it is written which, in spite of it being 220 * unsigned, is treated as signed . Because of the way that this maps to 221 * the Vulkan API, we cannot handle an offset into a buffer that does not 222 * fit into a signed 32 bits. The only mechanism we have for dealing with 223 * this at the moment is to limit all VkDeviceMemory objects to a maximum 224 * of 2GB each. The Vulkan spec allows us to do this: 225 * 226 * "Some platforms may have a limit on the maximum size of a single 227 * allocation. For example, certain systems may fail to create 228 * allocations with a size greater than or equal to 4GB. Such a limit is 229 * implementation-dependent, and if such a failure occurs then the error 230 * VK_ERROR_OUT_OF_DEVICE_MEMORY should be returned." 231 */ 232 #define MAX_MEMORY_ALLOCATION_SIZE (1ull << 31) 233 234 #define ANV_SVGS_VB_INDEX MAX_VBS 235 #define ANV_DRAWID_VB_INDEX (MAX_VBS + 1) 236 237 /* We reserve this MI ALU register for the purpose of handling predication. 238 * Other code which uses the MI ALU should leave it alone. 239 */ 240 #define ANV_PREDICATE_RESULT_REG 0x2678 /* MI_ALU_REG15 */ 241 242 /* We reserve this MI ALU register to pass around an offset computed from 243 * VkPerformanceQuerySubmitInfoKHR::counterPassIndex VK_KHR_performance_query. 244 * Other code which uses the MI ALU should leave it alone. 245 */ 246 #define ANV_PERF_QUERY_OFFSET_REG 0x2670 /* MI_ALU_REG14 */ 247 248 /* For gfx12 we set the streamout buffers using 4 separate commands 249 * (3DSTATE_SO_BUFFER_INDEX_*) instead of 3DSTATE_SO_BUFFER. However the layout 250 * of the 3DSTATE_SO_BUFFER_INDEX_* commands is identical to that of 251 * 3DSTATE_SO_BUFFER apart from the SOBufferIndex field, so for now we use the 252 * 3DSTATE_SO_BUFFER command, but change the 3DCommandSubOpcode. 253 * SO_BUFFER_INDEX_0_CMD is actually the 3DCommandSubOpcode for 254 * 3DSTATE_SO_BUFFER_INDEX_0. 255 */ 256 #define SO_BUFFER_INDEX_0_CMD 0x60 257 #define anv_printflike(a, b) __attribute__((__format__(__printf__, a, b))) 258 259 static inline uint32_t 260 align_down_npot_u32(uint32_t v, uint32_t a) 261 { 262 return v - (v % a); 263 } 264 265 static inline uint32_t 266 align_down_u32(uint32_t v, uint32_t a) 267 { 268 assert(a != 0 && a == (a & -a)); 269 return v & ~(a - 1); 270 } 271 272 static inline uint32_t 273 align_u32(uint32_t v, uint32_t a) 274 { 275 assert(a != 0 && a == (a & -a)); 276 return align_down_u32(v + a - 1, a); 277 } 278 279 static inline uint64_t 280 align_down_u64(uint64_t v, uint64_t a) 281 { 282 assert(a != 0 && a == (a & -a)); 283 return v & ~(a - 1); 284 } 285 286 static inline uint64_t 287 align_u64(uint64_t v, uint64_t a) 288 { 289 return align_down_u64(v + a - 1, a); 290 } 291 292 static inline int32_t 293 align_i32(int32_t v, int32_t a) 294 { 295 assert(a != 0 && a == (a & -a)); 296 return (v + a - 1) & ~(a - 1); 297 } 298 299 /** Alignment must be a power of 2. */ 300 static inline bool 301 anv_is_aligned(uintmax_t n, uintmax_t a) 302 { 303 assert(a == (a & -a)); 304 return (n & (a - 1)) == 0; 305 } 306 307 static inline uint32_t 308 anv_minify(uint32_t n, uint32_t levels) 309 { 310 if (unlikely(n == 0)) 311 return 0; 312 else 313 return MAX2(n >> levels, 1); 314 } 315 316 static inline float 317 anv_clamp_f(float f, float min, float max) 318 { 319 assert(min < max); 320 321 if (f > max) 322 return max; 323 else if (f < min) 324 return min; 325 else 326 return f; 327 } 328 329 static inline bool 330 anv_clear_mask(uint32_t *inout_mask, uint32_t clear_mask) 331 { 332 if (*inout_mask & clear_mask) { 333 *inout_mask &= ~clear_mask; 334 return true; 335 } else { 336 return false; 337 } 338 } 339 340 static inline union isl_color_value 341 vk_to_isl_color(VkClearColorValue color) 342 { 343 return (union isl_color_value) { 344 .u32 = { 345 color.uint32[0], 346 color.uint32[1], 347 color.uint32[2], 348 color.uint32[3], 349 }, 350 }; 351 } 352 353 static inline void *anv_unpack_ptr(uintptr_t ptr, int bits, int *flags) 354 { 355 uintptr_t mask = (1ull << bits) - 1; 356 *flags = ptr & mask; 357 return (void *) (ptr & ~mask); 358 } 359 360 static inline uintptr_t anv_pack_ptr(void *ptr, int bits, int flags) 361 { 362 uintptr_t value = (uintptr_t) ptr; 363 uintptr_t mask = (1ull << bits) - 1; 364 return value | (mask & flags); 365 } 366 367 /** 368 * Warn on ignored extension structs. 369 * 370 * The Vulkan spec requires us to ignore unsupported or unknown structs in 371 * a pNext chain. In debug mode, emitting warnings for ignored structs may 372 * help us discover structs that we should not have ignored. 373 * 374 * 375 * From the Vulkan 1.0.38 spec: 376 * 377 * Any component of the implementation (the loader, any enabled layers, 378 * and drivers) must skip over, without processing (other than reading the 379 * sType and pNext members) any chained structures with sType values not 380 * defined by extensions supported by that component. 381 */ 382 #define anv_debug_ignored_stype(sType) \ 383 mesa_logd("%s: ignored VkStructureType %u\n", __func__, (sType)) 384 385 void __anv_perf_warn(struct anv_device *device, 386 const struct vk_object_base *object, 387 const char *file, int line, const char *format, ...) 388 anv_printflike(5, 6); 389 390 /** 391 * Print a FINISHME message, including its source location. 392 */ 393 #define anv_finishme(format, ...) \ 394 do { \ 395 static bool reported = false; \ 396 if (!reported) { \ 397 mesa_logw("%s:%d: FINISHME: " format, __FILE__, __LINE__, \ 398 ##__VA_ARGS__); \ 399 reported = true; \ 400 } \ 401 } while (0) 402 403 /** 404 * Print a perf warning message. Set INTEL_DEBUG=perf to see these. 405 */ 406 #define anv_perf_warn(objects_macro, format, ...) \ 407 do { \ 408 static bool reported = false; \ 409 if (!reported && INTEL_DEBUG(DEBUG_PERF)) { \ 410 __vk_log(VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT, \ 411 VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, \ 412 objects_macro, __FILE__, __LINE__, \ 413 format, ## __VA_ARGS__); \ 414 reported = true; \ 415 } \ 416 } while (0) 417 418 /* A non-fatal assert. Useful for debugging. */ 419 #ifdef DEBUG 420 #define anv_assert(x) ({ \ 421 if (unlikely(!(x))) \ 422 mesa_loge("%s:%d ASSERT: %s", __FILE__, __LINE__, #x); \ 423 }) 424 #else 425 #define anv_assert(x) 426 #endif 427 428 struct anv_bo { 429 const char *name; 430 431 uint32_t gem_handle; 432 433 uint32_t refcount; 434 435 /* Index into the current validation list. This is used by the 436 * validation list building alrogithm to track which buffers are already 437 * in the validation list so that we can ensure uniqueness. 438 */ 439 uint32_t index; 440 441 /* Index for use with util_sparse_array_free_list */ 442 uint32_t free_index; 443 444 /* Last known offset. This value is provided by the kernel when we 445 * execbuf and is used as the presumed offset for the next bunch of 446 * relocations. 447 */ 448 uint64_t offset; 449 450 /** Size of the buffer not including implicit aux */ 451 uint64_t size; 452 453 /* Map for internally mapped BOs. 454 * 455 * If ANV_BO_WRAPPER is set in flags, map points to the wrapped BO. 456 */ 457 void *map; 458 459 /** Size of the implicit CCS range at the end of the buffer 460 * 461 * On Gfx12, CCS data is always a direct 1/256 scale-down. A single 64K 462 * page of main surface data maps to a 256B chunk of CCS data and that 463 * mapping is provided on TGL-LP by the AUX table which maps virtual memory 464 * addresses in the main surface to virtual memory addresses for CCS data. 465 * 466 * Because we can't change these maps around easily and because Vulkan 467 * allows two VkImages to be bound to overlapping memory regions (as long 468 * as the app is careful), it's not feasible to make this mapping part of 469 * the image. (On Gfx11 and earlier, the mapping was provided via 470 * RENDER_SURFACE_STATE so each image had its own main -> CCS mapping.) 471 * Instead, we attach the CCS data directly to the buffer object and setup 472 * the AUX table mapping at BO creation time. 473 * 474 * This field is for internal tracking use by the BO allocator only and 475 * should not be touched by other parts of the code. If something wants to 476 * know if a BO has implicit CCS data, it should instead look at the 477 * has_implicit_ccs boolean below. 478 * 479 * This data is not included in maps of this buffer. 480 */ 481 uint32_t _ccs_size; 482 483 /** Flags to pass to the kernel through drm_i915_exec_object2::flags */ 484 uint32_t flags; 485 486 /** True if this BO may be shared with other processes */ 487 bool is_external:1; 488 489 /** True if this BO is a wrapper 490 * 491 * When set to true, none of the fields in this BO are meaningful except 492 * for anv_bo::is_wrapper and anv_bo::map which points to the actual BO. 493 * See also anv_bo_unwrap(). Wrapper BOs are not allowed when use_softpin 494 * is set in the physical device. 495 */ 496 bool is_wrapper:1; 497 498 /** See also ANV_BO_ALLOC_FIXED_ADDRESS */ 499 bool has_fixed_address:1; 500 501 /** True if this BO wraps a host pointer */ 502 bool from_host_ptr:1; 503 504 /** See also ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS */ 505 bool has_client_visible_address:1; 506 507 /** True if this BO has implicit CCS data attached to it */ 508 bool has_implicit_ccs:1; 509 }; 510 511 static inline struct anv_bo * 512 anv_bo_ref(struct anv_bo *bo) 513 { 514 p_atomic_inc(&bo->refcount); 515 return bo; 516 } 517 518 static inline struct anv_bo * 519 anv_bo_unwrap(struct anv_bo *bo) 520 { 521 while (bo->is_wrapper) 522 bo = bo->map; 523 return bo; 524 } 525 526 /* Represents a lock-free linked list of "free" things. This is used by 527 * both the block pool and the state pools. Unfortunately, in order to 528 * solve the ABA problem, we can't use a single uint32_t head. 529 */ 530 union anv_free_list { 531 struct { 532 uint32_t offset; 533 534 /* A simple count that is incremented every time the head changes. */ 535 uint32_t count; 536 }; 537 /* Make sure it's aligned to 64 bits. This will make atomic operations 538 * faster on 32 bit platforms. 539 */ 540 uint64_t u64 __attribute__ ((aligned (8))); 541 }; 542 543 #define ANV_FREE_LIST_EMPTY ((union anv_free_list) { { UINT32_MAX, 0 } }) 544 545 struct anv_block_state { 546 union { 547 struct { 548 uint32_t next; 549 uint32_t end; 550 }; 551 /* Make sure it's aligned to 64 bits. This will make atomic operations 552 * faster on 32 bit platforms. 553 */ 554 uint64_t u64 __attribute__ ((aligned (8))); 555 }; 556 }; 557 558 #define anv_block_pool_foreach_bo(bo, pool) \ 559 for (struct anv_bo **_pp_bo = (pool)->bos, *bo; \ 560 _pp_bo != &(pool)->bos[(pool)->nbos] && (bo = *_pp_bo, true); \ 561 _pp_bo++) 562 563 #define ANV_MAX_BLOCK_POOL_BOS 20 564 565 struct anv_block_pool { 566 const char *name; 567 568 struct anv_device *device; 569 bool use_softpin; 570 571 /* Wrapper BO for use in relocation lists. This BO is simply a wrapper 572 * around the actual BO so that we grow the pool after the wrapper BO has 573 * been put in a relocation list. This is only used in the non-softpin 574 * case. 575 */ 576 struct anv_bo wrapper_bo; 577 578 struct anv_bo *bos[ANV_MAX_BLOCK_POOL_BOS]; 579 struct anv_bo *bo; 580 uint32_t nbos; 581 582 uint64_t size; 583 584 /* The address where the start of the pool is pinned. The various bos that 585 * are created as the pool grows will have addresses in the range 586 * [start_address, start_address + BLOCK_POOL_MEMFD_SIZE). 587 */ 588 uint64_t start_address; 589 590 /* The offset from the start of the bo to the "center" of the block 591 * pool. Pointers to allocated blocks are given by 592 * bo.map + center_bo_offset + offsets. 593 */ 594 uint32_t center_bo_offset; 595 596 /* Current memory map of the block pool. This pointer may or may not 597 * point to the actual beginning of the block pool memory. If 598 * anv_block_pool_alloc_back has ever been called, then this pointer 599 * will point to the "center" position of the buffer and all offsets 600 * (negative or positive) given out by the block pool alloc functions 601 * will be valid relative to this pointer. 602 * 603 * In particular, map == bo.map + center_offset 604 * 605 * DO NOT access this pointer directly. Use anv_block_pool_map() instead, 606 * since it will handle the softpin case as well, where this points to NULL. 607 */ 608 void *map; 609 int fd; 610 611 /** 612 * Array of mmaps and gem handles owned by the block pool, reclaimed when 613 * the block pool is destroyed. 614 */ 615 struct u_vector mmap_cleanups; 616 617 struct anv_block_state state; 618 619 struct anv_block_state back_state; 620 }; 621 622 /* Block pools are backed by a fixed-size 1GB memfd */ 623 #define BLOCK_POOL_MEMFD_SIZE (1ul << 30) 624 625 /* The center of the block pool is also the middle of the memfd. This may 626 * change in the future if we decide differently for some reason. 627 */ 628 #define BLOCK_POOL_MEMFD_CENTER (BLOCK_POOL_MEMFD_SIZE / 2) 629 630 static inline uint32_t 631 anv_block_pool_size(struct anv_block_pool *pool) 632 { 633 return pool->state.end + pool->back_state.end; 634 } 635 636 struct anv_state { 637 int32_t offset; 638 uint32_t alloc_size; 639 void *map; 640 uint32_t idx; 641 }; 642 643 #define ANV_STATE_NULL ((struct anv_state) { .alloc_size = 0 }) 644 645 struct anv_fixed_size_state_pool { 646 union anv_free_list free_list; 647 struct anv_block_state block; 648 }; 649 650 #define ANV_MIN_STATE_SIZE_LOG2 6 651 #define ANV_MAX_STATE_SIZE_LOG2 21 652 653 #define ANV_STATE_BUCKETS (ANV_MAX_STATE_SIZE_LOG2 - ANV_MIN_STATE_SIZE_LOG2 + 1) 654 655 struct anv_free_entry { 656 uint32_t next; 657 struct anv_state state; 658 }; 659 660 struct anv_state_table { 661 struct anv_device *device; 662 int fd; 663 struct anv_free_entry *map; 664 uint32_t size; 665 struct anv_block_state state; 666 struct u_vector cleanups; 667 }; 668 669 struct anv_state_pool { 670 struct anv_block_pool block_pool; 671 672 /* Offset into the relevant state base address where the state pool starts 673 * allocating memory. 674 */ 675 int32_t start_offset; 676 677 struct anv_state_table table; 678 679 /* The size of blocks which will be allocated from the block pool */ 680 uint32_t block_size; 681 682 /** Free list for "back" allocations */ 683 union anv_free_list back_alloc_free_list; 684 685 struct anv_fixed_size_state_pool buckets[ANV_STATE_BUCKETS]; 686 }; 687 688 struct anv_state_reserved_pool { 689 struct anv_state_pool *pool; 690 union anv_free_list reserved_blocks; 691 uint32_t count; 692 }; 693 694 struct anv_state_stream { 695 struct anv_state_pool *state_pool; 696 697 /* The size of blocks to allocate from the state pool */ 698 uint32_t block_size; 699 700 /* Current block we're allocating from */ 701 struct anv_state block; 702 703 /* Offset into the current block at which to allocate the next state */ 704 uint32_t next; 705 706 /* List of all blocks allocated from this pool */ 707 struct util_dynarray all_blocks; 708 }; 709 710 /* The block_pool functions exported for testing only. The block pool should 711 * only be used via a state pool (see below). 712 */ 713 VkResult anv_block_pool_init(struct anv_block_pool *pool, 714 struct anv_device *device, 715 const char *name, 716 uint64_t start_address, 717 uint32_t initial_size); 718 void anv_block_pool_finish(struct anv_block_pool *pool); 719 int32_t anv_block_pool_alloc(struct anv_block_pool *pool, 720 uint32_t block_size, uint32_t *padding); 721 int32_t anv_block_pool_alloc_back(struct anv_block_pool *pool, 722 uint32_t block_size); 723 void* anv_block_pool_map(struct anv_block_pool *pool, int32_t offset, uint32_t 724 size); 725 726 VkResult anv_state_pool_init(struct anv_state_pool *pool, 727 struct anv_device *device, 728 const char *name, 729 uint64_t base_address, 730 int32_t start_offset, 731 uint32_t block_size); 732 void anv_state_pool_finish(struct anv_state_pool *pool); 733 struct anv_state anv_state_pool_alloc(struct anv_state_pool *pool, 734 uint32_t state_size, uint32_t alignment); 735 struct anv_state anv_state_pool_alloc_back(struct anv_state_pool *pool); 736 void anv_state_pool_free(struct anv_state_pool *pool, struct anv_state state); 737 void anv_state_stream_init(struct anv_state_stream *stream, 738 struct anv_state_pool *state_pool, 739 uint32_t block_size); 740 void anv_state_stream_finish(struct anv_state_stream *stream); 741 struct anv_state anv_state_stream_alloc(struct anv_state_stream *stream, 742 uint32_t size, uint32_t alignment); 743 744 void anv_state_reserved_pool_init(struct anv_state_reserved_pool *pool, 745 struct anv_state_pool *parent, 746 uint32_t count, uint32_t size, 747 uint32_t alignment); 748 void anv_state_reserved_pool_finish(struct anv_state_reserved_pool *pool); 749 struct anv_state anv_state_reserved_pool_alloc(struct anv_state_reserved_pool *pool); 750 void anv_state_reserved_pool_free(struct anv_state_reserved_pool *pool, 751 struct anv_state state); 752 753 VkResult anv_state_table_init(struct anv_state_table *table, 754 struct anv_device *device, 755 uint32_t initial_entries); 756 void anv_state_table_finish(struct anv_state_table *table); 757 VkResult anv_state_table_add(struct anv_state_table *table, uint32_t *idx, 758 uint32_t count); 759 void anv_free_list_push(union anv_free_list *list, 760 struct anv_state_table *table, 761 uint32_t idx, uint32_t count); 762 struct anv_state* anv_free_list_pop(union anv_free_list *list, 763 struct anv_state_table *table); 764 765 766 static inline struct anv_state * 767 anv_state_table_get(struct anv_state_table *table, uint32_t idx) 768 { 769 return &table->map[idx].state; 770 } 771 /** 772 * Implements a pool of re-usable BOs. The interface is identical to that 773 * of block_pool except that each block is its own BO. 774 */ 775 struct anv_bo_pool { 776 const char *name; 777 778 struct anv_device *device; 779 780 struct util_sparse_array_free_list free_list[16]; 781 }; 782 783 void anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device, 784 const char *name); 785 void anv_bo_pool_finish(struct anv_bo_pool *pool); 786 VkResult anv_bo_pool_alloc(struct anv_bo_pool *pool, uint32_t size, 787 struct anv_bo **bo_out); 788 void anv_bo_pool_free(struct anv_bo_pool *pool, struct anv_bo *bo); 789 790 struct anv_scratch_pool { 791 /* Indexed by Per-Thread Scratch Space number (the hardware value) and stage */ 792 struct anv_bo *bos[16][MESA_SHADER_STAGES]; 793 uint32_t surfs[16]; 794 struct anv_state surf_states[16]; 795 }; 796 797 void anv_scratch_pool_init(struct anv_device *device, 798 struct anv_scratch_pool *pool); 799 void anv_scratch_pool_finish(struct anv_device *device, 800 struct anv_scratch_pool *pool); 801 struct anv_bo *anv_scratch_pool_alloc(struct anv_device *device, 802 struct anv_scratch_pool *pool, 803 gl_shader_stage stage, 804 unsigned per_thread_scratch); 805 uint32_t anv_scratch_pool_get_surf(struct anv_device *device, 806 struct anv_scratch_pool *pool, 807 unsigned per_thread_scratch); 808 809 /** Implements a BO cache that ensures a 1-1 mapping of GEM BOs to anv_bos */ 810 struct anv_bo_cache { 811 struct util_sparse_array bo_map; 812 pthread_mutex_t mutex; 813 }; 814 815 VkResult anv_bo_cache_init(struct anv_bo_cache *cache, 816 struct anv_device *device); 817 void anv_bo_cache_finish(struct anv_bo_cache *cache); 818 819 struct anv_queue_family { 820 /* Standard bits passed on to the client */ 821 VkQueueFlags queueFlags; 822 uint32_t queueCount; 823 824 /* Driver internal information */ 825 enum drm_i915_gem_engine_class engine_class; 826 }; 827 828 #define ANV_MAX_QUEUE_FAMILIES 3 829 830 struct anv_memory_type { 831 /* Standard bits passed on to the client */ 832 VkMemoryPropertyFlags propertyFlags; 833 uint32_t heapIndex; 834 }; 835 836 struct anv_memory_heap { 837 /* Standard bits passed on to the client */ 838 VkDeviceSize size; 839 VkMemoryHeapFlags flags; 840 841 /** Driver-internal book-keeping. 842 * 843 * Align it to 64 bits to make atomic operations faster on 32 bit platforms. 844 */ 845 VkDeviceSize used __attribute__ ((aligned (8))); 846 847 bool is_local_mem; 848 }; 849 850 struct anv_memregion { 851 struct drm_i915_gem_memory_class_instance region; 852 uint64_t size; 853 uint64_t available; 854 }; 855 856 struct anv_physical_device { 857 struct vk_physical_device vk; 858 859 /* Link in anv_instance::physical_devices */ 860 struct list_head link; 861 862 struct anv_instance * instance; 863 char path[20]; 864 struct { 865 uint16_t domain; 866 uint8_t bus; 867 uint8_t device; 868 uint8_t function; 869 } pci_info; 870 struct intel_device_info info; 871 /** Amount of "GPU memory" we want to advertise 872 * 873 * Clearly, this value is bogus since Intel is a UMA architecture. On 874 * gfx7 platforms, we are limited by GTT size unless we want to implement 875 * fine-grained tracking and GTT splitting. On Broadwell and above we are 876 * practically unlimited. However, we will never report more than 3/4 of 877 * the total system ram to try and avoid running out of RAM. 878 */ 879 bool supports_48bit_addresses; 880 struct brw_compiler * compiler; 881 struct isl_device isl_dev; 882 struct intel_perf_config * perf; 883 /* True if hardware support is incomplete/alpha */ 884 bool is_alpha; 885 /* 886 * Number of commands required to implement a performance query begin + 887 * end. 888 */ 889 uint32_t n_perf_query_commands; 890 int cmd_parser_version; 891 bool has_exec_async; 892 bool has_exec_capture; 893 bool has_exec_fence; 894 bool has_syncobj_wait; 895 bool has_syncobj_wait_available; 896 bool has_context_priority; 897 bool has_context_isolation; 898 bool has_thread_submit; 899 bool has_mmap_offset; 900 bool has_userptr_probe; 901 uint64_t gtt_size; 902 903 bool use_softpin; 904 bool always_use_bindless; 905 bool use_call_secondary; 906 907 /** True if we can access buffers using A64 messages */ 908 bool has_a64_buffer_access; 909 /** True if we can use bindless access for images */ 910 bool has_bindless_images; 911 /** True if we can use bindless access for samplers */ 912 bool has_bindless_samplers; 913 /** True if we can use timeline semaphores through execbuf */ 914 bool has_exec_timeline; 915 916 /** True if we can read the GPU timestamp register 917 * 918 * When running in a virtual context, the timestamp register is unreadable 919 * on Gfx12+. 920 */ 921 bool has_reg_timestamp; 922 923 /** True if this device has implicit AUX 924 * 925 * If true, CCS is handled as an implicit attachment to the BO rather than 926 * as an explicitly bound surface. 927 */ 928 bool has_implicit_ccs; 929 930 bool always_flush_cache; 931 932 struct { 933 uint32_t family_count; 934 struct anv_queue_family families[ANV_MAX_QUEUE_FAMILIES]; 935 } queue; 936 937 struct { 938 uint32_t type_count; 939 struct anv_memory_type types[VK_MAX_MEMORY_TYPES]; 940 uint32_t heap_count; 941 struct anv_memory_heap heaps[VK_MAX_MEMORY_HEAPS]; 942 bool need_clflush; 943 } memory; 944 945 struct anv_memregion vram; 946 struct anv_memregion sys; 947 uint8_t driver_build_sha1[20]; 948 uint8_t pipeline_cache_uuid[VK_UUID_SIZE]; 949 uint8_t driver_uuid[VK_UUID_SIZE]; 950 uint8_t device_uuid[VK_UUID_SIZE]; 951 952 struct disk_cache * disk_cache; 953 954 struct wsi_device wsi_device; 955 int local_fd; 956 bool has_local; 957 int64_t local_major; 958 int64_t local_minor; 959 int master_fd; 960 bool has_master; 961 int64_t master_major; 962 int64_t master_minor; 963 struct drm_i915_query_engine_info * engine_info; 964 965 void (*cmd_emit_timestamp)(struct anv_batch *, struct anv_bo *, uint32_t ); 966 struct intel_measure_device measure_device; 967 }; 968 969 struct anv_app_info { 970 const char* app_name; 971 uint32_t app_version; 972 const char* engine_name; 973 uint32_t engine_version; 974 uint32_t api_version; 975 }; 976 977 struct anv_instance { 978 struct vk_instance vk; 979 980 bool physical_devices_enumerated; 981 struct list_head physical_devices; 982 983 bool pipeline_cache_enabled; 984 985 struct driOptionCache dri_options; 986 struct driOptionCache available_dri_options; 987 }; 988 989 VkResult anv_init_wsi(struct anv_physical_device *physical_device); 990 void anv_finish_wsi(struct anv_physical_device *physical_device); 991 992 struct anv_queue_submit { 993 struct anv_cmd_buffer ** cmd_buffers; 994 uint32_t cmd_buffer_count; 995 uint32_t cmd_buffer_array_length; 996 997 uint32_t fence_count; 998 uint32_t fence_array_length; 999 struct drm_i915_gem_exec_fence * fences; 1000 uint64_t * fence_values; 1001 1002 uint32_t temporary_semaphore_count; 1003 uint32_t temporary_semaphore_array_length; 1004 struct anv_semaphore_impl * temporary_semaphores; 1005 1006 /* Allocated only with non shareable timelines. */ 1007 union { 1008 struct anv_timeline ** wait_timelines; 1009 uint32_t * wait_timeline_syncobjs; 1010 }; 1011 uint32_t wait_timeline_count; 1012 uint32_t wait_timeline_array_length; 1013 uint64_t * wait_timeline_values; 1014 1015 struct anv_timeline ** signal_timelines; 1016 uint32_t signal_timeline_count; 1017 uint32_t signal_timeline_array_length; 1018 uint64_t * signal_timeline_values; 1019 1020 int in_fence; 1021 bool need_out_fence; 1022 int out_fence; 1023 1024 uint32_t fence_bo_count; 1025 uint32_t fence_bo_array_length; 1026 /* An array of struct anv_bo pointers with lower bit used as a flag to 1027 * signal we will wait on that BO (see anv_(un)pack_ptr). 1028 */ 1029 uintptr_t * fence_bos; 1030 1031 int perf_query_pass; 1032 struct anv_query_pool * perf_query_pool; 1033 1034 const VkAllocationCallbacks * alloc; 1035 VkSystemAllocationScope alloc_scope; 1036 1037 struct anv_bo * simple_bo; 1038 uint32_t simple_bo_size; 1039 1040 struct list_head link; 1041 }; 1042 1043 struct anv_queue { 1044 struct vk_queue vk; 1045 1046 struct anv_device * device; 1047 1048 const struct anv_queue_family * family; 1049 1050 uint32_t exec_flags; 1051 1052 /* Set once from the device api calls. */ 1053 bool lost_signaled; 1054 1055 /* Only set once atomically by the queue */ 1056 int lost; 1057 int error_line; 1058 const char * error_file; 1059 char error_msg[80]; 1060 1061 /* 1062 * This mutext protects the variables below. 1063 */ 1064 pthread_mutex_t mutex; 1065 1066 pthread_t thread; 1067 pthread_cond_t cond; 1068 1069 /* 1070 * A list of struct anv_queue_submit to be submitted to i915. 1071 */ 1072 struct list_head queued_submits; 1073 1074 /* Set to true to stop the submission thread */ 1075 bool quit; 1076 }; 1077 1078 struct anv_pipeline_cache { 1079 struct vk_object_base base; 1080 struct anv_device * device; 1081 pthread_mutex_t mutex; 1082 1083 struct hash_table * nir_cache; 1084 1085 struct hash_table * cache; 1086 1087 bool external_sync; 1088 }; 1089 1090 struct nir_xfb_info; 1091 struct anv_pipeline_bind_map; 1092 1093 void anv_pipeline_cache_init(struct anv_pipeline_cache *cache, 1094 struct anv_device *device, 1095 bool cache_enabled, 1096 bool external_sync); 1097 void anv_pipeline_cache_finish(struct anv_pipeline_cache *cache); 1098 1099 struct anv_shader_bin * 1100 anv_pipeline_cache_search(struct anv_pipeline_cache *cache, 1101 const void *key, uint32_t key_size); 1102 struct anv_shader_bin * 1103 anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache, 1104 gl_shader_stage stage, 1105 const void *key_data, uint32_t key_size, 1106 const void *kernel_data, uint32_t kernel_size, 1107 const struct brw_stage_prog_data *prog_data, 1108 uint32_t prog_data_size, 1109 const struct brw_compile_stats *stats, 1110 uint32_t num_stats, 1111 const struct nir_xfb_info *xfb_info, 1112 const struct anv_pipeline_bind_map *bind_map); 1113 1114 struct anv_shader_bin * 1115 anv_device_search_for_kernel(struct anv_device *device, 1116 struct anv_pipeline_cache *cache, 1117 const void *key_data, uint32_t key_size, 1118 bool *user_cache_bit); 1119 1120 struct anv_shader_bin * 1121 anv_device_upload_kernel(struct anv_device *device, 1122 struct anv_pipeline_cache *cache, 1123 gl_shader_stage stage, 1124 const void *key_data, uint32_t key_size, 1125 const void *kernel_data, uint32_t kernel_size, 1126 const struct brw_stage_prog_data *prog_data, 1127 uint32_t prog_data_size, 1128 const struct brw_compile_stats *stats, 1129 uint32_t num_stats, 1130 const struct nir_xfb_info *xfb_info, 1131 const struct anv_pipeline_bind_map *bind_map); 1132 1133 struct nir_shader; 1134 struct nir_shader_compiler_options; 1135 1136 struct nir_shader * 1137 anv_device_search_for_nir(struct anv_device *device, 1138 struct anv_pipeline_cache *cache, 1139 const struct nir_shader_compiler_options *nir_options, 1140 unsigned char sha1_key[20], 1141 void *mem_ctx); 1142 1143 void 1144 anv_device_upload_nir(struct anv_device *device, 1145 struct anv_pipeline_cache *cache, 1146 const struct nir_shader *nir, 1147 unsigned char sha1_key[20]); 1148 1149 struct anv_address { 1150 struct anv_bo *bo; 1151 int64_t offset; 1152 }; 1153 1154 struct anv_device { 1155 struct vk_device vk; 1156 1157 struct anv_physical_device * physical; 1158 struct intel_device_info info; 1159 struct isl_device isl_dev; 1160 int context_id; 1161 int fd; 1162 bool can_chain_batches; 1163 bool robust_buffer_access; 1164 bool has_thread_submit; 1165 1166 pthread_mutex_t vma_mutex; 1167 struct util_vma_heap vma_lo; 1168 struct util_vma_heap vma_cva; 1169 struct util_vma_heap vma_hi; 1170 1171 /** List of all anv_device_memory objects */ 1172 struct list_head memory_objects; 1173 1174 struct anv_bo_pool batch_bo_pool; 1175 1176 struct anv_bo_cache bo_cache; 1177 1178 struct anv_state_pool general_state_pool; 1179 struct anv_state_pool dynamic_state_pool; 1180 struct anv_state_pool instruction_state_pool; 1181 struct anv_state_pool binding_table_pool; 1182 struct anv_state_pool surface_state_pool; 1183 1184 struct anv_state_reserved_pool custom_border_colors; 1185 1186 /** BO used for various workarounds 1187 * 1188 * There are a number of workarounds on our hardware which require writing 1189 * data somewhere and it doesn't really matter where. For that, we use 1190 * this BO and just write to the first dword or so. 1191 * 1192 * We also need to be able to handle NULL buffers bound as pushed UBOs. 1193 * For that, we use the high bytes (>= 1024) of the workaround BO. 1194 */ 1195 struct anv_bo * workaround_bo; 1196 struct anv_address workaround_address; 1197 1198 struct anv_bo * trivial_batch_bo; 1199 struct anv_state null_surface_state; 1200 1201 struct anv_pipeline_cache default_pipeline_cache; 1202 struct blorp_context blorp; 1203 1204 struct anv_state border_colors; 1205 1206 struct anv_state slice_hash; 1207 1208 uint32_t queue_count; 1209 struct anv_queue * queues; 1210 1211 struct anv_scratch_pool scratch_pool; 1212 struct anv_bo *rt_scratch_bos[16]; 1213 1214 struct anv_shader_bin *rt_trampoline; 1215 struct anv_shader_bin *rt_trivial_return; 1216 1217 pthread_mutex_t mutex; 1218 pthread_cond_t queue_submit; 1219 int _lost; 1220 int lost_reported; 1221 1222 struct intel_batch_decode_ctx decoder_ctx; 1223 /* 1224 * When decoding a anv_cmd_buffer, we might need to search for BOs through 1225 * the cmd_buffer's list. 1226 */ 1227 struct anv_cmd_buffer *cmd_buffer_being_decoded; 1228 1229 int perf_fd; /* -1 if no opened */ 1230 uint64_t perf_metric; /* 0 if unset */ 1231 1232 struct intel_aux_map_context *aux_map_ctx; 1233 1234 const struct intel_l3_config *l3_config; 1235 1236 struct intel_debug_block_frame *debug_frame_desc; 1237 }; 1238 1239 #if defined(GFX_VERx10) && GFX_VERx10 >= 90 1240 #define ANV_ALWAYS_SOFTPIN true 1241 #else 1242 #define ANV_ALWAYS_SOFTPIN false 1243 #endif 1244 1245 static inline bool 1246 anv_use_softpin(const struct anv_physical_device *pdevice) 1247 { 1248 #if defined(GFX_VERx10) && GFX_VERx10 >= 90 1249 /* Sky Lake and later always uses softpin */ 1250 assert(pdevice->use_softpin); 1251 return true; 1252 #elif defined(GFX_VERx10) && GFX_VERx10 < 80 1253 /* Haswell and earlier never use softpin */ 1254 assert(!pdevice->use_softpin); 1255 return false; 1256 #else 1257 /* If we don't have a GFX_VERx10 #define, we need to look at the physical 1258 * device. Also, for GFX version 8, we need to look at the physical 1259 * device because Broadwell softpins but Cherryview doesn't. 1260 */ 1261 return pdevice->use_softpin; 1262 #endif 1263 } 1264 1265 static inline struct anv_state_pool * 1266 anv_binding_table_pool(struct anv_device *device) 1267 { 1268 if (anv_use_softpin(device->physical)) 1269 return &device->binding_table_pool; 1270 else 1271 return &device->surface_state_pool; 1272 } 1273 1274 static inline struct anv_state 1275 anv_binding_table_pool_alloc(struct anv_device *device) 1276 { 1277 if (anv_use_softpin(device->physical)) 1278 return anv_state_pool_alloc(&device->binding_table_pool, 1279 device->binding_table_pool.block_size, 0); 1280 else 1281 return anv_state_pool_alloc_back(&device->surface_state_pool); 1282 } 1283 1284 static inline void 1285 anv_binding_table_pool_free(struct anv_device *device, struct anv_state state) { 1286 anv_state_pool_free(anv_binding_table_pool(device), state); 1287 } 1288 1289 static inline uint32_t 1290 anv_mocs(const struct anv_device *device, 1291 const struct anv_bo *bo, 1292 isl_surf_usage_flags_t usage) 1293 { 1294 return isl_mocs(&device->isl_dev, usage, bo && bo->is_external); 1295 } 1296 1297 void anv_device_init_blorp(struct anv_device *device); 1298 void anv_device_finish_blorp(struct anv_device *device); 1299 1300 void _anv_device_report_lost(struct anv_device *device); 1301 VkResult _anv_device_set_lost(struct anv_device *device, 1302 const char *file, int line, 1303 const char *msg, ...) 1304 anv_printflike(4, 5); 1305 VkResult _anv_queue_set_lost(struct anv_queue *queue, 1306 const char *file, int line, 1307 const char *msg, ...) 1308 anv_printflike(4, 5); 1309 #define anv_device_set_lost(dev, ...) \ 1310 _anv_device_set_lost(dev, __FILE__, __LINE__, __VA_ARGS__) 1311 #define anv_queue_set_lost(queue, ...) \ 1312 (queue)->device->has_thread_submit ? \ 1313 _anv_queue_set_lost(queue, __FILE__, __LINE__, __VA_ARGS__) : \ 1314 _anv_device_set_lost(queue->device, __FILE__, __LINE__, __VA_ARGS__) 1315 1316 static inline bool 1317 anv_device_is_lost(struct anv_device *device) 1318 { 1319 int lost = p_atomic_read(&device->_lost); 1320 if (unlikely(lost && !device->lost_reported)) 1321 _anv_device_report_lost(device); 1322 return lost; 1323 } 1324 1325 VkResult anv_device_query_status(struct anv_device *device); 1326 1327 1328 enum anv_bo_alloc_flags { 1329 /** Specifies that the BO must have a 32-bit address 1330 * 1331 * This is the opposite of EXEC_OBJECT_SUPPORTS_48B_ADDRESS. 1332 */ 1333 ANV_BO_ALLOC_32BIT_ADDRESS = (1 << 0), 1334 1335 /** Specifies that the BO may be shared externally */ 1336 ANV_BO_ALLOC_EXTERNAL = (1 << 1), 1337 1338 /** Specifies that the BO should be mapped */ 1339 ANV_BO_ALLOC_MAPPED = (1 << 2), 1340 1341 /** Specifies that the BO should be snooped so we get coherency */ 1342 ANV_BO_ALLOC_SNOOPED = (1 << 3), 1343 1344 /** Specifies that the BO should be captured in error states */ 1345 ANV_BO_ALLOC_CAPTURE = (1 << 4), 1346 1347 /** Specifies that the BO will have an address assigned by the caller 1348 * 1349 * Such BOs do not exist in any VMA heap. 1350 */ 1351 ANV_BO_ALLOC_FIXED_ADDRESS = (1 << 5), 1352 1353 /** Enables implicit synchronization on the BO 1354 * 1355 * This is the opposite of EXEC_OBJECT_ASYNC. 1356 */ 1357 ANV_BO_ALLOC_IMPLICIT_SYNC = (1 << 6), 1358 1359 /** Enables implicit synchronization on the BO 1360 * 1361 * This is equivalent to EXEC_OBJECT_WRITE. 1362 */ 1363 ANV_BO_ALLOC_IMPLICIT_WRITE = (1 << 7), 1364 1365 /** Has an address which is visible to the client */ 1366 ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS = (1 << 8), 1367 1368 /** This buffer has implicit CCS data attached to it */ 1369 ANV_BO_ALLOC_IMPLICIT_CCS = (1 << 9), 1370 1371 /** This buffer is allocated from local memory */ 1372 ANV_BO_ALLOC_LOCAL_MEM = (1 << 10), 1373 }; 1374 1375 VkResult anv_device_alloc_bo(struct anv_device *device, 1376 const char *name, uint64_t size, 1377 enum anv_bo_alloc_flags alloc_flags, 1378 uint64_t explicit_address, 1379 struct anv_bo **bo); 1380 VkResult anv_device_import_bo_from_host_ptr(struct anv_device *device, 1381 void *host_ptr, uint32_t size, 1382 enum anv_bo_alloc_flags alloc_flags, 1383 uint64_t client_address, 1384 struct anv_bo **bo_out); 1385 VkResult anv_device_import_bo(struct anv_device *device, int fd, 1386 enum anv_bo_alloc_flags alloc_flags, 1387 uint64_t client_address, 1388 struct anv_bo **bo); 1389 VkResult anv_device_export_bo(struct anv_device *device, 1390 struct anv_bo *bo, int *fd_out); 1391 void anv_device_release_bo(struct anv_device *device, 1392 struct anv_bo *bo); 1393 1394 static inline struct anv_bo * 1395 anv_device_lookup_bo(struct anv_device *device, uint32_t gem_handle) 1396 { 1397 return util_sparse_array_get(&device->bo_cache.bo_map, gem_handle); 1398 } 1399 1400 VkResult anv_device_bo_busy(struct anv_device *device, struct anv_bo *bo); 1401 VkResult anv_device_wait(struct anv_device *device, struct anv_bo *bo, 1402 int64_t timeout); 1403 1404 VkResult anv_queue_init(struct anv_device *device, struct anv_queue *queue, 1405 uint32_t exec_flags, 1406 const VkDeviceQueueCreateInfo *pCreateInfo, 1407 uint32_t index_in_family); 1408 void anv_queue_finish(struct anv_queue *queue); 1409 1410 VkResult anv_queue_execbuf_locked(struct anv_queue *queue, struct anv_queue_submit *submit); 1411 VkResult anv_queue_submit_simple_batch(struct anv_queue *queue, 1412 struct anv_batch *batch); 1413 1414 uint64_t anv_gettime_ns(void); 1415 uint64_t anv_get_absolute_timeout(uint64_t timeout); 1416 1417 void* anv_gem_mmap(struct anv_device *device, 1418 uint32_t gem_handle, uint64_t offset, uint64_t size, uint32_t flags); 1419 void anv_gem_munmap(struct anv_device *device, void *p, uint64_t size); 1420 uint32_t anv_gem_create(struct anv_device *device, uint64_t size); 1421 void anv_gem_close(struct anv_device *device, uint32_t gem_handle); 1422 uint32_t anv_gem_create_regions(struct anv_device *device, uint64_t anv_bo_size, 1423 uint32_t num_regions, 1424 struct drm_i915_gem_memory_class_instance *regions); 1425 uint32_t anv_gem_userptr(struct anv_device *device, void *mem, size_t size); 1426 int anv_gem_busy(struct anv_device *device, uint32_t gem_handle); 1427 int anv_gem_wait(struct anv_device *device, uint32_t gem_handle, int64_t *timeout_ns); 1428 int anv_gem_execbuffer(struct anv_device *device, 1429 struct drm_i915_gem_execbuffer2 *execbuf); 1430 int anv_gem_set_tiling(struct anv_device *device, uint32_t gem_handle, 1431 uint32_t stride, uint32_t tiling); 1432 int anv_gem_create_context(struct anv_device *device); 1433 int anv_gem_create_context_engines(struct anv_device *device, 1434 const struct drm_i915_query_engine_info *info, 1435 int num_engines, 1436 uint16_t *engine_classes); 1437 bool anv_gem_has_context_priority(int fd); 1438 int anv_gem_destroy_context(struct anv_device *device, int context); 1439 int anv_gem_set_context_param(int fd, int context, uint32_t param, 1440 uint64_t value); 1441 int anv_gem_get_context_param(int fd, int context, uint32_t param, 1442 uint64_t *value); 1443 int anv_gem_get_param(int fd, uint32_t param); 1444 uint64_t anv_gem_get_drm_cap(int fd, uint32_t capability); 1445 int anv_gem_get_tiling(struct anv_device *device, uint32_t gem_handle); 1446 bool anv_gem_get_bit6_swizzle(int fd, uint32_t tiling); 1447 int anv_gem_context_get_reset_stats(int fd, int context, 1448 uint32_t *active, uint32_t *pending); 1449 int anv_gem_handle_to_fd(struct anv_device *device, uint32_t gem_handle); 1450 int anv_gem_reg_read(int fd, uint32_t offset, uint64_t *result); 1451 uint32_t anv_gem_fd_to_handle(struct anv_device *device, int fd); 1452 int anv_gem_set_caching(struct anv_device *device, uint32_t gem_handle, uint32_t caching); 1453 int anv_gem_set_domain(struct anv_device *device, uint32_t gem_handle, 1454 uint32_t read_domains, uint32_t write_domain); 1455 int anv_gem_sync_file_merge(struct anv_device *device, int fd1, int fd2); 1456 uint32_t anv_gem_syncobj_create(struct anv_device *device, uint32_t flags); 1457 void anv_gem_syncobj_destroy(struct anv_device *device, uint32_t handle); 1458 int anv_gem_syncobj_handle_to_fd(struct anv_device *device, uint32_t handle); 1459 uint32_t anv_gem_syncobj_fd_to_handle(struct anv_device *device, int fd); 1460 int anv_gem_syncobj_export_sync_file(struct anv_device *device, 1461 uint32_t handle); 1462 int anv_gem_syncobj_import_sync_file(struct anv_device *device, 1463 uint32_t handle, int fd); 1464 void anv_gem_syncobj_reset(struct anv_device *device, uint32_t handle); 1465 bool anv_gem_supports_syncobj_wait(int fd); 1466 int anv_gem_syncobj_wait(struct anv_device *device, 1467 const uint32_t *handles, uint32_t num_handles, 1468 int64_t abs_timeout_ns, bool wait_all); 1469 int anv_gem_syncobj_timeline_wait(struct anv_device *device, 1470 const uint32_t *handles, const uint64_t *points, 1471 uint32_t num_items, int64_t abs_timeout_ns, 1472 bool wait_all, bool wait_materialize); 1473 int anv_gem_syncobj_timeline_signal(struct anv_device *device, 1474 const uint32_t *handles, const uint64_t *points, 1475 uint32_t num_items); 1476 int anv_gem_syncobj_timeline_query(struct anv_device *device, 1477 const uint32_t *handles, uint64_t *points, 1478 uint32_t num_items); 1479 int anv_i915_query(int fd, uint64_t query_id, void *buffer, 1480 int32_t *buffer_len); 1481 struct drm_i915_query_engine_info *anv_gem_get_engine_info(int fd); 1482 int anv_gem_count_engines(const struct drm_i915_query_engine_info *info, 1483 uint16_t engine_class); 1484 1485 uint64_t anv_vma_alloc(struct anv_device *device, 1486 uint64_t size, uint64_t align, 1487 enum anv_bo_alloc_flags alloc_flags, 1488 uint64_t client_address); 1489 void anv_vma_free(struct anv_device *device, 1490 uint64_t address, uint64_t size); 1491 1492 struct anv_reloc_list { 1493 uint32_t num_relocs; 1494 uint32_t array_length; 1495 struct drm_i915_gem_relocation_entry * relocs; 1496 struct anv_bo ** reloc_bos; 1497 uint32_t dep_words; 1498 BITSET_WORD * deps; 1499 }; 1500 1501 VkResult anv_reloc_list_init(struct anv_reloc_list *list, 1502 const VkAllocationCallbacks *alloc); 1503 void anv_reloc_list_finish(struct anv_reloc_list *list, 1504 const VkAllocationCallbacks *alloc); 1505 1506 VkResult anv_reloc_list_add(struct anv_reloc_list *list, 1507 const VkAllocationCallbacks *alloc, 1508 uint32_t offset, struct anv_bo *target_bo, 1509 uint32_t delta, uint64_t *address_u64_out); 1510 1511 VkResult anv_reloc_list_add_bo(struct anv_reloc_list *list, 1512 const VkAllocationCallbacks *alloc, 1513 struct anv_bo *target_bo); 1514 1515 struct anv_batch_bo { 1516 /* Link in the anv_cmd_buffer.owned_batch_bos list */ 1517 struct list_head link; 1518 1519 struct anv_bo * bo; 1520 1521 /* Bytes actually consumed in this batch BO */ 1522 uint32_t length; 1523 1524 /* When this batch BO is used as part of a primary batch buffer, this 1525 * tracked whether it is chained to another primary batch buffer. 1526 * 1527 * If this is the case, the relocation list's last entry points the 1528 * location of the MI_BATCH_BUFFER_START chaining to the next batch. 1529 */ 1530 bool chained; 1531 1532 struct anv_reloc_list relocs; 1533 }; 1534 1535 struct anv_batch { 1536 const VkAllocationCallbacks * alloc; 1537 1538 struct anv_address start_addr; 1539 1540 void * start; 1541 void * end; 1542 void * next; 1543 1544 struct anv_reloc_list * relocs; 1545 1546 /* This callback is called (with the associated user data) in the event 1547 * that the batch runs out of space. 1548 */ 1549 VkResult (*extend_cb)(struct anv_batch *, void *); 1550 void * user_data; 1551 1552 /** 1553 * Current error status of the command buffer. Used to track inconsistent 1554 * or incomplete command buffer states that are the consequence of run-time 1555 * errors such as out of memory scenarios. We want to track this in the 1556 * batch because the command buffer object is not visible to some parts 1557 * of the driver. 1558 */ 1559 VkResult status; 1560 }; 1561 1562 void *anv_batch_emit_dwords(struct anv_batch *batch, int num_dwords); 1563 void anv_batch_emit_batch(struct anv_batch *batch, struct anv_batch *other); 1564 struct anv_address anv_batch_address(struct anv_batch *batch, void *batch_location); 1565 1566 static inline void 1567 anv_batch_set_storage(struct anv_batch *batch, struct anv_address addr, 1568 void *map, size_t size) 1569 { 1570 batch->start_addr = addr; 1571 batch->next = batch->start = map; 1572 batch->end = map + size; 1573 } 1574 1575 static inline VkResult 1576 anv_batch_set_error(struct anv_batch *batch, VkResult error) 1577 { 1578 assert(error != VK_SUCCESS); 1579 if (batch->status == VK_SUCCESS) 1580 batch->status = error; 1581 return batch->status; 1582 } 1583 1584 static inline bool 1585 anv_batch_has_error(struct anv_batch *batch) 1586 { 1587 return batch->status != VK_SUCCESS; 1588 } 1589 1590 static inline uint64_t 1591 anv_batch_emit_reloc(struct anv_batch *batch, 1592 void *location, struct anv_bo *bo, uint32_t delta) 1593 { 1594 uint64_t address_u64 = 0; 1595 VkResult result; 1596 1597 if (ANV_ALWAYS_SOFTPIN) { 1598 address_u64 = bo->offset + delta; 1599 result = anv_reloc_list_add_bo(batch->relocs, batch->alloc, bo); 1600 } else { 1601 result = anv_reloc_list_add(batch->relocs, batch->alloc, 1602 location - batch->start, bo, delta, 1603 &address_u64); 1604 } 1605 if (unlikely(result != VK_SUCCESS)) { 1606 anv_batch_set_error(batch, result); 1607 return 0; 1608 } 1609 1610 return address_u64; 1611 } 1612 1613 1614 #define ANV_NULL_ADDRESS ((struct anv_address) { NULL, 0 }) 1615 1616 static inline struct anv_address 1617 anv_address_from_u64(uint64_t addr_u64) 1618 { 1619 assert(addr_u64 == intel_canonical_address(addr_u64)); 1620 return (struct anv_address) { 1621 .bo = NULL, 1622 .offset = addr_u64, 1623 }; 1624 } 1625 1626 static inline bool 1627 anv_address_is_null(struct anv_address addr) 1628 { 1629 return addr.bo == NULL && addr.offset == 0; 1630 } 1631 1632 static inline uint64_t 1633 anv_address_physical(struct anv_address addr) 1634 { 1635 if (addr.bo && (ANV_ALWAYS_SOFTPIN || 1636 (addr.bo->flags & EXEC_OBJECT_PINNED))) { 1637 assert(addr.bo->flags & EXEC_OBJECT_PINNED); 1638 return intel_canonical_address(addr.bo->offset + addr.offset); 1639 } else { 1640 return intel_canonical_address(addr.offset); 1641 } 1642 } 1643 1644 static inline struct anv_address 1645 anv_address_add(struct anv_address addr, uint64_t offset) 1646 { 1647 addr.offset += offset; 1648 return addr; 1649 } 1650 1651 static inline void 1652 write_reloc(const struct anv_device *device, void *p, uint64_t v, bool flush) 1653 { 1654 unsigned reloc_size = 0; 1655 if (device->info.ver >= 8) { 1656 reloc_size = sizeof(uint64_t); 1657 *(uint64_t *)p = intel_canonical_address(v); 1658 } else { 1659 reloc_size = sizeof(uint32_t); 1660 *(uint32_t *)p = v; 1661 } 1662 1663 if (flush && !device->info.has_llc) 1664 intel_flush_range(p, reloc_size); 1665 } 1666 1667 static inline uint64_t 1668 _anv_combine_address(struct anv_batch *batch, void *location, 1669 const struct anv_address address, uint32_t delta) 1670 { 1671 if (address.bo == NULL) { 1672 return address.offset + delta; 1673 } else if (batch == NULL) { 1674 assert(address.bo->flags & EXEC_OBJECT_PINNED); 1675 return anv_address_physical(anv_address_add(address, delta)); 1676 } else { 1677 assert(batch->start <= location && location < batch->end); 1678 /* i915 relocations are signed. */ 1679 assert(INT32_MIN <= address.offset && address.offset <= INT32_MAX); 1680 return anv_batch_emit_reloc(batch, location, address.bo, address.offset + delta); 1681 } 1682 } 1683 1684 #define __gen_address_type struct anv_address 1685 #define __gen_user_data struct anv_batch 1686 #define __gen_combine_address _anv_combine_address 1687 1688 /* Wrapper macros needed to work around preprocessor argument issues. In 1689 * particular, arguments don't get pre-evaluated if they are concatenated. 1690 * This means that, if you pass GENX(3DSTATE_PS) into the emit macro, the 1691 * GENX macro won't get evaluated if the emit macro contains "cmd ## foo". 1692 * We can work around this easily enough with these helpers. 1693 */ 1694 #define __anv_cmd_length(cmd) cmd ## _length 1695 #define __anv_cmd_length_bias(cmd) cmd ## _length_bias 1696 #define __anv_cmd_header(cmd) cmd ## _header 1697 #define __anv_cmd_pack(cmd) cmd ## _pack 1698 #define __anv_reg_num(reg) reg ## _num 1699 1700 #define anv_pack_struct(dst, struc, ...) do { \ 1701 struct struc __template = { \ 1702 __VA_ARGS__ \ 1703 }; \ 1704 __anv_cmd_pack(struc)(NULL, dst, &__template); \ 1705 VG(VALGRIND_CHECK_MEM_IS_DEFINED(dst, __anv_cmd_length(struc) * 4)); \ 1706 } while (0) 1707 1708 #define anv_batch_emitn(batch, n, cmd, ...) ({ \ 1709 void *__dst = anv_batch_emit_dwords(batch, n); \ 1710 if (__dst) { \ 1711 struct cmd __template = { \ 1712 __anv_cmd_header(cmd), \ 1713 .DWordLength = n - __anv_cmd_length_bias(cmd), \ 1714 __VA_ARGS__ \ 1715 }; \ 1716 __anv_cmd_pack(cmd)(batch, __dst, &__template); \ 1717 } \ 1718 __dst; \ 1719 }) 1720 1721 #define anv_batch_emit_merge(batch, dwords0, dwords1) \ 1722 do { \ 1723 uint32_t *dw; \ 1724 \ 1725 STATIC_ASSERT(ARRAY_SIZE(dwords0) == ARRAY_SIZE(dwords1)); \ 1726 dw = anv_batch_emit_dwords((batch), ARRAY_SIZE(dwords0)); \ 1727 if (!dw) \ 1728 break; \ 1729 for (uint32_t i = 0; i < ARRAY_SIZE(dwords0); i++) \ 1730 dw[i] = (dwords0)[i] | (dwords1)[i]; \ 1731 VG(VALGRIND_CHECK_MEM_IS_DEFINED(dw, ARRAY_SIZE(dwords0) * 4));\ 1732 } while (0) 1733 1734 #define anv_batch_emit(batch, cmd, name) \ 1735 for (struct cmd name = { __anv_cmd_header(cmd) }, \ 1736 *_dst = anv_batch_emit_dwords(batch, __anv_cmd_length(cmd)); \ 1737 __builtin_expect(_dst != NULL, 1); \ 1738 ({ __anv_cmd_pack(cmd)(batch, _dst, &name); \ 1739 VG(VALGRIND_CHECK_MEM_IS_DEFINED(_dst, __anv_cmd_length(cmd) * 4)); \ 1740 _dst = NULL; \ 1741 })) 1742 1743 #define anv_batch_write_reg(batch, reg, name) \ 1744 for (struct reg name = {}, *_cont = (struct reg *)1; _cont != NULL; \ 1745 ({ \ 1746 uint32_t _dw[__anv_cmd_length(reg)]; \ 1747 __anv_cmd_pack(reg)(NULL, _dw, &name); \ 1748 for (unsigned i = 0; i < __anv_cmd_length(reg); i++) { \ 1749 anv_batch_emit(batch, GENX(MI_LOAD_REGISTER_IMM), lri) { \ 1750 lri.RegisterOffset = __anv_reg_num(reg); \ 1751 lri.DataDWord = _dw[i]; \ 1752 } \ 1753 } \ 1754 _cont = NULL; \ 1755 })) 1756 1757 /* #define __gen_get_batch_dwords anv_batch_emit_dwords */ 1758 /* #define __gen_get_batch_address anv_batch_address */ 1759 /* #define __gen_address_value anv_address_physical */ 1760 /* #define __gen_address_offset anv_address_add */ 1761 1762 struct anv_device_memory { 1763 struct vk_object_base base; 1764 1765 struct list_head link; 1766 1767 struct anv_bo * bo; 1768 const struct anv_memory_type * type; 1769 VkDeviceSize map_size; 1770 void * map; 1771 1772 /* The map, from the user PoV is map + map_delta */ 1773 uint32_t map_delta; 1774 1775 /* If set, we are holding reference to AHardwareBuffer 1776 * which we must release when memory is freed. 1777 */ 1778 struct AHardwareBuffer * ahw; 1779 1780 /* If set, this memory comes from a host pointer. */ 1781 void * host_ptr; 1782 }; 1783 1784 /** 1785 * Header for Vertex URB Entry (VUE) 1786 */ 1787 struct anv_vue_header { 1788 uint32_t Reserved; 1789 uint32_t RTAIndex; /* RenderTargetArrayIndex */ 1790 uint32_t ViewportIndex; 1791 float PointWidth; 1792 }; 1793 1794 /** Struct representing a sampled image descriptor 1795 * 1796 * This descriptor layout is used for sampled images, bare sampler, and 1797 * combined image/sampler descriptors. 1798 */ 1799 struct anv_sampled_image_descriptor { 1800 /** Bindless image handle 1801 * 1802 * This is expected to already be shifted such that the 20-bit 1803 * SURFACE_STATE table index is in the top 20 bits. 1804 */ 1805 uint32_t image; 1806 1807 /** Bindless sampler handle 1808 * 1809 * This is assumed to be a 32B-aligned SAMPLER_STATE pointer relative 1810 * to the dynamic state base address. 1811 */ 1812 uint32_t sampler; 1813 }; 1814 1815 struct anv_texture_swizzle_descriptor { 1816 /** Texture swizzle 1817 * 1818 * See also nir_intrinsic_channel_select_intel 1819 */ 1820 uint8_t swizzle[4]; 1821 1822 /** Unused padding to ensure the struct is a multiple of 64 bits */ 1823 uint32_t _pad; 1824 }; 1825 1826 /** Struct representing a storage image descriptor */ 1827 struct anv_storage_image_descriptor { 1828 /** Bindless image handles 1829 * 1830 * These are expected to already be shifted such that the 20-bit 1831 * SURFACE_STATE table index is in the top 20 bits. 1832 */ 1833 uint32_t vanilla; 1834 uint32_t lowered; 1835 }; 1836 1837 /** Struct representing a address/range descriptor 1838 * 1839 * The fields of this struct correspond directly to the data layout of 1840 * nir_address_format_64bit_bounded_global addresses. The last field is the 1841 * offset in the NIR address so it must be zero so that when you load the 1842 * descriptor you get a pointer to the start of the range. 1843 */ 1844 struct anv_address_range_descriptor { 1845 uint64_t address; 1846 uint32_t range; 1847 uint32_t zero; 1848 }; 1849 1850 enum anv_descriptor_data { 1851 /** The descriptor contains a BTI reference to a surface state */ 1852 ANV_DESCRIPTOR_SURFACE_STATE = (1 << 0), 1853 /** The descriptor contains a BTI reference to a sampler state */ 1854 ANV_DESCRIPTOR_SAMPLER_STATE = (1 << 1), 1855 /** The descriptor contains an actual buffer view */ 1856 ANV_DESCRIPTOR_BUFFER_VIEW = (1 << 2), 1857 /** The descriptor contains auxiliary image layout data */ 1858 ANV_DESCRIPTOR_IMAGE_PARAM = (1 << 3), 1859 /** The descriptor contains auxiliary image layout data */ 1860 ANV_DESCRIPTOR_INLINE_UNIFORM = (1 << 4), 1861 /** anv_address_range_descriptor with a buffer address and range */ 1862 ANV_DESCRIPTOR_ADDRESS_RANGE = (1 << 5), 1863 /** Bindless surface handle */ 1864 ANV_DESCRIPTOR_SAMPLED_IMAGE = (1 << 6), 1865 /** Storage image handles */ 1866 ANV_DESCRIPTOR_STORAGE_IMAGE = (1 << 7), 1867 /** Storage image handles */ 1868 ANV_DESCRIPTOR_TEXTURE_SWIZZLE = (1 << 8), 1869 }; 1870 1871 struct anv_descriptor_set_binding_layout { 1872 /* The type of the descriptors in this binding */ 1873 VkDescriptorType type; 1874 1875 /* Flags provided when this binding was created */ 1876 VkDescriptorBindingFlagsEXT flags; 1877 1878 /* Bitfield representing the type of data this descriptor contains */ 1879 enum anv_descriptor_data data; 1880 1881 /* Maximum number of YCbCr texture/sampler planes */ 1882 uint8_t max_plane_count; 1883 1884 /* Number of array elements in this binding (or size in bytes for inline 1885 * uniform data) 1886 */ 1887 uint32_t array_size; 1888 1889 /* Index into the flattend descriptor set */ 1890 uint32_t descriptor_index; 1891 1892 /* Index into the dynamic state array for a dynamic buffer */ 1893 int16_t dynamic_offset_index; 1894 1895 /* Index into the descriptor set buffer views */ 1896 int32_t buffer_view_index; 1897 1898 /* Offset into the descriptor buffer where this descriptor lives */ 1899 uint32_t descriptor_offset; 1900 1901 /* Immutable samplers (or NULL if no immutable samplers) */ 1902 struct anv_sampler **immutable_samplers; 1903 }; 1904 1905 unsigned anv_descriptor_size(const struct anv_descriptor_set_binding_layout *layout); 1906 1907 unsigned anv_descriptor_type_size(const struct anv_physical_device *pdevice, 1908 VkDescriptorType type); 1909 1910 bool anv_descriptor_supports_bindless(const struct anv_physical_device *pdevice, 1911 const struct anv_descriptor_set_binding_layout *binding, 1912 bool sampler); 1913 1914 bool anv_descriptor_requires_bindless(const struct anv_physical_device *pdevice, 1915 const struct anv_descriptor_set_binding_layout *binding, 1916 bool sampler); 1917 1918 struct anv_descriptor_set_layout { 1919 struct vk_object_base base; 1920 1921 /* Descriptor set layouts can be destroyed at almost any time */ 1922 uint32_t ref_cnt; 1923 1924 /* Number of bindings in this descriptor set */ 1925 uint32_t binding_count; 1926 1927 /* Total number of descriptors */ 1928 uint32_t descriptor_count; 1929 1930 /* Shader stages affected by this descriptor set */ 1931 uint16_t shader_stages; 1932 1933 /* Number of buffer views in this descriptor set */ 1934 uint32_t buffer_view_count; 1935 1936 /* Number of dynamic offsets used by this descriptor set */ 1937 uint16_t dynamic_offset_count; 1938 1939 /* For each dynamic buffer, which VkShaderStageFlagBits stages are using 1940 * this buffer 1941 */ 1942 VkShaderStageFlags dynamic_offset_stages[MAX_DYNAMIC_BUFFERS]; 1943 1944 /* Size of the descriptor buffer for this descriptor set */ 1945 uint32_t descriptor_buffer_size; 1946 1947 /* Bindings in this descriptor set */ 1948 struct anv_descriptor_set_binding_layout binding[0]; 1949 }; 1950 1951 void anv_descriptor_set_layout_destroy(struct anv_device *device, 1952 struct anv_descriptor_set_layout *layout); 1953 1954 static inline void 1955 anv_descriptor_set_layout_ref(struct anv_descriptor_set_layout *layout) 1956 { 1957 assert(layout && layout->ref_cnt >= 1); 1958 p_atomic_inc(&layout->ref_cnt); 1959 } 1960 1961 static inline void 1962 anv_descriptor_set_layout_unref(struct anv_device *device, 1963 struct anv_descriptor_set_layout *layout) 1964 { 1965 assert(layout && layout->ref_cnt >= 1); 1966 if (p_atomic_dec_zero(&layout->ref_cnt)) 1967 anv_descriptor_set_layout_destroy(device, layout); 1968 } 1969 1970 struct anv_descriptor { 1971 VkDescriptorType type; 1972 1973 union { 1974 struct { 1975 VkImageLayout layout; 1976 struct anv_image_view *image_view; 1977 struct anv_sampler *sampler; 1978 }; 1979 1980 struct { 1981 struct anv_buffer *buffer; 1982 uint64_t offset; 1983 uint64_t range; 1984 }; 1985 1986 struct anv_buffer_view *buffer_view; 1987 }; 1988 }; 1989 1990 struct anv_descriptor_set { 1991 struct vk_object_base base; 1992 1993 struct anv_descriptor_pool *pool; 1994 struct anv_descriptor_set_layout *layout; 1995 1996 /* Amount of space occupied in the the pool by this descriptor set. It can 1997 * be larger than the size of the descriptor set. 1998 */ 1999 uint32_t size; 2000 2001 /* State relative to anv_descriptor_pool::bo */ 2002 struct anv_state desc_mem; 2003 /* Surface state for the descriptor buffer */ 2004 struct anv_state desc_surface_state; 2005 2006 /* Descriptor set address. */ 2007 struct anv_address desc_addr; 2008 2009 uint32_t buffer_view_count; 2010 struct anv_buffer_view *buffer_views; 2011 2012 /* Link to descriptor pool's desc_sets list . */ 2013 struct list_head pool_link; 2014 2015 uint32_t descriptor_count; 2016 struct anv_descriptor descriptors[0]; 2017 }; 2018 2019 static inline bool 2020 anv_descriptor_set_is_push(struct anv_descriptor_set *set) 2021 { 2022 return set->pool == NULL; 2023 } 2024 2025 struct anv_buffer_view { 2026 struct vk_object_base base; 2027 2028 enum isl_format format; /**< VkBufferViewCreateInfo::format */ 2029 uint64_t range; /**< VkBufferViewCreateInfo::range */ 2030 2031 struct anv_address address; 2032 2033 struct anv_state surface_state; 2034 struct anv_state storage_surface_state; 2035 struct anv_state lowered_storage_surface_state; 2036 2037 struct brw_image_param lowered_storage_image_param; 2038 }; 2039 2040 struct anv_push_descriptor_set { 2041 struct anv_descriptor_set set; 2042 2043 /* Put this field right behind anv_descriptor_set so it fills up the 2044 * descriptors[0] field. */ 2045 struct anv_descriptor descriptors[MAX_PUSH_DESCRIPTORS]; 2046 2047 /** True if the descriptor set buffer has been referenced by a draw or 2048 * dispatch command. 2049 */ 2050 bool set_used_on_gpu; 2051 2052 struct anv_buffer_view buffer_views[MAX_PUSH_DESCRIPTORS]; 2053 }; 2054 2055 static inline struct anv_address 2056 anv_descriptor_set_address(struct anv_descriptor_set *set) 2057 { 2058 if (anv_descriptor_set_is_push(set)) { 2059 /* We have to flag push descriptor set as used on the GPU 2060 * so that the next time we push descriptors, we grab a new memory. 2061 */ 2062 struct anv_push_descriptor_set *push_set = 2063 (struct anv_push_descriptor_set *)set; 2064 push_set->set_used_on_gpu = true; 2065 } 2066 2067 return set->desc_addr; 2068 } 2069 2070 struct anv_descriptor_pool { 2071 struct vk_object_base base; 2072 2073 uint32_t size; 2074 uint32_t next; 2075 uint32_t free_list; 2076 2077 struct anv_bo *bo; 2078 struct util_vma_heap bo_heap; 2079 2080 struct anv_state_stream surface_state_stream; 2081 void *surface_state_free_list; 2082 2083 struct list_head desc_sets; 2084 2085 char data[0]; 2086 }; 2087 2088 enum anv_descriptor_template_entry_type { 2089 ANV_DESCRIPTOR_TEMPLATE_ENTRY_TYPE_IMAGE, 2090 ANV_DESCRIPTOR_TEMPLATE_ENTRY_TYPE_BUFFER, 2091 ANV_DESCRIPTOR_TEMPLATE_ENTRY_TYPE_BUFFER_VIEW 2092 }; 2093 2094 struct anv_descriptor_template_entry { 2095 /* The type of descriptor in this entry */ 2096 VkDescriptorType type; 2097 2098 /* Binding in the descriptor set */ 2099 uint32_t binding; 2100 2101 /* Offset at which to write into the descriptor set binding */ 2102 uint32_t array_element; 2103 2104 /* Number of elements to write into the descriptor set binding */ 2105 uint32_t array_count; 2106 2107 /* Offset into the user provided data */ 2108 size_t offset; 2109 2110 /* Stride between elements into the user provided data */ 2111 size_t stride; 2112 }; 2113 2114 struct anv_descriptor_update_template { 2115 struct vk_object_base base; 2116 2117 VkPipelineBindPoint bind_point; 2118 2119 /* The descriptor set this template corresponds to. This value is only 2120 * valid if the template was created with the templateType 2121 * VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET. 2122 */ 2123 uint8_t set; 2124 2125 /* Number of entries in this template */ 2126 uint32_t entry_count; 2127 2128 /* Entries of the template */ 2129 struct anv_descriptor_template_entry entries[0]; 2130 }; 2131 2132 size_t 2133 anv_descriptor_set_layout_size(const struct anv_descriptor_set_layout *layout, 2134 uint32_t var_desc_count); 2135 2136 uint32_t 2137 anv_descriptor_set_layout_descriptor_buffer_size(const struct anv_descriptor_set_layout *set_layout, 2138 uint32_t var_desc_count); 2139 2140 void 2141 anv_descriptor_set_write_image_view(struct anv_device *device, 2142 struct anv_descriptor_set *set, 2143 const VkDescriptorImageInfo * const info, 2144 VkDescriptorType type, 2145 uint32_t binding, 2146 uint32_t element); 2147 2148 void 2149 anv_descriptor_set_write_buffer_view(struct anv_device *device, 2150 struct anv_descriptor_set *set, 2151 VkDescriptorType type, 2152 struct anv_buffer_view *buffer_view, 2153 uint32_t binding, 2154 uint32_t element); 2155 2156 void 2157 anv_descriptor_set_write_buffer(struct anv_device *device, 2158 struct anv_descriptor_set *set, 2159 struct anv_state_stream *alloc_stream, 2160 VkDescriptorType type, 2161 struct anv_buffer *buffer, 2162 uint32_t binding, 2163 uint32_t element, 2164 VkDeviceSize offset, 2165 VkDeviceSize range); 2166 2167 void 2168 anv_descriptor_set_write_acceleration_structure(struct anv_device *device, 2169 struct anv_descriptor_set *set, 2170 struct anv_acceleration_structure *accel, 2171 uint32_t binding, 2172 uint32_t element); 2173 2174 void 2175 anv_descriptor_set_write_inline_uniform_data(struct anv_device *device, 2176 struct anv_descriptor_set *set, 2177 uint32_t binding, 2178 const void *data, 2179 size_t offset, 2180 size_t size); 2181 2182 void 2183 anv_descriptor_set_write_template(struct anv_device *device, 2184 struct anv_descriptor_set *set, 2185 struct anv_state_stream *alloc_stream, 2186 const struct anv_descriptor_update_template *template, 2187 const void *data); 2188 2189 VkResult 2190 anv_descriptor_set_create(struct anv_device *device, 2191 struct anv_descriptor_pool *pool, 2192 struct anv_descriptor_set_layout *layout, 2193 uint32_t var_desc_count, 2194 struct anv_descriptor_set **out_set); 2195 2196 void 2197 anv_descriptor_set_destroy(struct anv_device *device, 2198 struct anv_descriptor_pool *pool, 2199 struct anv_descriptor_set *set); 2200 2201 #define ANV_DESCRIPTOR_SET_NULL (UINT8_MAX - 5) 2202 #define ANV_DESCRIPTOR_SET_PUSH_CONSTANTS (UINT8_MAX - 4) 2203 #define ANV_DESCRIPTOR_SET_DESCRIPTORS (UINT8_MAX - 3) 2204 #define ANV_DESCRIPTOR_SET_NUM_WORK_GROUPS (UINT8_MAX - 2) 2205 #define ANV_DESCRIPTOR_SET_SHADER_CONSTANTS (UINT8_MAX - 1) 2206 #define ANV_DESCRIPTOR_SET_COLOR_ATTACHMENTS UINT8_MAX 2207 2208 struct anv_pipeline_binding { 2209 /** Index in the descriptor set 2210 * 2211 * This is a flattened index; the descriptor set layout is already taken 2212 * into account. 2213 */ 2214 uint32_t index; 2215 2216 /** The descriptor set this surface corresponds to. 2217 * 2218 * The special ANV_DESCRIPTOR_SET_* values above indicates that this 2219 * binding is not a normal descriptor set but something else. 2220 */ 2221 uint8_t set; 2222 2223 union { 2224 /** Plane in the binding index for images */ 2225 uint8_t plane; 2226 2227 /** Input attachment index (relative to the subpass) */ 2228 uint8_t input_attachment_index; 2229 2230 /** Dynamic offset index (for dynamic UBOs and SSBOs) */ 2231 uint8_t dynamic_offset_index; 2232 }; 2233 2234 /** For a storage image, whether it requires a lowered surface */ 2235 uint8_t lowered_storage_surface; 2236 2237 /** Pad to 64 bits so that there are no holes and we can safely memcmp 2238 * assuming POD zero-initialization. 2239 */ 2240 uint8_t pad; 2241 }; 2242 2243 struct anv_push_range { 2244 /** Index in the descriptor set */ 2245 uint32_t index; 2246 2247 /** Descriptor set index */ 2248 uint8_t set; 2249 2250 /** Dynamic offset index (for dynamic UBOs) */ 2251 uint8_t dynamic_offset_index; 2252 2253 /** Start offset in units of 32B */ 2254 uint8_t start; 2255 2256 /** Range in units of 32B */ 2257 uint8_t length; 2258 }; 2259 2260 struct anv_pipeline_layout { 2261 struct vk_object_base base; 2262 2263 struct { 2264 struct anv_descriptor_set_layout *layout; 2265 uint32_t dynamic_offset_start; 2266 } set[MAX_SETS]; 2267 2268 uint32_t num_sets; 2269 2270 unsigned char sha1[20]; 2271 }; 2272 2273 struct anv_buffer { 2274 struct vk_object_base base; 2275 2276 struct anv_device * device; 2277 VkDeviceSize size; 2278 2279 VkBufferCreateFlags create_flags; 2280 VkBufferUsageFlags usage; 2281 2282 /* Set when bound */ 2283 struct anv_address address; 2284 }; 2285 2286 static inline uint64_t 2287 anv_buffer_get_range(struct anv_buffer *buffer, uint64_t offset, uint64_t range) 2288 { 2289 assert(offset <= buffer->size); 2290 if (range == VK_WHOLE_SIZE) { 2291 return buffer->size - offset; 2292 } else { 2293 assert(range + offset >= range); 2294 assert(range + offset <= buffer->size); 2295 return range; 2296 } 2297 } 2298 2299 enum anv_cmd_dirty_bits { 2300 ANV_CMD_DIRTY_DYNAMIC_VIEWPORT = 1 << 0, /* VK_DYNAMIC_STATE_VIEWPORT */ 2301 ANV_CMD_DIRTY_DYNAMIC_SCISSOR = 1 << 1, /* VK_DYNAMIC_STATE_SCISSOR */ 2302 ANV_CMD_DIRTY_DYNAMIC_LINE_WIDTH = 1 << 2, /* VK_DYNAMIC_STATE_LINE_WIDTH */ 2303 ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS = 1 << 3, /* VK_DYNAMIC_STATE_DEPTH_BIAS */ 2304 ANV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS = 1 << 4, /* VK_DYNAMIC_STATE_BLEND_CONSTANTS */ 2305 ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS = 1 << 5, /* VK_DYNAMIC_STATE_DEPTH_BOUNDS */ 2306 ANV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 6, /* VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK */ 2307 ANV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK = 1 << 7, /* VK_DYNAMIC_STATE_STENCIL_WRITE_MASK */ 2308 ANV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE = 1 << 8, /* VK_DYNAMIC_STATE_STENCIL_REFERENCE */ 2309 ANV_CMD_DIRTY_PIPELINE = 1 << 9, 2310 ANV_CMD_DIRTY_INDEX_BUFFER = 1 << 10, 2311 ANV_CMD_DIRTY_RENDER_TARGETS = 1 << 11, 2312 ANV_CMD_DIRTY_XFB_ENABLE = 1 << 12, 2313 ANV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE = 1 << 13, /* VK_DYNAMIC_STATE_LINE_STIPPLE_EXT */ 2314 ANV_CMD_DIRTY_DYNAMIC_CULL_MODE = 1 << 14, /* VK_DYNAMIC_STATE_CULL_MODE_EXT */ 2315 ANV_CMD_DIRTY_DYNAMIC_FRONT_FACE = 1 << 15, /* VK_DYNAMIC_STATE_FRONT_FACE_EXT */ 2316 ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY = 1 << 16, /* VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT */ 2317 ANV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE = 1 << 17, /* VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT */ 2318 ANV_CMD_DIRTY_DYNAMIC_DEPTH_TEST_ENABLE = 1 << 18, /* VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT */ 2319 ANV_CMD_DIRTY_DYNAMIC_DEPTH_WRITE_ENABLE = 1 << 19, /* VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT */ 2320 ANV_CMD_DIRTY_DYNAMIC_DEPTH_COMPARE_OP = 1 << 20, /* VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT */ 2321 ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS_TEST_ENABLE = 1 << 21, /* VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT */ 2322 ANV_CMD_DIRTY_DYNAMIC_STENCIL_TEST_ENABLE = 1 << 22, /* VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT */ 2323 ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP = 1 << 23, /* VK_DYNAMIC_STATE_STENCIL_OP_EXT */ 2324 ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS = 1 << 24, /* VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT */ 2325 ANV_CMD_DIRTY_DYNAMIC_COLOR_BLEND_STATE = 1 << 25, /* VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT */ 2326 ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE = 1 << 26, /* VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR */ 2327 ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE = 1 << 27, /* VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT */ 2328 ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE = 1 << 28, /* VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT */ 2329 ANV_CMD_DIRTY_DYNAMIC_LOGIC_OP = 1 << 29, /* VK_DYNAMIC_STATE_LOGIC_OP_EXT */ 2330 ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE = 1 << 30, /* VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT */ 2331 }; 2332 typedef uint32_t anv_cmd_dirty_mask_t; 2333 2334 #define ANV_CMD_DIRTY_DYNAMIC_ALL \ 2335 (ANV_CMD_DIRTY_DYNAMIC_VIEWPORT | \ 2336 ANV_CMD_DIRTY_DYNAMIC_SCISSOR | \ 2337 ANV_CMD_DIRTY_DYNAMIC_LINE_WIDTH | \ 2338 ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS | \ 2339 ANV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS | \ 2340 ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS | \ 2341 ANV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK | \ 2342 ANV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK | \ 2343 ANV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE | \ 2344 ANV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE | \ 2345 ANV_CMD_DIRTY_DYNAMIC_CULL_MODE | \ 2346 ANV_CMD_DIRTY_DYNAMIC_FRONT_FACE | \ 2347 ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY | \ 2348 ANV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE | \ 2349 ANV_CMD_DIRTY_DYNAMIC_DEPTH_TEST_ENABLE | \ 2350 ANV_CMD_DIRTY_DYNAMIC_DEPTH_WRITE_ENABLE | \ 2351 ANV_CMD_DIRTY_DYNAMIC_DEPTH_COMPARE_OP | \ 2352 ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS_TEST_ENABLE | \ 2353 ANV_CMD_DIRTY_DYNAMIC_STENCIL_TEST_ENABLE | \ 2354 ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP | \ 2355 ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS | \ 2356 ANV_CMD_DIRTY_DYNAMIC_COLOR_BLEND_STATE | \ 2357 ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE | \ 2358 ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE | \ 2359 ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE | \ 2360 ANV_CMD_DIRTY_DYNAMIC_LOGIC_OP | \ 2361 ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE) 2362 2363 static inline enum anv_cmd_dirty_bits 2364 anv_cmd_dirty_bit_for_vk_dynamic_state(VkDynamicState vk_state) 2365 { 2366 switch (vk_state) { 2367 case VK_DYNAMIC_STATE_VIEWPORT: 2368 case VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT: 2369 return ANV_CMD_DIRTY_DYNAMIC_VIEWPORT; 2370 case VK_DYNAMIC_STATE_SCISSOR: 2371 case VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT: 2372 return ANV_CMD_DIRTY_DYNAMIC_SCISSOR; 2373 case VK_DYNAMIC_STATE_LINE_WIDTH: 2374 return ANV_CMD_DIRTY_DYNAMIC_LINE_WIDTH; 2375 case VK_DYNAMIC_STATE_DEPTH_BIAS: 2376 return ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS; 2377 case VK_DYNAMIC_STATE_BLEND_CONSTANTS: 2378 return ANV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS; 2379 case VK_DYNAMIC_STATE_DEPTH_BOUNDS: 2380 return ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS; 2381 case VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK: 2382 return ANV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK; 2383 case VK_DYNAMIC_STATE_STENCIL_WRITE_MASK: 2384 return ANV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK; 2385 case VK_DYNAMIC_STATE_STENCIL_REFERENCE: 2386 return ANV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE; 2387 case VK_DYNAMIC_STATE_LINE_STIPPLE_EXT: 2388 return ANV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE; 2389 case VK_DYNAMIC_STATE_CULL_MODE_EXT: 2390 return ANV_CMD_DIRTY_DYNAMIC_CULL_MODE; 2391 case VK_DYNAMIC_STATE_FRONT_FACE_EXT: 2392 return ANV_CMD_DIRTY_DYNAMIC_FRONT_FACE; 2393 case VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT: 2394 return ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY; 2395 case VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT: 2396 return ANV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE; 2397 case VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT: 2398 return ANV_CMD_DIRTY_DYNAMIC_DEPTH_TEST_ENABLE; 2399 case VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT: 2400 return ANV_CMD_DIRTY_DYNAMIC_DEPTH_WRITE_ENABLE; 2401 case VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT: 2402 return ANV_CMD_DIRTY_DYNAMIC_DEPTH_COMPARE_OP; 2403 case VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT: 2404 return ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS_TEST_ENABLE; 2405 case VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT: 2406 return ANV_CMD_DIRTY_DYNAMIC_STENCIL_TEST_ENABLE; 2407 case VK_DYNAMIC_STATE_STENCIL_OP_EXT: 2408 return ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP; 2409 case VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT: 2410 return ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS; 2411 case VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT: 2412 return ANV_CMD_DIRTY_DYNAMIC_COLOR_BLEND_STATE; 2413 case VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR: 2414 return ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE; 2415 case VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT: 2416 return ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE; 2417 case VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT: 2418 return ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE; 2419 case VK_DYNAMIC_STATE_LOGIC_OP_EXT: 2420 return ANV_CMD_DIRTY_DYNAMIC_LOGIC_OP; 2421 case VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT: 2422 return ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE; 2423 default: 2424 assert(!"Unsupported dynamic state"); 2425 return 0; 2426 } 2427 } 2428 2429 2430 enum anv_pipe_bits { 2431 ANV_PIPE_DEPTH_CACHE_FLUSH_BIT = (1 << 0), 2432 ANV_PIPE_STALL_AT_SCOREBOARD_BIT = (1 << 1), 2433 ANV_PIPE_STATE_CACHE_INVALIDATE_BIT = (1 << 2), 2434 ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT = (1 << 3), 2435 ANV_PIPE_VF_CACHE_INVALIDATE_BIT = (1 << 4), 2436 ANV_PIPE_DATA_CACHE_FLUSH_BIT = (1 << 5), 2437 ANV_PIPE_TILE_CACHE_FLUSH_BIT = (1 << 6), 2438 ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT = (1 << 10), 2439 ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT = (1 << 11), 2440 ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT = (1 << 12), 2441 ANV_PIPE_DEPTH_STALL_BIT = (1 << 13), 2442 2443 /* ANV_PIPE_HDC_PIPELINE_FLUSH_BIT is a precise way to ensure prior data 2444 * cache work has completed. Available on Gfx12+. For earlier Gfx we 2445 * must reinterpret this flush as ANV_PIPE_DATA_CACHE_FLUSH_BIT. 2446 */ 2447 ANV_PIPE_HDC_PIPELINE_FLUSH_BIT = (1 << 14), 2448 ANV_PIPE_CS_STALL_BIT = (1 << 20), 2449 ANV_PIPE_END_OF_PIPE_SYNC_BIT = (1 << 21), 2450 2451 /* This bit does not exist directly in PIPE_CONTROL. Instead it means that 2452 * a flush has happened but not a CS stall. The next time we do any sort 2453 * of invalidation we need to insert a CS stall at that time. Otherwise, 2454 * we would have to CS stall on every flush which could be bad. 2455 */ 2456 ANV_PIPE_NEEDS_END_OF_PIPE_SYNC_BIT = (1 << 22), 2457 2458 /* This bit does not exist directly in PIPE_CONTROL. It means that render 2459 * target operations related to transfer commands with VkBuffer as 2460 * destination are ongoing. Some operations like copies on the command 2461 * streamer might need to be aware of this to trigger the appropriate stall 2462 * before they can proceed with the copy. 2463 */ 2464 ANV_PIPE_RENDER_TARGET_BUFFER_WRITES = (1 << 23), 2465 2466 /* This bit does not exist directly in PIPE_CONTROL. It means that Gfx12 2467 * AUX-TT data has changed and we need to invalidate AUX-TT data. This is 2468 * done by writing the AUX-TT register. 2469 */ 2470 ANV_PIPE_AUX_TABLE_INVALIDATE_BIT = (1 << 24), 2471 2472 /* This bit does not exist directly in PIPE_CONTROL. It means that a 2473 * PIPE_CONTROL with a post-sync operation will follow. This is used to 2474 * implement a workaround for Gfx9. 2475 */ 2476 ANV_PIPE_POST_SYNC_BIT = (1 << 25), 2477 }; 2478 2479 #define ANV_PIPE_FLUSH_BITS ( \ 2480 ANV_PIPE_DEPTH_CACHE_FLUSH_BIT | \ 2481 ANV_PIPE_DATA_CACHE_FLUSH_BIT | \ 2482 ANV_PIPE_HDC_PIPELINE_FLUSH_BIT | \ 2483 ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | \ 2484 ANV_PIPE_TILE_CACHE_FLUSH_BIT) 2485 2486 #define ANV_PIPE_STALL_BITS ( \ 2487 ANV_PIPE_STALL_AT_SCOREBOARD_BIT | \ 2488 ANV_PIPE_DEPTH_STALL_BIT | \ 2489 ANV_PIPE_CS_STALL_BIT) 2490 2491 #define ANV_PIPE_INVALIDATE_BITS ( \ 2492 ANV_PIPE_STATE_CACHE_INVALIDATE_BIT | \ 2493 ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT | \ 2494 ANV_PIPE_VF_CACHE_INVALIDATE_BIT | \ 2495 ANV_PIPE_HDC_PIPELINE_FLUSH_BIT | \ 2496 ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT | \ 2497 ANV_PIPE_INSTRUCTION_CACHE_INVALIDATE_BIT | \ 2498 ANV_PIPE_AUX_TABLE_INVALIDATE_BIT) 2499 2500 static inline enum anv_pipe_bits 2501 anv_pipe_flush_bits_for_access_flags(struct anv_device *device, 2502 VkAccessFlags2KHR flags) 2503 { 2504 enum anv_pipe_bits pipe_bits = 0; 2505 2506 u_foreach_bit64(b, flags) { 2507 switch ((VkAccessFlags2KHR)BITFIELD64_BIT(b)) { 2508 case VK_ACCESS_2_SHADER_WRITE_BIT_KHR: 2509 case VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR: 2510 /* We're transitioning a buffer that was previously used as write 2511 * destination through the data port. To make its content available 2512 * to future operations, flush the hdc pipeline. 2513 */ 2514 pipe_bits |= ANV_PIPE_HDC_PIPELINE_FLUSH_BIT; 2515 break; 2516 case VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR: 2517 /* We're transitioning a buffer that was previously used as render 2518 * target. To make its content available to future operations, flush 2519 * the render target cache. 2520 */ 2521 pipe_bits |= ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; 2522 break; 2523 case VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR: 2524 /* We're transitioning a buffer that was previously used as depth 2525 * buffer. To make its content available to future operations, flush 2526 * the depth cache. 2527 */ 2528 pipe_bits |= ANV_PIPE_DEPTH_CACHE_FLUSH_BIT; 2529 break; 2530 case VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR: 2531 /* We're transitioning a buffer that was previously used as a 2532 * transfer write destination. Generic write operations include color 2533 * & depth operations as well as buffer operations like : 2534 * - vkCmdClearColorImage() 2535 * - vkCmdClearDepthStencilImage() 2536 * - vkCmdBlitImage() 2537 * - vkCmdCopy*(), vkCmdUpdate*(), vkCmdFill*() 2538 * 2539 * Most of these operations are implemented using Blorp which writes 2540 * through the render target, so flush that cache to make it visible 2541 * to future operations. And for depth related operations we also 2542 * need to flush the depth cache. 2543 */ 2544 pipe_bits |= ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; 2545 pipe_bits |= ANV_PIPE_DEPTH_CACHE_FLUSH_BIT; 2546 break; 2547 case VK_ACCESS_2_MEMORY_WRITE_BIT_KHR: 2548 /* We're transitioning a buffer for generic write operations. Flush 2549 * all the caches. 2550 */ 2551 pipe_bits |= ANV_PIPE_FLUSH_BITS; 2552 break; 2553 case VK_ACCESS_2_HOST_WRITE_BIT_KHR: 2554 /* We're transitioning a buffer for access by CPU. Invalidate 2555 * all the caches. Since data and tile caches don't have invalidate, 2556 * we are forced to flush those as well. 2557 */ 2558 pipe_bits |= ANV_PIPE_FLUSH_BITS; 2559 pipe_bits |= ANV_PIPE_INVALIDATE_BITS; 2560 break; 2561 case VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT: 2562 case VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT: 2563 /* We're transitioning a buffer written either from VS stage or from 2564 * the command streamer (see CmdEndTransformFeedbackEXT), we just 2565 * need to stall the CS. 2566 */ 2567 pipe_bits |= ANV_PIPE_CS_STALL_BIT; 2568 break; 2569 default: 2570 break; /* Nothing to do */ 2571 } 2572 } 2573 2574 return pipe_bits; 2575 } 2576 2577 static inline enum anv_pipe_bits 2578 anv_pipe_invalidate_bits_for_access_flags(struct anv_device *device, 2579 VkAccessFlags2KHR flags) 2580 { 2581 enum anv_pipe_bits pipe_bits = 0; 2582 2583 u_foreach_bit64(b, flags) { 2584 switch ((VkAccessFlags2KHR)BITFIELD64_BIT(b)) { 2585 case VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR: 2586 /* Indirect draw commands take a buffer as input that we're going to 2587 * read from the command streamer to load some of the HW registers 2588 * (see genX_cmd_buffer.c:load_indirect_parameters). This requires a 2589 * command streamer stall so that all the cache flushes have 2590 * completed before the command streamer loads from memory. 2591 */ 2592 pipe_bits |= ANV_PIPE_CS_STALL_BIT; 2593 /* Indirect draw commands also set gl_BaseVertex & gl_BaseIndex 2594 * through a vertex buffer, so invalidate that cache. 2595 */ 2596 pipe_bits |= ANV_PIPE_VF_CACHE_INVALIDATE_BIT; 2597 /* For CmdDipatchIndirect, we also load gl_NumWorkGroups through a 2598 * UBO from the buffer, so we need to invalidate constant cache. 2599 */ 2600 pipe_bits |= ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT; 2601 pipe_bits |= ANV_PIPE_DATA_CACHE_FLUSH_BIT; 2602 /* Tile cache flush needed For CmdDipatchIndirect since command 2603 * streamer and vertex fetch aren't L3 coherent. 2604 */ 2605 pipe_bits |= ANV_PIPE_TILE_CACHE_FLUSH_BIT; 2606 break; 2607 case VK_ACCESS_2_INDEX_READ_BIT_KHR: 2608 case VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR: 2609 /* We transitioning a buffer to be used for as input for vkCmdDraw* 2610 * commands, so we invalidate the VF cache to make sure there is no 2611 * stale data when we start rendering. 2612 */ 2613 pipe_bits |= ANV_PIPE_VF_CACHE_INVALIDATE_BIT; 2614 break; 2615 case VK_ACCESS_2_UNIFORM_READ_BIT_KHR: 2616 /* We transitioning a buffer to be used as uniform data. Because 2617 * uniform is accessed through the data port & sampler, we need to 2618 * invalidate the texture cache (sampler) & constant cache (data 2619 * port) to avoid stale data. 2620 */ 2621 pipe_bits |= ANV_PIPE_CONSTANT_CACHE_INVALIDATE_BIT; 2622 if (device->physical->compiler->indirect_ubos_use_sampler) 2623 pipe_bits |= ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT; 2624 else 2625 pipe_bits |= ANV_PIPE_HDC_PIPELINE_FLUSH_BIT; 2626 break; 2627 case VK_ACCESS_2_SHADER_READ_BIT_KHR: 2628 case VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR: 2629 case VK_ACCESS_2_TRANSFER_READ_BIT_KHR: 2630 /* Transitioning a buffer to be read through the sampler, so 2631 * invalidate the texture cache, we don't want any stale data. 2632 */ 2633 pipe_bits |= ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT; 2634 break; 2635 case VK_ACCESS_2_MEMORY_READ_BIT_KHR: 2636 /* Transitioning a buffer for generic read, invalidate all the 2637 * caches. 2638 */ 2639 pipe_bits |= ANV_PIPE_INVALIDATE_BITS; 2640 break; 2641 case VK_ACCESS_2_MEMORY_WRITE_BIT_KHR: 2642 /* Generic write, make sure all previously written things land in 2643 * memory. 2644 */ 2645 pipe_bits |= ANV_PIPE_FLUSH_BITS; 2646 break; 2647 case VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT: 2648 case VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT: 2649 /* Transitioning a buffer for conditional rendering or transform 2650 * feedback. We'll load the content of this buffer into HW registers 2651 * using the command streamer, so we need to stall the command 2652 * streamer , so we need to stall the command streamer to make sure 2653 * any in-flight flush operations have completed. 2654 */ 2655 pipe_bits |= ANV_PIPE_CS_STALL_BIT; 2656 pipe_bits |= ANV_PIPE_TILE_CACHE_FLUSH_BIT; 2657 pipe_bits |= ANV_PIPE_DATA_CACHE_FLUSH_BIT; 2658 break; 2659 case VK_ACCESS_2_HOST_READ_BIT_KHR: 2660 /* We're transitioning a buffer that was written by CPU. Flush 2661 * all the caches. 2662 */ 2663 pipe_bits |= ANV_PIPE_FLUSH_BITS; 2664 break; 2665 default: 2666 break; /* Nothing to do */ 2667 } 2668 } 2669 2670 return pipe_bits; 2671 } 2672 2673 #define VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV ( \ 2674 VK_IMAGE_ASPECT_COLOR_BIT | \ 2675 VK_IMAGE_ASPECT_PLANE_0_BIT | \ 2676 VK_IMAGE_ASPECT_PLANE_1_BIT | \ 2677 VK_IMAGE_ASPECT_PLANE_2_BIT) 2678 #define VK_IMAGE_ASPECT_PLANES_BITS_ANV ( \ 2679 VK_IMAGE_ASPECT_PLANE_0_BIT | \ 2680 VK_IMAGE_ASPECT_PLANE_1_BIT | \ 2681 VK_IMAGE_ASPECT_PLANE_2_BIT) 2682 2683 struct anv_vertex_binding { 2684 struct anv_buffer * buffer; 2685 VkDeviceSize offset; 2686 VkDeviceSize stride; 2687 VkDeviceSize size; 2688 }; 2689 2690 struct anv_xfb_binding { 2691 struct anv_buffer * buffer; 2692 VkDeviceSize offset; 2693 VkDeviceSize size; 2694 }; 2695 2696 struct anv_push_constants { 2697 /** Push constant data provided by the client through vkPushConstants */ 2698 uint8_t client_data[MAX_PUSH_CONSTANTS_SIZE]; 2699 2700 /** Dynamic offsets for dynamic UBOs and SSBOs */ 2701 uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS]; 2702 2703 /* Robust access pushed registers. */ 2704 uint64_t push_reg_mask[MESA_SHADER_STAGES]; 2705 2706 /** Pad out to a multiple of 32 bytes */ 2707 uint32_t pad[2]; 2708 2709 /* Base addresses for descriptor sets */ 2710 uint64_t desc_sets[MAX_SETS]; 2711 2712 struct { 2713 /** Base workgroup ID 2714 * 2715 * Used for vkCmdDispatchBase. 2716 */ 2717 uint32_t base_work_group_id[3]; 2718 2719 /** Subgroup ID 2720 * 2721 * This is never set by software but is implicitly filled out when 2722 * uploading the push constants for compute shaders. 2723 */ 2724 uint32_t subgroup_id; 2725 } cs; 2726 }; 2727 2728 struct anv_dynamic_state { 2729 struct { 2730 uint32_t count; 2731 VkViewport viewports[MAX_VIEWPORTS]; 2732 } viewport; 2733 2734 struct { 2735 uint32_t count; 2736 VkRect2D scissors[MAX_SCISSORS]; 2737 } scissor; 2738 2739 float line_width; 2740 2741 struct { 2742 float bias; 2743 float clamp; 2744 float slope; 2745 } depth_bias; 2746 2747 float blend_constants[4]; 2748 2749 struct { 2750 float min; 2751 float max; 2752 } depth_bounds; 2753 2754 struct { 2755 uint32_t front; 2756 uint32_t back; 2757 } stencil_compare_mask; 2758 2759 struct { 2760 uint32_t front; 2761 uint32_t back; 2762 } stencil_write_mask; 2763 2764 struct { 2765 uint32_t front; 2766 uint32_t back; 2767 } stencil_reference; 2768 2769 struct { 2770 struct { 2771 VkStencilOp fail_op; 2772 VkStencilOp pass_op; 2773 VkStencilOp depth_fail_op; 2774 VkCompareOp compare_op; 2775 } front; 2776 struct { 2777 VkStencilOp fail_op; 2778 VkStencilOp pass_op; 2779 VkStencilOp depth_fail_op; 2780 VkCompareOp compare_op; 2781 } back; 2782 } stencil_op; 2783 2784 struct { 2785 uint32_t factor; 2786 uint16_t pattern; 2787 } line_stipple; 2788 2789 struct { 2790 uint32_t samples; 2791 VkSampleLocationEXT locations[MAX_SAMPLE_LOCATIONS]; 2792 } sample_locations; 2793 2794 VkExtent2D fragment_shading_rate; 2795 2796 VkCullModeFlags cull_mode; 2797 VkFrontFace front_face; 2798 VkPrimitiveTopology primitive_topology; 2799 bool depth_test_enable; 2800 bool depth_write_enable; 2801 VkCompareOp depth_compare_op; 2802 bool depth_bounds_test_enable; 2803 bool stencil_test_enable; 2804 bool raster_discard; 2805 bool depth_bias_enable; 2806 bool primitive_restart_enable; 2807 VkLogicOp logic_op; 2808 bool dyn_vbo_stride; 2809 bool dyn_vbo_size; 2810 2811 /* Bitfield, one bit per render target */ 2812 uint8_t color_writes; 2813 }; 2814 2815 extern const struct anv_dynamic_state default_dynamic_state; 2816 2817 uint32_t anv_dynamic_state_copy(struct anv_dynamic_state *dest, 2818 const struct anv_dynamic_state *src, 2819 uint32_t copy_mask); 2820 2821 struct anv_surface_state { 2822 struct anv_state state; 2823 /** Address of the surface referred to by this state 2824 * 2825 * This address is relative to the start of the BO. 2826 */ 2827 struct anv_address address; 2828 /* Address of the aux surface, if any 2829 * 2830 * This field is ANV_NULL_ADDRESS if and only if no aux surface exists. 2831 * 2832 * With the exception of gfx8, the bottom 12 bits of this address' offset 2833 * include extra aux information. 2834 */ 2835 struct anv_address aux_address; 2836 /* Address of the clear color, if any 2837 * 2838 * This address is relative to the start of the BO. 2839 */ 2840 struct anv_address clear_address; 2841 }; 2842 2843 /** 2844 * Attachment state when recording a renderpass instance. 2845 * 2846 * The clear value is valid only if there exists a pending clear. 2847 */ 2848 struct anv_attachment_state { 2849 enum isl_aux_usage aux_usage; 2850 struct anv_surface_state color; 2851 struct anv_surface_state input; 2852 2853 VkImageLayout current_layout; 2854 VkImageLayout current_stencil_layout; 2855 VkImageAspectFlags pending_clear_aspects; 2856 VkImageAspectFlags pending_load_aspects; 2857 bool fast_clear; 2858 VkClearValue clear_value; 2859 2860 /* When multiview is active, attachments with a renderpass clear 2861 * operation have their respective layers cleared on the first 2862 * subpass that uses them, and only in that subpass. We keep track 2863 * of this using a bitfield to indicate which layers of an attachment 2864 * have not been cleared yet when multiview is active. 2865 */ 2866 uint32_t pending_clear_views; 2867 struct anv_image_view * image_view; 2868 }; 2869 2870 /** State tracking for vertex buffer flushes 2871 * 2872 * On Gfx8-9, the VF cache only considers the bottom 32 bits of memory 2873 * addresses. If you happen to have two vertex buffers which get placed 2874 * exactly 4 GiB apart and use them in back-to-back draw calls, you can get 2875 * collisions. In order to solve this problem, we track vertex address ranges 2876 * which are live in the cache and invalidate the cache if one ever exceeds 32 2877 * bits. 2878 */ 2879 struct anv_vb_cache_range { 2880 /* Virtual address at which the live vertex buffer cache range starts for 2881 * this vertex buffer index. 2882 */ 2883 uint64_t start; 2884 2885 /* Virtual address of the byte after where vertex buffer cache range ends. 2886 * This is exclusive such that end - start is the size of the range. 2887 */ 2888 uint64_t end; 2889 }; 2890 2891 /** State tracking for particular pipeline bind point 2892 * 2893 * This struct is the base struct for anv_cmd_graphics_state and 2894 * anv_cmd_compute_state. These are used to track state which is bound to a 2895 * particular type of pipeline. Generic state that applies per-stage such as 2896 * binding table offsets and push constants is tracked generically with a 2897 * per-stage array in anv_cmd_state. 2898 */ 2899 struct anv_cmd_pipeline_state { 2900 struct anv_descriptor_set *descriptors[MAX_SETS]; 2901 struct anv_push_descriptor_set *push_descriptors[MAX_SETS]; 2902 2903 struct anv_push_constants push_constants; 2904 2905 /* Push constant state allocated when flushing push constants. */ 2906 struct anv_state push_constants_state; 2907 }; 2908 2909 /** State tracking for graphics pipeline 2910 * 2911 * This has anv_cmd_pipeline_state as a base struct to track things which get 2912 * bound to a graphics pipeline. Along with general pipeline bind point state 2913 * which is in the anv_cmd_pipeline_state base struct, it also contains other 2914 * state which is graphics-specific. 2915 */ 2916 struct anv_cmd_graphics_state { 2917 struct anv_cmd_pipeline_state base; 2918 2919 struct anv_graphics_pipeline *pipeline; 2920 2921 anv_cmd_dirty_mask_t dirty; 2922 uint32_t vb_dirty; 2923 2924 struct anv_vb_cache_range ib_bound_range; 2925 struct anv_vb_cache_range ib_dirty_range; 2926 struct anv_vb_cache_range vb_bound_ranges[33]; 2927 struct anv_vb_cache_range vb_dirty_ranges[33]; 2928 2929 VkShaderStageFlags push_constant_stages; 2930 2931 struct anv_dynamic_state dynamic; 2932 2933 uint32_t primitive_topology; 2934 2935 struct { 2936 struct anv_buffer *index_buffer; 2937 uint32_t index_type; /**< 3DSTATE_INDEX_BUFFER.IndexFormat */ 2938 uint32_t index_offset; 2939 } gfx7; 2940 }; 2941 2942 enum anv_depth_reg_mode { 2943 ANV_DEPTH_REG_MODE_UNKNOWN = 0, 2944 ANV_DEPTH_REG_MODE_HW_DEFAULT, 2945 ANV_DEPTH_REG_MODE_D16, 2946 }; 2947 2948 /** State tracking for compute pipeline 2949 * 2950 * This has anv_cmd_pipeline_state as a base struct to track things which get 2951 * bound to a compute pipeline. Along with general pipeline bind point state 2952 * which is in the anv_cmd_pipeline_state base struct, it also contains other 2953 * state which is compute-specific. 2954 */ 2955 struct anv_cmd_compute_state { 2956 struct anv_cmd_pipeline_state base; 2957 2958 struct anv_compute_pipeline *pipeline; 2959 2960 bool pipeline_dirty; 2961 2962 struct anv_state push_data; 2963 2964 struct anv_address num_workgroups; 2965 }; 2966 2967 struct anv_cmd_ray_tracing_state { 2968 struct anv_cmd_pipeline_state base; 2969 2970 struct anv_ray_tracing_pipeline *pipeline; 2971 2972 bool pipeline_dirty; 2973 2974 struct { 2975 struct anv_bo *bo; 2976 struct brw_rt_scratch_layout layout; 2977 } scratch; 2978 }; 2979 2980 /** State required while building cmd buffer */ 2981 struct anv_cmd_state { 2982 /* PIPELINE_SELECT.PipelineSelection */ 2983 uint32_t current_pipeline; 2984 const struct intel_l3_config * current_l3_config; 2985 uint32_t last_aux_map_state; 2986 2987 struct anv_cmd_graphics_state gfx; 2988 struct anv_cmd_compute_state compute; 2989 struct anv_cmd_ray_tracing_state rt; 2990 2991 enum anv_pipe_bits pending_pipe_bits; 2992 VkShaderStageFlags descriptors_dirty; 2993 VkShaderStageFlags push_constants_dirty; 2994 2995 struct anv_framebuffer * framebuffer; 2996 struct anv_render_pass * pass; 2997 struct anv_subpass * subpass; 2998 VkRect2D render_area; 2999 uint32_t restart_index; 3000 struct anv_vertex_binding vertex_bindings[MAX_VBS]; 3001 bool xfb_enabled; 3002 struct anv_xfb_binding xfb_bindings[MAX_XFB_BUFFERS]; 3003 struct anv_state binding_tables[MESA_VULKAN_SHADER_STAGES]; 3004 struct anv_state samplers[MESA_VULKAN_SHADER_STAGES]; 3005 3006 unsigned char sampler_sha1s[MESA_SHADER_STAGES][20]; 3007 unsigned char surface_sha1s[MESA_SHADER_STAGES][20]; 3008 unsigned char push_sha1s[MESA_SHADER_STAGES][20]; 3009 3010 /** 3011 * Whether or not the gfx8 PMA fix is enabled. We ensure that, at the top 3012 * of any command buffer it is disabled by disabling it in EndCommandBuffer 3013 * and before invoking the secondary in ExecuteCommands. 3014 */ 3015 bool pma_fix_enabled; 3016 3017 /** 3018 * Whether or not we know for certain that HiZ is enabled for the current 3019 * subpass. If, for whatever reason, we are unsure as to whether HiZ is 3020 * enabled or not, this will be false. 3021 */ 3022 bool hiz_enabled; 3023 3024 /* We ensure the registers for the gfx12 D16 fix are initalized at the 3025 * first non-NULL depth stencil packet emission of every command buffer. 3026 * For secondary command buffer execution, we transfer the state from the 3027 * last command buffer to the primary (if known). 3028 */ 3029 enum anv_depth_reg_mode depth_reg_mode; 3030 3031 bool conditional_render_enabled; 3032 3033 /** 3034 * Last rendering scale argument provided to 3035 * genX(cmd_buffer_emit_hashing_mode)(). 3036 */ 3037 unsigned current_hash_scale; 3038 3039 /** 3040 * Array length is anv_cmd_state::pass::attachment_count. Array content is 3041 * valid only when recording a render pass instance. 3042 */ 3043 struct anv_attachment_state * attachments; 3044 3045 /** 3046 * Surface states for color render targets. These are stored in a single 3047 * flat array. For depth-stencil attachments, the surface state is simply 3048 * left blank. 3049 */ 3050 struct anv_state attachment_states; 3051 3052 /** 3053 * A null surface state of the right size to match the framebuffer. This 3054 * is one of the states in attachment_states. 3055 */ 3056 struct anv_state null_surface_state; 3057 }; 3058 3059 struct anv_cmd_pool { 3060 struct vk_object_base base; 3061 VkAllocationCallbacks alloc; 3062 struct list_head cmd_buffers; 3063 3064 VkCommandPoolCreateFlags flags; 3065 struct anv_queue_family * queue_family; 3066 }; 3067 3068 #define ANV_MIN_CMD_BUFFER_BATCH_SIZE 8192 3069 #define ANV_MAX_CMD_BUFFER_BATCH_SIZE (16 * 1024 * 1024) 3070 3071 enum anv_cmd_buffer_exec_mode { 3072 ANV_CMD_BUFFER_EXEC_MODE_PRIMARY, 3073 ANV_CMD_BUFFER_EXEC_MODE_EMIT, 3074 ANV_CMD_BUFFER_EXEC_MODE_GROW_AND_EMIT, 3075 ANV_CMD_BUFFER_EXEC_MODE_CHAIN, 3076 ANV_CMD_BUFFER_EXEC_MODE_COPY_AND_CHAIN, 3077 ANV_CMD_BUFFER_EXEC_MODE_CALL_AND_RETURN, 3078 }; 3079 3080 struct anv_measure_batch; 3081 3082 struct anv_cmd_buffer { 3083 struct vk_command_buffer vk; 3084 3085 struct anv_device * device; 3086 3087 struct anv_cmd_pool * pool; 3088 struct list_head pool_link; 3089 3090 struct anv_batch batch; 3091 3092 /* Pointer to the location in the batch where MI_BATCH_BUFFER_END was 3093 * recorded upon calling vkEndCommandBuffer(). This is useful if we need to 3094 * rewrite the end to chain multiple batch together at vkQueueSubmit(). 3095 */ 3096 void * batch_end; 3097 3098 /* Fields required for the actual chain of anv_batch_bo's. 3099 * 3100 * These fields are initialized by anv_cmd_buffer_init_batch_bo_chain(). 3101 */ 3102 struct list_head batch_bos; 3103 enum anv_cmd_buffer_exec_mode exec_mode; 3104 3105 /* A vector of anv_batch_bo pointers for every batch or surface buffer 3106 * referenced by this command buffer 3107 * 3108 * initialized by anv_cmd_buffer_init_batch_bo_chain() 3109 */ 3110 struct u_vector seen_bbos; 3111 3112 /* A vector of int32_t's for every block of binding tables. 3113 * 3114 * initialized by anv_cmd_buffer_init_batch_bo_chain() 3115 */ 3116 struct u_vector bt_block_states; 3117 struct anv_state bt_next; 3118 3119 struct anv_reloc_list surface_relocs; 3120 /** Last seen surface state block pool center bo offset */ 3121 uint32_t last_ss_pool_center; 3122 3123 /* Serial for tracking buffer completion */ 3124 uint32_t serial; 3125 3126 /* Stream objects for storing temporary data */ 3127 struct anv_state_stream surface_state_stream; 3128 struct anv_state_stream dynamic_state_stream; 3129 struct anv_state_stream general_state_stream; 3130 3131 VkCommandBufferUsageFlags usage_flags; 3132 VkCommandBufferLevel level; 3133 3134 struct anv_query_pool *perf_query_pool; 3135 3136 struct anv_cmd_state state; 3137 3138 struct anv_address return_addr; 3139 3140 /* Set by SetPerformanceMarkerINTEL, written into queries by CmdBeginQuery */ 3141 uint64_t intel_perf_marker; 3142 3143 struct anv_measure_batch *measure; 3144 3145 /** 3146 * KHR_performance_query requires self modifying command buffers and this 3147 * array has the location of modifying commands to the query begin and end 3148 * instructions storing performance counters. The array length is 3149 * anv_physical_device::n_perf_query_commands. 3150 */ 3151 struct mi_address_token *self_mod_locations; 3152 3153 /** 3154 * Index tracking which of the self_mod_locations items have already been 3155 * used. 3156 */ 3157 uint32_t perf_reloc_idx; 3158 3159 /** 3160 * Sum of all the anv_batch_bo sizes allocated for this command buffer. 3161 * Used to increase allocation size for long command buffers. 3162 */ 3163 uint32_t total_batch_size; 3164 }; 3165 3166 /* Determine whether we can chain a given cmd_buffer to another one. We need 3167 * softpin and we also need to make sure that we can edit the end of the batch 3168 * to point to next one, which requires the command buffer to not be used 3169 * simultaneously. 3170 */ 3171 static inline bool 3172 anv_cmd_buffer_is_chainable(struct anv_cmd_buffer *cmd_buffer) 3173 { 3174 return anv_use_softpin(cmd_buffer->device->physical) && 3175 !(cmd_buffer->usage_flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT); 3176 } 3177 3178 VkResult anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer); 3179 void anv_cmd_buffer_fini_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer); 3180 void anv_cmd_buffer_reset_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer); 3181 void anv_cmd_buffer_end_batch_buffer(struct anv_cmd_buffer *cmd_buffer); 3182 void anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary, 3183 struct anv_cmd_buffer *secondary); 3184 void anv_cmd_buffer_prepare_execbuf(struct anv_cmd_buffer *cmd_buffer); 3185 VkResult anv_cmd_buffer_execbuf(struct anv_queue *queue, 3186 struct anv_cmd_buffer *cmd_buffer, 3187 const VkSemaphore *in_semaphores, 3188 const uint64_t *in_wait_values, 3189 uint32_t num_in_semaphores, 3190 const VkSemaphore *out_semaphores, 3191 const uint64_t *out_signal_values, 3192 uint32_t num_out_semaphores, 3193 VkFence fence, 3194 int perf_query_pass); 3195 3196 VkResult anv_cmd_buffer_reset(struct anv_cmd_buffer *cmd_buffer); 3197 3198 struct anv_state anv_cmd_buffer_emit_dynamic(struct anv_cmd_buffer *cmd_buffer, 3199 const void *data, uint32_t size, uint32_t alignment); 3200 struct anv_state anv_cmd_buffer_merge_dynamic(struct anv_cmd_buffer *cmd_buffer, 3201 uint32_t *a, uint32_t *b, 3202 uint32_t dwords, uint32_t alignment); 3203 3204 struct anv_address 3205 anv_cmd_buffer_surface_base_address(struct anv_cmd_buffer *cmd_buffer); 3206 struct anv_state 3207 anv_cmd_buffer_alloc_binding_table(struct anv_cmd_buffer *cmd_buffer, 3208 uint32_t entries, uint32_t *state_offset); 3209 struct anv_state 3210 anv_cmd_buffer_alloc_surface_state(struct anv_cmd_buffer *cmd_buffer); 3211 struct anv_state 3212 anv_cmd_buffer_alloc_dynamic_state(struct anv_cmd_buffer *cmd_buffer, 3213 uint32_t size, uint32_t alignment); 3214 3215 VkResult 3216 anv_cmd_buffer_new_binding_table_block(struct anv_cmd_buffer *cmd_buffer); 3217 3218 void gfx8_cmd_buffer_emit_viewport(struct anv_cmd_buffer *cmd_buffer); 3219 void gfx8_cmd_buffer_emit_depth_viewport(struct anv_cmd_buffer *cmd_buffer, 3220 bool depth_clamp_enable); 3221 void gfx7_cmd_buffer_emit_scissor(struct anv_cmd_buffer *cmd_buffer); 3222 3223 void anv_cmd_buffer_setup_attachments(struct anv_cmd_buffer *cmd_buffer, 3224 struct anv_render_pass *pass, 3225 struct anv_framebuffer *framebuffer, 3226 const VkClearValue *clear_values); 3227 3228 void anv_cmd_buffer_emit_state_base_address(struct anv_cmd_buffer *cmd_buffer); 3229 3230 struct anv_state 3231 anv_cmd_buffer_gfx_push_constants(struct anv_cmd_buffer *cmd_buffer); 3232 struct anv_state 3233 anv_cmd_buffer_cs_push_constants(struct anv_cmd_buffer *cmd_buffer); 3234 3235 const struct anv_image_view * 3236 anv_cmd_buffer_get_depth_stencil_view(const struct anv_cmd_buffer *cmd_buffer); 3237 3238 VkResult 3239 anv_cmd_buffer_alloc_blorp_binding_table(struct anv_cmd_buffer *cmd_buffer, 3240 uint32_t num_entries, 3241 uint32_t *state_offset, 3242 struct anv_state *bt_state); 3243 3244 void anv_cmd_buffer_dump(struct anv_cmd_buffer *cmd_buffer); 3245 3246 void anv_cmd_emit_conditional_render_predicate(struct anv_cmd_buffer *cmd_buffer); 3247 3248 enum anv_fence_type { 3249 ANV_FENCE_TYPE_NONE = 0, 3250 ANV_FENCE_TYPE_BO, 3251 ANV_FENCE_TYPE_WSI_BO, 3252 ANV_FENCE_TYPE_SYNCOBJ, 3253 ANV_FENCE_TYPE_WSI, 3254 }; 3255 3256 enum anv_bo_fence_state { 3257 /** Indicates that this is a new (or newly reset fence) */ 3258 ANV_BO_FENCE_STATE_RESET, 3259 3260 /** Indicates that this fence has been submitted to the GPU but is still 3261 * (as far as we know) in use by the GPU. 3262 */ 3263 ANV_BO_FENCE_STATE_SUBMITTED, 3264 3265 ANV_BO_FENCE_STATE_SIGNALED, 3266 }; 3267 3268 struct anv_fence_impl { 3269 enum anv_fence_type type; 3270 3271 union { 3272 /** Fence implementation for BO fences 3273 * 3274 * These fences use a BO and a set of CPU-tracked state flags. The BO 3275 * is added to the object list of the last execbuf call in a QueueSubmit 3276 * and is marked EXEC_WRITE. The state flags track when the BO has been 3277 * submitted to the kernel. We need to do this because Vulkan lets you 3278 * wait on a fence that has not yet been submitted and I915_GEM_BUSY 3279 * will say it's idle in this case. 3280 */ 3281 struct { 3282 struct anv_bo *bo; 3283 enum anv_bo_fence_state state; 3284 } bo; 3285 3286 /** DRM syncobj handle for syncobj-based fences */ 3287 uint32_t syncobj; 3288 3289 /** WSI fence */ 3290 struct wsi_fence *fence_wsi; 3291 }; 3292 }; 3293 3294 struct anv_fence { 3295 struct vk_object_base base; 3296 3297 /* Permanent fence state. Every fence has some form of permanent state 3298 * (type != ANV_SEMAPHORE_TYPE_NONE). This may be a BO to fence on (for 3299 * cross-process fences) or it could just be a dummy for use internally. 3300 */ 3301 struct anv_fence_impl permanent; 3302 3303 /* Temporary fence state. A fence *may* have temporary state. That state 3304 * is added to the fence by an import operation and is reset back to 3305 * ANV_SEMAPHORE_TYPE_NONE when the fence is reset. A fence with temporary 3306 * state cannot be signaled because the fence must already be signaled 3307 * before the temporary state can be exported from the fence in the other 3308 * process and imported here. 3309 */ 3310 struct anv_fence_impl temporary; 3311 }; 3312 3313 void anv_fence_reset_temporary(struct anv_device *device, 3314 struct anv_fence *fence); 3315 3316 struct anv_event { 3317 struct vk_object_base base; 3318 uint64_t semaphore; 3319 struct anv_state state; 3320 }; 3321 3322 enum anv_semaphore_type { 3323 ANV_SEMAPHORE_TYPE_NONE = 0, 3324 ANV_SEMAPHORE_TYPE_DUMMY, 3325 ANV_SEMAPHORE_TYPE_WSI_BO, 3326 ANV_SEMAPHORE_TYPE_DRM_SYNCOBJ, 3327 ANV_SEMAPHORE_TYPE_TIMELINE, 3328 ANV_SEMAPHORE_TYPE_DRM_SYNCOBJ_TIMELINE, 3329 }; 3330 3331 struct anv_timeline_point { 3332 struct list_head link; 3333 3334 uint64_t serial; 3335 3336 /* Number of waiter on this point, when > 0 the point should not be garbage 3337 * collected. 3338 */ 3339 int waiting; 3340 3341 /* BO used for synchronization. */ 3342 struct anv_bo *bo; 3343 }; 3344 3345 struct anv_timeline { 3346 pthread_mutex_t mutex; 3347 pthread_cond_t cond; 3348 3349 uint64_t highest_past; 3350 uint64_t highest_pending; 3351 3352 struct list_head points; 3353 struct list_head free_points; 3354 }; 3355 3356 struct anv_semaphore_impl { 3357 enum anv_semaphore_type type; 3358 3359 union { 3360 /* A BO representing this semaphore when type == ANV_SEMAPHORE_TYPE_BO 3361 * or type == ANV_SEMAPHORE_TYPE_WSI_BO. This BO will be added to the 3362 * object list on any execbuf2 calls for which this semaphore is used as 3363 * a wait or signal fence. When used as a signal fence or when type == 3364 * ANV_SEMAPHORE_TYPE_WSI_BO, the EXEC_OBJECT_WRITE flag will be set. 3365 */ 3366 struct anv_bo *bo; 3367 3368 /* Sync object handle when type == ANV_SEMAPHORE_TYPE_DRM_SYNCOBJ. 3369 * Unlike GEM BOs, DRM sync objects aren't deduplicated by the kernel on 3370 * import so we don't need to bother with a userspace cache. 3371 */ 3372 uint32_t syncobj; 3373 3374 /* Non shareable timeline semaphore 3375 * 3376 * Used when kernel don't have support for timeline semaphores. 3377 */ 3378 struct anv_timeline timeline; 3379 }; 3380 }; 3381 3382 struct anv_semaphore { 3383 struct vk_object_base base; 3384 3385 /* Permanent semaphore state. Every semaphore has some form of permanent 3386 * state (type != ANV_SEMAPHORE_TYPE_NONE). This may be a BO to fence on 3387 * (for cross-process semaphores0 or it could just be a dummy for use 3388 * internally. 3389 */ 3390 struct anv_semaphore_impl permanent; 3391 3392 /* Temporary semaphore state. A semaphore *may* have temporary state. 3393 * That state is added to the semaphore by an import operation and is reset 3394 * back to ANV_SEMAPHORE_TYPE_NONE when the semaphore is waited on. A 3395 * semaphore with temporary state cannot be signaled because the semaphore 3396 * must already be signaled before the temporary state can be exported from 3397 * the semaphore in the other process and imported here. 3398 */ 3399 struct anv_semaphore_impl temporary; 3400 }; 3401 3402 void anv_semaphore_reset_temporary(struct anv_device *device, 3403 struct anv_semaphore *semaphore); 3404 3405 #define ANV_STAGE_MASK ((1 << MESA_VULKAN_SHADER_STAGES) - 1) 3406 3407 #define anv_foreach_stage(stage, stage_bits) \ 3408 for (gl_shader_stage stage, \ 3409 __tmp = (gl_shader_stage)((stage_bits) & ANV_STAGE_MASK); \ 3410 stage = __builtin_ffs(__tmp) - 1, __tmp; \ 3411 __tmp &= ~(1 << (stage))) 3412 3413 struct anv_pipeline_bind_map { 3414 unsigned char surface_sha1[20]; 3415 unsigned char sampler_sha1[20]; 3416 unsigned char push_sha1[20]; 3417 3418 uint32_t surface_count; 3419 uint32_t sampler_count; 3420 3421 struct anv_pipeline_binding * surface_to_descriptor; 3422 struct anv_pipeline_binding * sampler_to_descriptor; 3423 3424 struct anv_push_range push_ranges[4]; 3425 }; 3426 3427 struct anv_shader_bin_key { 3428 uint32_t size; 3429 uint8_t data[0]; 3430 }; 3431 3432 struct anv_shader_bin { 3433 uint32_t ref_cnt; 3434 3435 gl_shader_stage stage; 3436 3437 const struct anv_shader_bin_key *key; 3438 3439 struct anv_state kernel; 3440 uint32_t kernel_size; 3441 3442 const struct brw_stage_prog_data *prog_data; 3443 uint32_t prog_data_size; 3444 3445 struct brw_compile_stats stats[3]; 3446 uint32_t num_stats; 3447 3448 struct nir_xfb_info *xfb_info; 3449 3450 struct anv_pipeline_bind_map bind_map; 3451 }; 3452 3453 struct anv_shader_bin * 3454 anv_shader_bin_create(struct anv_device *device, 3455 gl_shader_stage stage, 3456 const void *key, uint32_t key_size, 3457 const void *kernel, uint32_t kernel_size, 3458 const struct brw_stage_prog_data *prog_data, 3459 uint32_t prog_data_size, 3460 const struct brw_compile_stats *stats, uint32_t num_stats, 3461 const struct nir_xfb_info *xfb_info, 3462 const struct anv_pipeline_bind_map *bind_map); 3463 3464 void 3465 anv_shader_bin_destroy(struct anv_device *device, struct anv_shader_bin *shader); 3466 3467 static inline void 3468 anv_shader_bin_ref(struct anv_shader_bin *shader) 3469 { 3470 assert(shader && shader->ref_cnt >= 1); 3471 p_atomic_inc(&shader->ref_cnt); 3472 } 3473 3474 static inline void 3475 anv_shader_bin_unref(struct anv_device *device, struct anv_shader_bin *shader) 3476 { 3477 assert(shader && shader->ref_cnt >= 1); 3478 if (p_atomic_dec_zero(&shader->ref_cnt)) 3479 anv_shader_bin_destroy(device, shader); 3480 } 3481 3482 #define anv_shader_bin_get_bsr(bin, local_arg_offset) ({ \ 3483 assert((local_arg_offset) % 8 == 0); \ 3484 const struct brw_bs_prog_data *prog_data = \ 3485 brw_bs_prog_data_const(bin->prog_data); \ 3486 assert(prog_data->simd_size == 8 || prog_data->simd_size == 16); \ 3487 \ 3488 (struct GFX_BINDLESS_SHADER_RECORD) { \ 3489 .OffsetToLocalArguments = (local_arg_offset) / 8, \ 3490 .BindlessShaderDispatchMode = \ 3491 prog_data->simd_size == 16 ? RT_SIMD16 : RT_SIMD8, \ 3492 .KernelStartPointer = bin->kernel.offset, \ 3493 }; \ 3494 }) 3495 3496 struct anv_pipeline_executable { 3497 gl_shader_stage stage; 3498 3499 struct brw_compile_stats stats; 3500 3501 char *nir; 3502 char *disasm; 3503 }; 3504 3505 enum anv_pipeline_type { 3506 ANV_PIPELINE_GRAPHICS, 3507 ANV_PIPELINE_COMPUTE, 3508 ANV_PIPELINE_RAY_TRACING, 3509 }; 3510 3511 struct anv_pipeline { 3512 struct vk_object_base base; 3513 3514 struct anv_device * device; 3515 3516 struct anv_batch batch; 3517 struct anv_reloc_list batch_relocs; 3518 3519 void * mem_ctx; 3520 3521 enum anv_pipeline_type type; 3522 VkPipelineCreateFlags flags; 3523 3524 struct util_dynarray executables; 3525 3526 const struct intel_l3_config * l3_config; 3527 }; 3528 3529 struct anv_graphics_pipeline { 3530 struct anv_pipeline base; 3531 3532 uint32_t batch_data[512]; 3533 3534 /* States that are part of batch_data and should be not emitted 3535 * dynamically. 3536 */ 3537 anv_cmd_dirty_mask_t static_state_mask; 3538 3539 /* States that need to be reemitted in cmd_buffer_flush_dynamic_state(). 3540 * This might cover more than the dynamic states specified at pipeline 3541 * creation. 3542 */ 3543 anv_cmd_dirty_mask_t dynamic_state_mask; 3544 3545 struct anv_dynamic_state dynamic_state; 3546 3547 /* States declared dynamic at pipeline creation. */ 3548 anv_cmd_dirty_mask_t dynamic_states; 3549 3550 uint32_t topology; 3551 3552 /* These fields are required with dynamic primitive topology, 3553 * rasterization_samples used only with gen < 8. 3554 */ 3555 VkLineRasterizationModeEXT line_mode; 3556 VkPolygonMode polygon_mode; 3557 uint32_t rasterization_samples; 3558 3559 struct anv_subpass * subpass; 3560 3561 struct anv_shader_bin * shaders[MESA_SHADER_STAGES]; 3562 3563 VkShaderStageFlags active_stages; 3564 3565 bool writes_depth; 3566 bool depth_test_enable; 3567 bool writes_stencil; 3568 bool stencil_test_enable; 3569 bool depth_clamp_enable; 3570 bool depth_clip_enable; 3571 bool sample_shading_enable; 3572 bool kill_pixel; 3573 bool depth_bounds_test_enable; 3574 bool force_fragment_thread_dispatch; 3575 3576 /* When primitive replication is used, subpass->view_mask will describe what 3577 * views to replicate. 3578 */ 3579 bool use_primitive_replication; 3580 3581 struct anv_state blend_state; 3582 3583 struct anv_state cps_state; 3584 3585 uint32_t vb_used; 3586 struct anv_pipeline_vertex_binding { 3587 uint32_t stride; 3588 bool instanced; 3589 uint32_t instance_divisor; 3590 } vb[MAX_VBS]; 3591 3592 struct { 3593 uint32_t sf[7]; 3594 uint32_t depth_stencil_state[3]; 3595 uint32_t clip[4]; 3596 uint32_t xfb_bo_pitch[4]; 3597 uint32_t wm[3]; 3598 uint32_t blend_state[MAX_RTS * 2]; 3599 uint32_t streamout_state[3]; 3600 } gfx7; 3601 3602 struct { 3603 uint32_t sf[4]; 3604 uint32_t raster[5]; 3605 uint32_t wm_depth_stencil[3]; 3606 uint32_t wm[2]; 3607 uint32_t ps_blend[2]; 3608 uint32_t blend_state[1 + MAX_RTS * 2]; 3609 uint32_t streamout_state[5]; 3610 } gfx8; 3611 3612 struct { 3613 uint32_t wm_depth_stencil[4]; 3614 } gfx9; 3615 }; 3616 3617 struct anv_compute_pipeline { 3618 struct anv_pipeline base; 3619 3620 struct anv_shader_bin * cs; 3621 uint32_t batch_data[9]; 3622 uint32_t interface_descriptor_data[8]; 3623 }; 3624 3625 struct anv_rt_shader_group { 3626 VkRayTracingShaderGroupTypeKHR type; 3627 3628 struct anv_shader_bin *general; 3629 struct anv_shader_bin *closest_hit; 3630 struct anv_shader_bin *any_hit; 3631 struct anv_shader_bin *intersection; 3632 3633 /* VK_KHR_ray_tracing requires shaderGroupHandleSize == 32 */ 3634 uint32_t handle[8]; 3635 }; 3636 3637 struct anv_ray_tracing_pipeline { 3638 struct anv_pipeline base; 3639 3640 /* All shaders in the pipeline */ 3641 struct util_dynarray shaders; 3642 3643 uint32_t group_count; 3644 struct anv_rt_shader_group * groups; 3645 3646 /* If non-zero, this is the default computed stack size as per the stack 3647 * size computation in the Vulkan spec. If zero, that indicates that the 3648 * client has requested a dynamic stack size. 3649 */ 3650 uint32_t stack_size; 3651 }; 3652 3653 #define ANV_DECL_PIPELINE_DOWNCAST(pipe_type, pipe_enum) \ 3654 static inline struct anv_##pipe_type##_pipeline * \ 3655 anv_pipeline_to_##pipe_type(struct anv_pipeline *pipeline) \ 3656 { \ 3657 assert(pipeline->type == pipe_enum); \ 3658 return (struct anv_##pipe_type##_pipeline *) pipeline; \ 3659 } 3660 3661 ANV_DECL_PIPELINE_DOWNCAST(graphics, ANV_PIPELINE_GRAPHICS) 3662 ANV_DECL_PIPELINE_DOWNCAST(compute, ANV_PIPELINE_COMPUTE) 3663 ANV_DECL_PIPELINE_DOWNCAST(ray_tracing, ANV_PIPELINE_RAY_TRACING) 3664 3665 static inline bool 3666 anv_pipeline_has_stage(const struct anv_graphics_pipeline *pipeline, 3667 gl_shader_stage stage) 3668 { 3669 return (pipeline->active_stages & mesa_to_vk_shader_stage(stage)) != 0; 3670 } 3671 3672 static inline bool 3673 anv_pipeline_is_primitive(const struct anv_graphics_pipeline *pipeline) 3674 { 3675 return anv_pipeline_has_stage(pipeline, MESA_SHADER_VERTEX); 3676 } 3677 3678 #define ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(prefix, stage) \ 3679 static inline const struct brw_##prefix##_prog_data * \ 3680 get_##prefix##_prog_data(const struct anv_graphics_pipeline *pipeline) \ 3681 { \ 3682 if (anv_pipeline_has_stage(pipeline, stage)) { \ 3683 return (const struct brw_##prefix##_prog_data *) \ 3684 pipeline->shaders[stage]->prog_data; \ 3685 } else { \ 3686 return NULL; \ 3687 } \ 3688 } 3689 3690 ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(vs, MESA_SHADER_VERTEX) 3691 ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(tcs, MESA_SHADER_TESS_CTRL) 3692 ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(tes, MESA_SHADER_TESS_EVAL) 3693 ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(gs, MESA_SHADER_GEOMETRY) 3694 ANV_DECL_GET_GRAPHICS_PROG_DATA_FUNC(wm, MESA_SHADER_FRAGMENT) 3695 3696 static inline const struct brw_cs_prog_data * 3697 get_cs_prog_data(const struct anv_compute_pipeline *pipeline) 3698 { 3699 assert(pipeline->cs); 3700 return (const struct brw_cs_prog_data *) pipeline->cs->prog_data; 3701 } 3702 3703 static inline const struct brw_vue_prog_data * 3704 anv_pipeline_get_last_vue_prog_data(const struct anv_graphics_pipeline *pipeline) 3705 { 3706 if (anv_pipeline_has_stage(pipeline, MESA_SHADER_GEOMETRY)) 3707 return &get_gs_prog_data(pipeline)->base; 3708 else if (anv_pipeline_has_stage(pipeline, MESA_SHADER_TESS_EVAL)) 3709 return &get_tes_prog_data(pipeline)->base; 3710 else 3711 return &get_vs_prog_data(pipeline)->base; 3712 } 3713 3714 VkResult 3715 anv_device_init_rt_shaders(struct anv_device *device); 3716 3717 void 3718 anv_device_finish_rt_shaders(struct anv_device *device); 3719 3720 VkResult 3721 anv_pipeline_init(struct anv_pipeline *pipeline, 3722 struct anv_device *device, 3723 enum anv_pipeline_type type, 3724 VkPipelineCreateFlags flags, 3725 const VkAllocationCallbacks *pAllocator); 3726 3727 void 3728 anv_pipeline_finish(struct anv_pipeline *pipeline, 3729 struct anv_device *device, 3730 const VkAllocationCallbacks *pAllocator); 3731 3732 VkResult 3733 anv_graphics_pipeline_init(struct anv_graphics_pipeline *pipeline, struct anv_device *device, 3734 struct anv_pipeline_cache *cache, 3735 const VkGraphicsPipelineCreateInfo *pCreateInfo, 3736 const VkAllocationCallbacks *alloc); 3737 3738 VkResult 3739 anv_pipeline_compile_cs(struct anv_compute_pipeline *pipeline, 3740 struct anv_pipeline_cache *cache, 3741 const VkComputePipelineCreateInfo *info, 3742 const struct vk_shader_module *module, 3743 const char *entrypoint, 3744 const VkSpecializationInfo *spec_info); 3745 3746 VkResult 3747 anv_ray_tracing_pipeline_init(struct anv_ray_tracing_pipeline *pipeline, 3748 struct anv_device *device, 3749 struct anv_pipeline_cache *cache, 3750 const VkRayTracingPipelineCreateInfoKHR *pCreateInfo, 3751 const VkAllocationCallbacks *alloc); 3752 3753 struct anv_format_plane { 3754 enum isl_format isl_format:16; 3755 struct isl_swizzle swizzle; 3756 3757 /* Whether this plane contains chroma channels */ 3758 bool has_chroma; 3759 3760 /* For downscaling of YUV planes */ 3761 uint8_t denominator_scales[2]; 3762 3763 /* How to map sampled ycbcr planes to a single 4 component element. */ 3764 struct isl_swizzle ycbcr_swizzle; 3765 3766 /* What aspect is associated to this plane */ 3767 VkImageAspectFlags aspect; 3768 }; 3769 3770 3771 struct anv_format { 3772 struct anv_format_plane planes[3]; 3773 VkFormat vk_format; 3774 uint8_t n_planes; 3775 bool can_ycbcr; 3776 }; 3777 3778 static inline void 3779 anv_assert_valid_aspect_set(VkImageAspectFlags aspects) 3780 { 3781 if (util_bitcount(aspects) == 1) { 3782 assert(aspects & (VK_IMAGE_ASPECT_COLOR_BIT | 3783 VK_IMAGE_ASPECT_DEPTH_BIT | 3784 VK_IMAGE_ASPECT_STENCIL_BIT | 3785 VK_IMAGE_ASPECT_PLANE_0_BIT | 3786 VK_IMAGE_ASPECT_PLANE_1_BIT | 3787 VK_IMAGE_ASPECT_PLANE_2_BIT)); 3788 } else if (aspects & VK_IMAGE_ASPECT_PLANES_BITS_ANV) { 3789 assert(aspects == VK_IMAGE_ASPECT_PLANE_0_BIT || 3790 aspects == (VK_IMAGE_ASPECT_PLANE_0_BIT | 3791 VK_IMAGE_ASPECT_PLANE_1_BIT) || 3792 aspects == (VK_IMAGE_ASPECT_PLANE_0_BIT | 3793 VK_IMAGE_ASPECT_PLANE_1_BIT | 3794 VK_IMAGE_ASPECT_PLANE_2_BIT)); 3795 } else { 3796 assert(aspects == (VK_IMAGE_ASPECT_DEPTH_BIT | 3797 VK_IMAGE_ASPECT_STENCIL_BIT)); 3798 } 3799 } 3800 3801 /** 3802 * Return the aspect's plane relative to all_aspects. For an image, for 3803 * instance, all_aspects would be the set of aspects in the image. For 3804 * an image view, all_aspects would be the subset of aspects represented 3805 * by that particular view. 3806 */ 3807 static inline uint32_t 3808 anv_aspect_to_plane(VkImageAspectFlags all_aspects, 3809 VkImageAspectFlagBits aspect) 3810 { 3811 anv_assert_valid_aspect_set(all_aspects); 3812 assert(util_bitcount(aspect) == 1); 3813 assert(!(aspect & ~all_aspects)); 3814 3815 /* Because we always put image and view planes in aspect-bit-order, the 3816 * plane index is the number of bits in all_aspects before aspect. 3817 */ 3818 return util_bitcount(all_aspects & (aspect - 1)); 3819 } 3820 3821 #define anv_foreach_image_aspect_bit(b, image, aspects) \ 3822 u_foreach_bit(b, vk_image_expand_aspect_mask(&(image)->vk, aspects)) 3823 3824 const struct anv_format * 3825 anv_get_format(VkFormat format); 3826 3827 static inline uint32_t 3828 anv_get_format_planes(VkFormat vk_format) 3829 { 3830 const struct anv_format *format = anv_get_format(vk_format); 3831 3832 return format != NULL ? format->n_planes : 0; 3833 } 3834 3835 struct anv_format_plane 3836 anv_get_format_plane(const struct intel_device_info *devinfo, 3837 VkFormat vk_format, uint32_t plane, 3838 VkImageTiling tiling); 3839 3840 struct anv_format_plane 3841 anv_get_format_aspect(const struct intel_device_info *devinfo, 3842 VkFormat vk_format, 3843 VkImageAspectFlagBits aspect, VkImageTiling tiling); 3844 3845 static inline enum isl_format 3846 anv_get_isl_format(const struct intel_device_info *devinfo, VkFormat vk_format, 3847 VkImageAspectFlags aspect, VkImageTiling tiling) 3848 { 3849 return anv_get_format_aspect(devinfo, vk_format, aspect, tiling).isl_format; 3850 } 3851 3852 bool anv_formats_ccs_e_compatible(const struct intel_device_info *devinfo, 3853 VkImageCreateFlags create_flags, 3854 VkFormat vk_format, 3855 VkImageTiling vk_tiling, 3856 const VkImageFormatListCreateInfoKHR *fmt_list); 3857 3858 extern VkFormat 3859 vk_format_from_android(unsigned android_format, unsigned android_usage); 3860 3861 static inline struct isl_swizzle 3862 anv_swizzle_for_render(struct isl_swizzle swizzle) 3863 { 3864 /* Sometimes the swizzle will have alpha map to one. We do this to fake 3865 * RGB as RGBA for texturing 3866 */ 3867 assert(swizzle.a == ISL_CHANNEL_SELECT_ONE || 3868 swizzle.a == ISL_CHANNEL_SELECT_ALPHA); 3869 3870 /* But it doesn't matter what we render to that channel */ 3871 swizzle.a = ISL_CHANNEL_SELECT_ALPHA; 3872 3873 return swizzle; 3874 } 3875 3876 void 3877 anv_pipeline_setup_l3_config(struct anv_pipeline *pipeline, bool needs_slm); 3878 3879 /** 3880 * Describes how each part of anv_image will be bound to memory. 3881 */ 3882 struct anv_image_memory_range { 3883 /** 3884 * Disjoint bindings into which each portion of the image will be bound. 3885 * 3886 * Binding images to memory can be complicated and invold binding different 3887 * portions of the image to different memory objects or regions. For most 3888 * images, everything lives in the MAIN binding and gets bound by 3889 * vkBindImageMemory. For disjoint multi-planar images, each plane has 3890 * a unique, disjoint binding and gets bound by vkBindImageMemory2 with 3891 * VkBindImagePlaneMemoryInfo. There may also exist bits of memory which are 3892 * implicit or driver-managed and live in special-case bindings. 3893 */ 3894 enum anv_image_memory_binding { 3895 /** 3896 * Used if and only if image is not multi-planar disjoint. Bound by 3897 * vkBindImageMemory2 without VkBindImagePlaneMemoryInfo. 3898 */ 3899 ANV_IMAGE_MEMORY_BINDING_MAIN, 3900 3901 /** 3902 * Used if and only if image is multi-planar disjoint. Bound by 3903 * vkBindImageMemory2 with VkBindImagePlaneMemoryInfo. 3904 */ 3905 ANV_IMAGE_MEMORY_BINDING_PLANE_0, 3906 ANV_IMAGE_MEMORY_BINDING_PLANE_1, 3907 ANV_IMAGE_MEMORY_BINDING_PLANE_2, 3908 3909 /** 3910 * Driver-private bo. In special cases we may store the aux surface and/or 3911 * aux state in this binding. 3912 */ 3913 ANV_IMAGE_MEMORY_BINDING_PRIVATE, 3914 3915 /** Sentinel */ 3916 ANV_IMAGE_MEMORY_BINDING_END, 3917 } binding; 3918 3919 /** 3920 * Offset is relative to the start of the binding created by 3921 * vkBindImageMemory, not to the start of the bo. 3922 */ 3923 uint64_t offset; 3924 3925 uint64_t size; 3926 uint32_t alignment; 3927 }; 3928 3929 /** 3930 * Subsurface of an anv_image. 3931 */ 3932 struct anv_surface { 3933 struct isl_surf isl; 3934 struct anv_image_memory_range memory_range; 3935 }; 3936 3937 static inline bool MUST_CHECK 3938 anv_surface_is_valid(const struct anv_surface *surface) 3939 { 3940 return surface->isl.size_B > 0 && surface->memory_range.size > 0; 3941 } 3942 3943 struct anv_image { 3944 struct vk_image vk; 3945 3946 uint32_t n_planes; 3947 3948 /** 3949 * Image has multi-planar format and was created with 3950 * VK_IMAGE_CREATE_DISJOINT_BIT. 3951 */ 3952 bool disjoint; 3953 3954 /** 3955 * Image was imported from an struct AHardwareBuffer. We have to delay 3956 * final image creation until bind time. 3957 */ 3958 bool from_ahb; 3959 3960 /** 3961 * Image was imported from gralloc with VkNativeBufferANDROID. The gralloc bo 3962 * must be released when the image is destroyed. 3963 */ 3964 bool from_gralloc; 3965 3966 /** 3967 * The memory bindings created by vkCreateImage and vkBindImageMemory. 3968 * 3969 * For details on the image's memory layout, see check_memory_bindings(). 3970 * 3971 * vkCreateImage constructs the `memory_range` for each 3972 * anv_image_memory_binding. After vkCreateImage, each binding is valid if 3973 * and only if `memory_range::size > 0`. 3974 * 3975 * vkBindImageMemory binds each valid `memory_range` to an `address`. 3976 * Usually, the app will provide the address via the parameters of 3977 * vkBindImageMemory. However, special-case bindings may be bound to 3978 * driver-private memory. 3979 */ 3980 struct anv_image_binding { 3981 struct anv_image_memory_range memory_range; 3982 struct anv_address address; 3983 } bindings[ANV_IMAGE_MEMORY_BINDING_END]; 3984 3985 /** 3986 * Image subsurfaces 3987 * 3988 * For each foo, anv_image::planes[x].surface is valid if and only if 3989 * anv_image::aspects has a x aspect. Refer to anv_image_aspect_to_plane() 3990 * to figure the number associated with a given aspect. 3991 * 3992 * The hardware requires that the depth buffer and stencil buffer be 3993 * separate surfaces. From Vulkan's perspective, though, depth and stencil 3994 * reside in the same VkImage. To satisfy both the hardware and Vulkan, we 3995 * allocate the depth and stencil buffers as separate surfaces in the same 3996 * bo. 3997 */ 3998 struct anv_image_plane { 3999 struct anv_surface primary_surface; 4000 4001 /** 4002 * A surface which shadows the main surface and may have different 4003 * tiling. This is used for sampling using a tiling that isn't supported 4004 * for other operations. 4005 */ 4006 struct anv_surface shadow_surface; 4007 4008 /** 4009 * The base aux usage for this image. For color images, this can be 4010 * either CCS_E or CCS_D depending on whether or not we can reliably 4011 * leave CCS on all the time. 4012 */ 4013 enum isl_aux_usage aux_usage; 4014 4015 struct anv_surface aux_surface; 4016 4017 /** Location of the fast clear state. */ 4018 struct anv_image_memory_range fast_clear_memory_range; 4019 } planes[3]; 4020 }; 4021 4022 /* The ordering of this enum is important */ 4023 enum anv_fast_clear_type { 4024 /** Image does not have/support any fast-clear blocks */ 4025 ANV_FAST_CLEAR_NONE = 0, 4026 /** Image has/supports fast-clear but only to the default value */ 4027 ANV_FAST_CLEAR_DEFAULT_VALUE = 1, 4028 /** Image has/supports fast-clear with an arbitrary fast-clear value */ 4029 ANV_FAST_CLEAR_ANY = 2, 4030 }; 4031 4032 /** 4033 * Return the aspect's _format_ plane, not its _memory_ plane (using the 4034 * vocabulary of VK_EXT_image_drm_format_modifier). As a consequence, \a 4035 * aspect_mask may contain VK_IMAGE_ASPECT_PLANE_*, but must not contain 4036 * VK_IMAGE_ASPECT_MEMORY_PLANE_* . 4037 */ 4038 static inline uint32_t 4039 anv_image_aspect_to_plane(const struct anv_image *image, 4040 VkImageAspectFlagBits aspect) 4041 { 4042 return anv_aspect_to_plane(image->vk.aspects, aspect); 4043 } 4044 4045 /* Returns the number of auxiliary buffer levels attached to an image. */ 4046 static inline uint8_t 4047 anv_image_aux_levels(const struct anv_image * const image, 4048 VkImageAspectFlagBits aspect) 4049 { 4050 uint32_t plane = anv_image_aspect_to_plane(image, aspect); 4051 if (image->planes[plane].aux_usage == ISL_AUX_USAGE_NONE) 4052 return 0; 4053 4054 return image->vk.mip_levels; 4055 } 4056 4057 /* Returns the number of auxiliary buffer layers attached to an image. */ 4058 static inline uint32_t 4059 anv_image_aux_layers(const struct anv_image * const image, 4060 VkImageAspectFlagBits aspect, 4061 const uint8_t miplevel) 4062 { 4063 assert(image); 4064 4065 /* The miplevel must exist in the main buffer. */ 4066 assert(miplevel < image->vk.mip_levels); 4067 4068 if (miplevel >= anv_image_aux_levels(image, aspect)) { 4069 /* There are no layers with auxiliary data because the miplevel has no 4070 * auxiliary data. 4071 */ 4072 return 0; 4073 } 4074 4075 return MAX2(image->vk.array_layers, image->vk.extent.depth >> miplevel); 4076 } 4077 4078 static inline struct anv_address MUST_CHECK 4079 anv_image_address(const struct anv_image *image, 4080 const struct anv_image_memory_range *mem_range) 4081 { 4082 const struct anv_image_binding *binding = &image->bindings[mem_range->binding]; 4083 assert(binding->memory_range.offset == 0); 4084 4085 if (mem_range->size == 0) 4086 return ANV_NULL_ADDRESS; 4087 4088 return anv_address_add(binding->address, mem_range->offset); 4089 } 4090 4091 static inline struct anv_address 4092 anv_image_get_clear_color_addr(UNUSED const struct anv_device *device, 4093 const struct anv_image *image, 4094 VkImageAspectFlagBits aspect) 4095 { 4096 assert(image->vk.aspects & (VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV | 4097 VK_IMAGE_ASPECT_DEPTH_BIT)); 4098 4099 uint32_t plane = anv_image_aspect_to_plane(image, aspect); 4100 const struct anv_image_memory_range *mem_range = 4101 &image->planes[plane].fast_clear_memory_range; 4102 4103 return anv_image_address(image, mem_range); 4104 } 4105 4106 static inline struct anv_address 4107 anv_image_get_fast_clear_type_addr(const struct anv_device *device, 4108 const struct anv_image *image, 4109 VkImageAspectFlagBits aspect) 4110 { 4111 struct anv_address addr = 4112 anv_image_get_clear_color_addr(device, image, aspect); 4113 4114 const unsigned clear_color_state_size = device->info.ver >= 10 ? 4115 device->isl_dev.ss.clear_color_state_size : 4116 device->isl_dev.ss.clear_value_size; 4117 return anv_address_add(addr, clear_color_state_size); 4118 } 4119 4120 static inline struct anv_address 4121 anv_image_get_compression_state_addr(const struct anv_device *device, 4122 const struct anv_image *image, 4123 VkImageAspectFlagBits aspect, 4124 uint32_t level, uint32_t array_layer) 4125 { 4126 assert(level < anv_image_aux_levels(image, aspect)); 4127 assert(array_layer < anv_image_aux_layers(image, aspect, level)); 4128 UNUSED uint32_t plane = anv_image_aspect_to_plane(image, aspect); 4129 assert(image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_E); 4130 4131 /* Relative to start of the plane's fast clear memory range */ 4132 uint32_t offset; 4133 4134 offset = 4; /* Go past the fast clear type */ 4135 4136 if (image->vk.image_type == VK_IMAGE_TYPE_3D) { 4137 for (uint32_t l = 0; l < level; l++) 4138 offset += anv_minify(image->vk.extent.depth, l) * 4; 4139 } else { 4140 offset += level * image->vk.array_layers * 4; 4141 } 4142 4143 offset += array_layer * 4; 4144 4145 assert(offset < image->planes[plane].fast_clear_memory_range.size); 4146 4147 return anv_address_add( 4148 anv_image_get_fast_clear_type_addr(device, image, aspect), 4149 offset); 4150 } 4151 4152 /* Returns true if a HiZ-enabled depth buffer can be sampled from. */ 4153 static inline bool 4154 anv_can_sample_with_hiz(const struct intel_device_info * const devinfo, 4155 const struct anv_image *image) 4156 { 4157 if (!(image->vk.aspects & VK_IMAGE_ASPECT_DEPTH_BIT)) 4158 return false; 4159 4160 /* For Gfx8-11, there are some restrictions around sampling from HiZ. 4161 * The Skylake PRM docs for RENDER_SURFACE_STATE::AuxiliarySurfaceMode 4162 * say: 4163 * 4164 * "If this field is set to AUX_HIZ, Number of Multisamples must 4165 * be MULTISAMPLECOUNT_1, and Surface Type cannot be SURFTYPE_3D." 4166 */ 4167 if (image->vk.image_type == VK_IMAGE_TYPE_3D) 4168 return false; 4169 4170 /* Allow this feature on BDW even though it is disabled in the BDW devinfo 4171 * struct. There's documentation which suggests that this feature actually 4172 * reduces performance on BDW, but it has only been observed to help so 4173 * far. Sampling fast-cleared blocks on BDW must also be handled with care 4174 * (see depth_stencil_attachment_compute_aux_usage() for more info). 4175 */ 4176 if (devinfo->ver != 8 && !devinfo->has_sample_with_hiz) 4177 return false; 4178 4179 return image->vk.samples == 1; 4180 } 4181 4182 /* Returns true if an MCS-enabled buffer can be sampled from. */ 4183 static inline bool 4184 anv_can_sample_mcs_with_clear(const struct intel_device_info * const devinfo, 4185 const struct anv_image *image) 4186 { 4187 assert(image->vk.aspects == VK_IMAGE_ASPECT_COLOR_BIT); 4188 const uint32_t plane = 4189 anv_image_aspect_to_plane(image, VK_IMAGE_ASPECT_COLOR_BIT); 4190 4191 assert(isl_aux_usage_has_mcs(image->planes[plane].aux_usage)); 4192 4193 const struct anv_surface *anv_surf = &image->planes[plane].primary_surface; 4194 4195 /* On TGL, the sampler has an issue with some 8 and 16bpp MSAA fast clears. 4196 * See HSD 1707282275, wa_14013111325. Due to the use of 4197 * format-reinterpretation, a simplified workaround is implemented. 4198 */ 4199 if (devinfo->ver >= 12 && 4200 isl_format_get_layout(anv_surf->isl.format)->bpb <= 16) { 4201 return false; 4202 } 4203 4204 return true; 4205 } 4206 4207 static inline bool 4208 anv_image_plane_uses_aux_map(const struct anv_device *device, 4209 const struct anv_image *image, 4210 uint32_t plane) 4211 { 4212 return device->info.has_aux_map && 4213 isl_aux_usage_has_ccs(image->planes[plane].aux_usage); 4214 } 4215 4216 void 4217 anv_cmd_buffer_mark_image_written(struct anv_cmd_buffer *cmd_buffer, 4218 const struct anv_image *image, 4219 VkImageAspectFlagBits aspect, 4220 enum isl_aux_usage aux_usage, 4221 uint32_t level, 4222 uint32_t base_layer, 4223 uint32_t layer_count); 4224 4225 void 4226 anv_image_clear_color(struct anv_cmd_buffer *cmd_buffer, 4227 const struct anv_image *image, 4228 VkImageAspectFlagBits aspect, 4229 enum isl_aux_usage aux_usage, 4230 enum isl_format format, struct isl_swizzle swizzle, 4231 uint32_t level, uint32_t base_layer, uint32_t layer_count, 4232 VkRect2D area, union isl_color_value clear_color); 4233 void 4234 anv_image_clear_depth_stencil(struct anv_cmd_buffer *cmd_buffer, 4235 const struct anv_image *image, 4236 VkImageAspectFlags aspects, 4237 enum isl_aux_usage depth_aux_usage, 4238 uint32_t level, 4239 uint32_t base_layer, uint32_t layer_count, 4240 VkRect2D area, 4241 float depth_value, uint8_t stencil_value); 4242 void 4243 anv_image_msaa_resolve(struct anv_cmd_buffer *cmd_buffer, 4244 const struct anv_image *src_image, 4245 enum isl_aux_usage src_aux_usage, 4246 uint32_t src_level, uint32_t src_base_layer, 4247 const struct anv_image *dst_image, 4248 enum isl_aux_usage dst_aux_usage, 4249 uint32_t dst_level, uint32_t dst_base_layer, 4250 VkImageAspectFlagBits aspect, 4251 uint32_t src_x, uint32_t src_y, 4252 uint32_t dst_x, uint32_t dst_y, 4253 uint32_t width, uint32_t height, 4254 uint32_t layer_count, 4255 enum blorp_filter filter); 4256 void 4257 anv_image_hiz_op(struct anv_cmd_buffer *cmd_buffer, 4258 const struct anv_image *image, 4259 VkImageAspectFlagBits aspect, uint32_t level, 4260 uint32_t base_layer, uint32_t layer_count, 4261 enum isl_aux_op hiz_op); 4262 void 4263 anv_image_hiz_clear(struct anv_cmd_buffer *cmd_buffer, 4264 const struct anv_image *image, 4265 VkImageAspectFlags aspects, 4266 uint32_t level, 4267 uint32_t base_layer, uint32_t layer_count, 4268 VkRect2D area, uint8_t stencil_value); 4269 void 4270 anv_image_mcs_op(struct anv_cmd_buffer *cmd_buffer, 4271 const struct anv_image *image, 4272 enum isl_format format, struct isl_swizzle swizzle, 4273 VkImageAspectFlagBits aspect, 4274 uint32_t base_layer, uint32_t layer_count, 4275 enum isl_aux_op mcs_op, union isl_color_value *clear_value, 4276 bool predicate); 4277 void 4278 anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer, 4279 const struct anv_image *image, 4280 enum isl_format format, struct isl_swizzle swizzle, 4281 VkImageAspectFlagBits aspect, uint32_t level, 4282 uint32_t base_layer, uint32_t layer_count, 4283 enum isl_aux_op ccs_op, union isl_color_value *clear_value, 4284 bool predicate); 4285 4286 void 4287 anv_image_copy_to_shadow(struct anv_cmd_buffer *cmd_buffer, 4288 const struct anv_image *image, 4289 VkImageAspectFlagBits aspect, 4290 uint32_t base_level, uint32_t level_count, 4291 uint32_t base_layer, uint32_t layer_count); 4292 4293 enum isl_aux_state ATTRIBUTE_PURE 4294 anv_layout_to_aux_state(const struct intel_device_info * const devinfo, 4295 const struct anv_image *image, 4296 const VkImageAspectFlagBits aspect, 4297 const VkImageLayout layout); 4298 4299 enum isl_aux_usage ATTRIBUTE_PURE 4300 anv_layout_to_aux_usage(const struct intel_device_info * const devinfo, 4301 const struct anv_image *image, 4302 const VkImageAspectFlagBits aspect, 4303 const VkImageUsageFlagBits usage, 4304 const VkImageLayout layout); 4305 4306 enum anv_fast_clear_type ATTRIBUTE_PURE 4307 anv_layout_to_fast_clear_type(const struct intel_device_info * const devinfo, 4308 const struct anv_image * const image, 4309 const VkImageAspectFlagBits aspect, 4310 const VkImageLayout layout); 4311 4312 static inline bool 4313 anv_image_aspects_compatible(VkImageAspectFlags aspects1, 4314 VkImageAspectFlags aspects2) 4315 { 4316 if (aspects1 == aspects2) 4317 return true; 4318 4319 /* Only 1 color aspects are compatibles. */ 4320 if ((aspects1 & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) != 0 && 4321 (aspects2 & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) != 0 && 4322 util_bitcount(aspects1) == util_bitcount(aspects2)) 4323 return true; 4324 4325 return false; 4326 } 4327 4328 struct anv_image_view { 4329 struct vk_image_view vk; 4330 4331 const struct anv_image *image; /**< VkImageViewCreateInfo::image */ 4332 4333 unsigned n_planes; 4334 struct { 4335 uint32_t image_plane; 4336 4337 struct isl_view isl; 4338 4339 /** 4340 * RENDER_SURFACE_STATE when using image as a sampler surface with an 4341 * image layout of SHADER_READ_ONLY_OPTIMAL or 4342 * DEPTH_STENCIL_READ_ONLY_OPTIMAL. 4343 */ 4344 struct anv_surface_state optimal_sampler_surface_state; 4345 4346 /** 4347 * RENDER_SURFACE_STATE when using image as a sampler surface with an 4348 * image layout of GENERAL. 4349 */ 4350 struct anv_surface_state general_sampler_surface_state; 4351 4352 /** 4353 * RENDER_SURFACE_STATE when using image as a storage image. Separate 4354 * states for vanilla (with the original format) and one which has been 4355 * lowered to a format suitable for reading. This may be a raw surface 4356 * in extreme cases or simply a surface with a different format where we 4357 * expect some conversion to be done in the shader. 4358 */ 4359 struct anv_surface_state storage_surface_state; 4360 struct anv_surface_state lowered_storage_surface_state; 4361 4362 struct brw_image_param lowered_storage_image_param; 4363 } planes[3]; 4364 }; 4365 4366 enum anv_image_view_state_flags { 4367 ANV_IMAGE_VIEW_STATE_STORAGE_LOWERED = (1 << 0), 4368 ANV_IMAGE_VIEW_STATE_TEXTURE_OPTIMAL = (1 << 1), 4369 }; 4370 4371 void anv_image_fill_surface_state(struct anv_device *device, 4372 const struct anv_image *image, 4373 VkImageAspectFlagBits aspect, 4374 const struct isl_view *view, 4375 isl_surf_usage_flags_t view_usage, 4376 enum isl_aux_usage aux_usage, 4377 const union isl_color_value *clear_color, 4378 enum anv_image_view_state_flags flags, 4379 struct anv_surface_state *state_inout, 4380 struct brw_image_param *image_param_out); 4381 4382 struct anv_image_create_info { 4383 const VkImageCreateInfo *vk_info; 4384 4385 /** An opt-in bitmask which filters an ISL-mapping of the Vulkan tiling. */ 4386 isl_tiling_flags_t isl_tiling_flags; 4387 4388 /** These flags will be added to any derived from VkImageCreateInfo. */ 4389 isl_surf_usage_flags_t isl_extra_usage_flags; 4390 }; 4391 4392 VkResult anv_image_init(struct anv_device *device, struct anv_image *image, 4393 const struct anv_image_create_info *create_info); 4394 4395 void anv_image_finish(struct anv_image *image); 4396 4397 void anv_image_get_memory_requirements(struct anv_device *device, 4398 struct anv_image *image, 4399 VkImageAspectFlags aspects, 4400 VkMemoryRequirements2 *pMemoryRequirements); 4401 4402 enum isl_format 4403 anv_isl_format_for_descriptor_type(const struct anv_device *device, 4404 VkDescriptorType type); 4405 4406 static inline VkExtent3D 4407 anv_sanitize_image_extent(const VkImageType imageType, 4408 const VkExtent3D imageExtent) 4409 { 4410 switch (imageType) { 4411 case VK_IMAGE_TYPE_1D: 4412 return (VkExtent3D) { imageExtent.width, 1, 1 }; 4413 case VK_IMAGE_TYPE_2D: 4414 return (VkExtent3D) { imageExtent.width, imageExtent.height, 1 }; 4415 case VK_IMAGE_TYPE_3D: 4416 return imageExtent; 4417 default: 4418 unreachable("invalid image type"); 4419 } 4420 } 4421 4422 static inline VkOffset3D 4423 anv_sanitize_image_offset(const VkImageType imageType, 4424 const VkOffset3D imageOffset) 4425 { 4426 switch (imageType) { 4427 case VK_IMAGE_TYPE_1D: 4428 return (VkOffset3D) { imageOffset.x, 0, 0 }; 4429 case VK_IMAGE_TYPE_2D: 4430 return (VkOffset3D) { imageOffset.x, imageOffset.y, 0 }; 4431 case VK_IMAGE_TYPE_3D: 4432 return imageOffset; 4433 default: 4434 unreachable("invalid image type"); 4435 } 4436 } 4437 4438 static inline uint32_t 4439 anv_rasterization_aa_mode(VkPolygonMode raster_mode, 4440 VkLineRasterizationModeEXT line_mode) 4441 { 4442 if (raster_mode == VK_POLYGON_MODE_LINE && 4443 line_mode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT) 4444 return true; 4445 return false; 4446 } 4447 4448 VkFormatFeatureFlags2KHR 4449 anv_get_image_format_features2(const struct intel_device_info *devinfo, 4450 VkFormat vk_format, 4451 const struct anv_format *anv_format, 4452 VkImageTiling vk_tiling, 4453 const struct isl_drm_modifier_info *isl_mod_info); 4454 4455 void anv_fill_buffer_surface_state(struct anv_device *device, 4456 struct anv_state state, 4457 enum isl_format format, 4458 isl_surf_usage_flags_t usage, 4459 struct anv_address address, 4460 uint32_t range, uint32_t stride); 4461 4462 static inline void 4463 anv_clear_color_from_att_state(union isl_color_value *clear_color, 4464 const struct anv_attachment_state *att_state, 4465 const struct anv_image_view *iview) 4466 { 4467 const struct isl_format_layout *view_fmtl = 4468 isl_format_get_layout(iview->planes[0].isl.format); 4469 4470 #define COPY_CLEAR_COLOR_CHANNEL(c, i) \ 4471 if (view_fmtl->channels.c.bits) \ 4472 clear_color->u32[i] = att_state->clear_value.color.uint32[i] 4473 4474 COPY_CLEAR_COLOR_CHANNEL(r, 0); 4475 COPY_CLEAR_COLOR_CHANNEL(g, 1); 4476 COPY_CLEAR_COLOR_CHANNEL(b, 2); 4477 COPY_CLEAR_COLOR_CHANNEL(a, 3); 4478 4479 #undef COPY_CLEAR_COLOR_CHANNEL 4480 } 4481 4482 4483 /* Haswell border color is a bit of a disaster. Float and unorm formats use a 4484 * straightforward 32-bit float color in the first 64 bytes. Instead of using 4485 * a nice float/integer union like Gfx8+, Haswell specifies the integer border 4486 * color as a separate entry /after/ the float color. The layout of this entry 4487 * also depends on the format's bpp (with extra hacks for RG32), and overlaps. 4488 * 4489 * Since we don't know the format/bpp, we can't make any of the border colors 4490 * containing '1' work for all formats, as it would be in the wrong place for 4491 * some of them. We opt to make 32-bit integers work as this seems like the 4492 * most common option. Fortunately, transparent black works regardless, as 4493 * all zeroes is the same in every bit-size. 4494 */ 4495 struct hsw_border_color { 4496 float float32[4]; 4497 uint32_t _pad0[12]; 4498 uint32_t uint32[4]; 4499 uint32_t _pad1[108]; 4500 }; 4501 4502 struct gfx8_border_color { 4503 union { 4504 float float32[4]; 4505 uint32_t uint32[4]; 4506 }; 4507 /* Pad out to 64 bytes */ 4508 uint32_t _pad[12]; 4509 }; 4510 4511 struct anv_ycbcr_conversion { 4512 struct vk_object_base base; 4513 4514 const struct anv_format * format; 4515 VkSamplerYcbcrModelConversion ycbcr_model; 4516 VkSamplerYcbcrRange ycbcr_range; 4517 VkComponentSwizzle mapping[4]; 4518 VkChromaLocation chroma_offsets[2]; 4519 VkFilter chroma_filter; 4520 bool chroma_reconstruction; 4521 }; 4522 4523 struct anv_sampler { 4524 struct vk_object_base base; 4525 4526 uint32_t state[3][4]; 4527 uint32_t n_planes; 4528 struct anv_ycbcr_conversion *conversion; 4529 4530 /* Blob of sampler state data which is guaranteed to be 32-byte aligned 4531 * and with a 32-byte stride for use as bindless samplers. 4532 */ 4533 struct anv_state bindless_state; 4534 4535 struct anv_state custom_border_color; 4536 }; 4537 4538 struct anv_framebuffer { 4539 struct vk_object_base base; 4540 4541 uint32_t width; 4542 uint32_t height; 4543 uint32_t layers; 4544 4545 uint32_t attachment_count; 4546 struct anv_image_view * attachments[0]; 4547 }; 4548 4549 struct anv_subpass_attachment { 4550 VkImageUsageFlagBits usage; 4551 uint32_t attachment; 4552 VkImageLayout layout; 4553 4554 /* Used only with attachment containing stencil data. */ 4555 VkImageLayout stencil_layout; 4556 }; 4557 4558 struct anv_subpass { 4559 uint32_t attachment_count; 4560 4561 /** 4562 * A pointer to all attachment references used in this subpass. 4563 * Only valid if ::attachment_count > 0. 4564 */ 4565 struct anv_subpass_attachment * attachments; 4566 uint32_t input_count; 4567 struct anv_subpass_attachment * input_attachments; 4568 uint32_t color_count; 4569 struct anv_subpass_attachment * color_attachments; 4570 struct anv_subpass_attachment * resolve_attachments; 4571 4572 struct anv_subpass_attachment * depth_stencil_attachment; 4573 struct anv_subpass_attachment * ds_resolve_attachment; 4574 VkResolveModeFlagBitsKHR depth_resolve_mode; 4575 VkResolveModeFlagBitsKHR stencil_resolve_mode; 4576 4577 uint32_t view_mask; 4578 4579 /** Subpass has a depth/stencil self-dependency */ 4580 bool has_ds_self_dep; 4581 4582 /** Subpass has at least one color resolve attachment */ 4583 bool has_color_resolve; 4584 }; 4585 4586 static inline unsigned 4587 anv_subpass_view_count(const struct anv_subpass *subpass) 4588 { 4589 return MAX2(1, util_bitcount(subpass->view_mask)); 4590 } 4591 4592 struct anv_render_pass_attachment { 4593 /* TODO: Consider using VkAttachmentDescription instead of storing each of 4594 * its members individually. 4595 */ 4596 VkFormat format; 4597 uint32_t samples; 4598 VkImageUsageFlags usage; 4599 VkAttachmentLoadOp load_op; 4600 VkAttachmentStoreOp store_op; 4601 VkAttachmentLoadOp stencil_load_op; 4602 VkImageLayout initial_layout; 4603 VkImageLayout final_layout; 4604 VkImageLayout first_subpass_layout; 4605 4606 VkImageLayout stencil_initial_layout; 4607 VkImageLayout stencil_final_layout; 4608 4609 /* The subpass id in which the attachment will be used last. */ 4610 uint32_t last_subpass_idx; 4611 }; 4612 4613 struct anv_render_pass { 4614 struct vk_object_base base; 4615 4616 uint32_t attachment_count; 4617 uint32_t subpass_count; 4618 /* An array of subpass_count+1 flushes, one per subpass boundary */ 4619 enum anv_pipe_bits * subpass_flushes; 4620 struct anv_render_pass_attachment * attachments; 4621 struct anv_subpass subpasses[0]; 4622 }; 4623 4624 #define ANV_PIPELINE_STATISTICS_MASK 0x000007ff 4625 4626 struct anv_query_pool { 4627 struct vk_object_base base; 4628 4629 VkQueryType type; 4630 VkQueryPipelineStatisticFlags pipeline_statistics; 4631 /** Stride between slots, in bytes */ 4632 uint32_t stride; 4633 /** Number of slots in this query pool */ 4634 uint32_t slots; 4635 struct anv_bo * bo; 4636 4637 /* KHR perf queries : */ 4638 uint32_t pass_size; 4639 uint32_t data_offset; 4640 uint32_t snapshot_size; 4641 uint32_t n_counters; 4642 struct intel_perf_counter_pass *counter_pass; 4643 uint32_t n_passes; 4644 struct intel_perf_query_info **pass_query; 4645 }; 4646 4647 static inline uint32_t khr_perf_query_preamble_offset(const struct anv_query_pool *pool, 4648 uint32_t pass) 4649 { 4650 return pool->pass_size * pass + 8; 4651 } 4652 4653 struct anv_acceleration_structure { 4654 struct vk_object_base base; 4655 4656 VkDeviceSize size; 4657 struct anv_address address; 4658 }; 4659 4660 int anv_get_instance_entrypoint_index(const char *name); 4661 int anv_get_device_entrypoint_index(const char *name); 4662 int anv_get_physical_device_entrypoint_index(const char *name); 4663 4664 const char *anv_get_instance_entry_name(int index); 4665 const char *anv_get_physical_device_entry_name(int index); 4666 const char *anv_get_device_entry_name(int index); 4667 4668 bool 4669 anv_instance_entrypoint_is_enabled(int index, uint32_t core_version, 4670 const struct vk_instance_extension_table *instance); 4671 bool 4672 anv_physical_device_entrypoint_is_enabled(int index, uint32_t core_version, 4673 const struct vk_instance_extension_table *instance); 4674 bool 4675 anv_device_entrypoint_is_enabled(int index, uint32_t core_version, 4676 const struct vk_instance_extension_table *instance, 4677 const struct vk_device_extension_table *device); 4678 4679 const struct vk_device_dispatch_table * 4680 anv_get_device_dispatch_table(const struct intel_device_info *devinfo); 4681 4682 void 4683 anv_dump_pipe_bits(enum anv_pipe_bits bits); 4684 4685 static inline void 4686 anv_add_pending_pipe_bits(struct anv_cmd_buffer* cmd_buffer, 4687 enum anv_pipe_bits bits, 4688 const char* reason) 4689 { 4690 cmd_buffer->state.pending_pipe_bits |= bits; 4691 if (INTEL_DEBUG(DEBUG_PIPE_CONTROL) && bits) 4692 { 4693 fputs("pc: add ", stderr); 4694 anv_dump_pipe_bits(bits); 4695 fprintf(stderr, "reason: %s\n", reason); 4696 } 4697 } 4698 4699 static inline uint32_t 4700 anv_get_subpass_id(const struct anv_cmd_state * const cmd_state) 4701 { 4702 /* This function must be called from within a subpass. */ 4703 assert(cmd_state->pass && cmd_state->subpass); 4704 4705 const uint32_t subpass_id = cmd_state->subpass - cmd_state->pass->subpasses; 4706 4707 /* The id of this subpass shouldn't exceed the number of subpasses in this 4708 * render pass minus 1. 4709 */ 4710 assert(subpass_id < cmd_state->pass->subpass_count); 4711 return subpass_id; 4712 } 4713 4714 struct anv_performance_configuration_intel { 4715 struct vk_object_base base; 4716 4717 struct intel_perf_registers *register_config; 4718 4719 uint64_t config_id; 4720 }; 4721 4722 void anv_physical_device_init_perf(struct anv_physical_device *device, int fd); 4723 void anv_device_perf_init(struct anv_device *device); 4724 void anv_perf_write_pass_results(struct intel_perf_config *perf, 4725 struct anv_query_pool *pool, uint32_t pass, 4726 const struct intel_perf_query_result *accumulated_results, 4727 union VkPerformanceCounterResultKHR *results); 4728 4729 #define ANV_FROM_HANDLE(__anv_type, __name, __handle) \ 4730 VK_FROM_HANDLE(__anv_type, __name, __handle) 4731 4732 VK_DEFINE_HANDLE_CASTS(anv_cmd_buffer, vk.base, VkCommandBuffer, 4733 VK_OBJECT_TYPE_COMMAND_BUFFER) 4734 VK_DEFINE_HANDLE_CASTS(anv_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE) 4735 VK_DEFINE_HANDLE_CASTS(anv_instance, vk.base, VkInstance, VK_OBJECT_TYPE_INSTANCE) 4736 VK_DEFINE_HANDLE_CASTS(anv_physical_device, vk.base, VkPhysicalDevice, 4737 VK_OBJECT_TYPE_PHYSICAL_DEVICE) 4738 VK_DEFINE_HANDLE_CASTS(anv_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE) 4739 4740 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_acceleration_structure, base, 4741 VkAccelerationStructureKHR, 4742 VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR) 4743 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_cmd_pool, base, VkCommandPool, 4744 VK_OBJECT_TYPE_COMMAND_POOL) 4745 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer, base, VkBuffer, 4746 VK_OBJECT_TYPE_BUFFER) 4747 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer_view, base, VkBufferView, 4748 VK_OBJECT_TYPE_BUFFER_VIEW) 4749 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_descriptor_pool, base, VkDescriptorPool, 4750 VK_OBJECT_TYPE_DESCRIPTOR_POOL) 4751 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_descriptor_set, base, VkDescriptorSet, 4752 VK_OBJECT_TYPE_DESCRIPTOR_SET) 4753 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_descriptor_set_layout, base, 4754 VkDescriptorSetLayout, 4755 VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT) 4756 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_descriptor_update_template, base, 4757 VkDescriptorUpdateTemplate, 4758 VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE) 4759 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_device_memory, base, VkDeviceMemory, 4760 VK_OBJECT_TYPE_DEVICE_MEMORY) 4761 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_fence, base, VkFence, VK_OBJECT_TYPE_FENCE) 4762 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_event, base, VkEvent, VK_OBJECT_TYPE_EVENT) 4763 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_framebuffer, base, VkFramebuffer, 4764 VK_OBJECT_TYPE_FRAMEBUFFER) 4765 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_image, vk.base, VkImage, VK_OBJECT_TYPE_IMAGE) 4766 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_image_view, vk.base, VkImageView, 4767 VK_OBJECT_TYPE_IMAGE_VIEW); 4768 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline_cache, base, VkPipelineCache, 4769 VK_OBJECT_TYPE_PIPELINE_CACHE) 4770 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline, base, VkPipeline, 4771 VK_OBJECT_TYPE_PIPELINE) 4772 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_pipeline_layout, base, VkPipelineLayout, 4773 VK_OBJECT_TYPE_PIPELINE_LAYOUT) 4774 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_query_pool, base, VkQueryPool, 4775 VK_OBJECT_TYPE_QUERY_POOL) 4776 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_render_pass, base, VkRenderPass, 4777 VK_OBJECT_TYPE_RENDER_PASS) 4778 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_sampler, base, VkSampler, 4779 VK_OBJECT_TYPE_SAMPLER) 4780 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_semaphore, base, VkSemaphore, 4781 VK_OBJECT_TYPE_SEMAPHORE) 4782 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_ycbcr_conversion, base, 4783 VkSamplerYcbcrConversion, 4784 VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION) 4785 VK_DEFINE_NONDISP_HANDLE_CASTS(anv_performance_configuration_intel, base, 4786 VkPerformanceConfigurationINTEL, 4787 VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL) 4788 4789 #define anv_genX(devinfo, thing) ({ \ 4790 __typeof(&gfx9_##thing) genX_thing; \ 4791 switch ((devinfo)->verx10) { \ 4792 case 70: \ 4793 genX_thing = &gfx7_##thing; \ 4794 break; \ 4795 case 75: \ 4796 genX_thing = &gfx75_##thing; \ 4797 break; \ 4798 case 80: \ 4799 genX_thing = &gfx8_##thing; \ 4800 break; \ 4801 case 90: \ 4802 genX_thing = &gfx9_##thing; \ 4803 break; \ 4804 case 110: \ 4805 genX_thing = &gfx11_##thing; \ 4806 break; \ 4807 case 120: \ 4808 genX_thing = &gfx12_##thing; \ 4809 break; \ 4810 case 125: \ 4811 genX_thing = &gfx125_##thing; \ 4812 break; \ 4813 default: \ 4814 unreachable("Unknown hardware generation"); \ 4815 } \ 4816 genX_thing; \ 4817 }) 4818 4819 /* Gen-specific function declarations */ 4820 #ifdef genX 4821 # include "anv_genX.h" 4822 #else 4823 # define genX(x) gfx7_##x 4824 # include "anv_genX.h" 4825 # undef genX 4826 # define genX(x) gfx75_##x 4827 # include "anv_genX.h" 4828 # undef genX 4829 # define genX(x) gfx8_##x 4830 # include "anv_genX.h" 4831 # undef genX 4832 # define genX(x) gfx9_##x 4833 # include "anv_genX.h" 4834 # undef genX 4835 # define genX(x) gfx11_##x 4836 # include "anv_genX.h" 4837 # undef genX 4838 # define genX(x) gfx12_##x 4839 # include "anv_genX.h" 4840 # undef genX 4841 # define genX(x) gfx125_##x 4842 # include "anv_genX.h" 4843 # undef genX 4844 #endif 4845 4846 #endif /* ANV_PRIVATE_H */ 4847