1 /* 2 * Copyright 2019 Raspberry Pi 3 * 4 * based in part on anv driver which is: 5 * Copyright 2015 Intel Corporation 6 * 7 * based in part on radv driver which is: 8 * Copyright 2016 Red Hat. 9 * Copyright 2016 Bas Nieuwenhuizen 10 * 11 * Permission is hereby granted, free of charge, to any person obtaining a 12 * copy of this software and associated documentation files (the "Software"), 13 * to deal in the Software without restriction, including without limitation 14 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 15 * and/or sell copies of the Software, and to permit persons to whom the 16 * Software is furnished to do so, subject to the following conditions: 17 * 18 * The above copyright notice and this permission notice (including the next 19 * paragraph) shall be included in all copies or substantial portions of the 20 * Software. 21 * 22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 25 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 28 * IN THE SOFTWARE. 29 */ 30 #ifndef V3DV_PRIVATE_H 31 #define V3DV_PRIVATE_H 32 33 #include <stdio.h> 34 #include <string.h> 35 #include <vulkan/vulkan.h> 36 #include <vulkan/vk_icd.h> 37 #include <vk_enum_to_str.h> 38 39 #include "vk_device.h" 40 #include "vk_instance.h" 41 #include "vk_image.h" 42 #include "vk_log.h" 43 #include "vk_physical_device.h" 44 #include "vk_shader_module.h" 45 #include "vk_util.h" 46 47 #include "vk_command_buffer.h" 48 #include "vk_queue.h" 49 50 #include <xf86drm.h> 51 52 #ifdef HAVE_VALGRIND 53 #include <valgrind.h> 54 #include <memcheck.h> 55 #define VG(x) x 56 #else 57 #define VG(x) ((void)0) 58 #endif 59 60 #include "v3dv_limits.h" 61 62 #include "common/v3d_device_info.h" 63 #include "common/v3d_limits.h" 64 #include "common/v3d_tiling.h" 65 #include "common/v3d_util.h" 66 67 #include "compiler/shader_enums.h" 68 #include "compiler/spirv/nir_spirv.h" 69 70 #include "compiler/v3d_compiler.h" 71 72 #include "vk_debug_report.h" 73 #include "util/set.h" 74 #include "util/hash_table.h" 75 #include "util/xmlconfig.h" 76 #include "u_atomic.h" 77 78 #include "v3dv_entrypoints.h" 79 #include "v3dv_bo.h" 80 81 #include "drm-uapi/v3d_drm.h" 82 83 #include "vk_alloc.h" 84 #include "simulator/v3d_simulator.h" 85 86 #include "v3dv_cl.h" 87 88 #include "wsi_common.h" 89 90 /* A non-fatal assert. Useful for debugging. */ 91 #ifdef DEBUG 92 #define v3dv_assert(x) ({ \ 93 if (unlikely(!(x))) \ 94 fprintf(stderr, "%s:%d ASSERT: %s", __FILE__, __LINE__, #x); \ 95 }) 96 #else 97 #define v3dv_assert(x) 98 #endif 99 100 #define perf_debug(...) do { \ 101 if (unlikely(V3D_DEBUG & V3D_DEBUG_PERF)) \ 102 fprintf(stderr, __VA_ARGS__); \ 103 } while (0) 104 105 struct v3dv_instance; 106 107 #ifdef USE_V3D_SIMULATOR 108 #define using_v3d_simulator true 109 #else 110 #define using_v3d_simulator false 111 #endif 112 113 struct v3d_simulator_file; 114 115 /* Minimum required by the Vulkan 1.1 spec */ 116 #define MAX_MEMORY_ALLOCATION_SIZE (1ull << 30) 117 118 struct v3dv_physical_device { 119 struct vk_physical_device vk; 120 121 char *name; 122 int32_t render_fd; 123 int32_t display_fd; 124 int32_t master_fd; 125 126 /* We need these because it is not clear how to detect 127 * valid devids in a portable way 128 */ 129 bool has_primary; 130 bool has_render; 131 132 dev_t primary_devid; 133 dev_t render_devid; 134 135 uint8_t driver_build_sha1[20]; 136 uint8_t pipeline_cache_uuid[VK_UUID_SIZE]; 137 uint8_t device_uuid[VK_UUID_SIZE]; 138 uint8_t driver_uuid[VK_UUID_SIZE]; 139 140 struct disk_cache *disk_cache; 141 142 mtx_t mutex; 143 144 struct wsi_device wsi_device; 145 146 VkPhysicalDeviceMemoryProperties memory; 147 148 struct v3d_device_info devinfo; 149 150 struct v3d_simulator_file *sim_file; 151 152 const struct v3d_compiler *compiler; 153 uint32_t next_program_id; 154 155 struct { 156 bool merge_jobs; 157 } options; 158 }; 159 160 VkResult v3dv_physical_device_acquire_display(struct v3dv_instance *instance, 161 struct v3dv_physical_device *pdevice, 162 VkIcdSurfaceBase *surface); 163 164 VkResult v3dv_wsi_init(struct v3dv_physical_device *physical_device); 165 void v3dv_wsi_finish(struct v3dv_physical_device *physical_device); 166 struct v3dv_image *v3dv_wsi_get_image_from_swapchain(VkSwapchainKHR swapchain, 167 uint32_t index); 168 169 void v3dv_meta_clear_init(struct v3dv_device *device); 170 void v3dv_meta_clear_finish(struct v3dv_device *device); 171 172 void v3dv_meta_blit_init(struct v3dv_device *device); 173 void v3dv_meta_blit_finish(struct v3dv_device *device); 174 175 void v3dv_meta_texel_buffer_copy_init(struct v3dv_device *device); 176 void v3dv_meta_texel_buffer_copy_finish(struct v3dv_device *device); 177 178 bool v3dv_meta_can_use_tlb(struct v3dv_image *image, 179 const VkOffset3D *offset, 180 VkFormat *compat_format); 181 182 struct v3dv_instance { 183 struct vk_instance vk; 184 185 int physicalDeviceCount; 186 struct v3dv_physical_device physicalDevice; 187 188 bool pipeline_cache_enabled; 189 bool default_pipeline_cache_enabled; 190 }; 191 192 /* Tracks wait threads spawned from a single vkQueueSubmit call */ 193 struct v3dv_queue_submit_wait_info { 194 /* struct vk_object_base base; ?*/ 195 struct list_head list_link; 196 197 struct v3dv_device *device; 198 199 /* List of wait threads spawned for any command buffers in a particular 200 * call to vkQueueSubmit. 201 */ 202 uint32_t wait_thread_count; 203 struct { 204 pthread_t thread; 205 bool finished; 206 } wait_threads[16]; 207 208 /* The master wait thread for the entire submit. This will wait for all 209 * other threads in this submit to complete before processing signal 210 * semaphores and fences. 211 */ 212 pthread_t master_wait_thread; 213 214 /* List of semaphores (and fence) to signal after all wait threads completed 215 * and all command buffer jobs in the submission have been sent to the GPU. 216 */ 217 uint32_t signal_semaphore_count; 218 VkSemaphore *signal_semaphores; 219 VkFence fence; 220 }; 221 222 struct v3dv_queue { 223 struct vk_queue vk; 224 225 struct v3dv_device *device; 226 227 /* A list of active v3dv_queue_submit_wait_info */ 228 struct list_head submit_wait_list; 229 230 /* A mutex to prevent concurrent access to the list of wait threads */ 231 mtx_t mutex; 232 233 struct v3dv_job *noop_job; 234 }; 235 236 #define V3DV_META_BLIT_CACHE_KEY_SIZE (4 * sizeof(uint32_t)) 237 #define V3DV_META_TEXEL_BUFFER_COPY_CACHE_KEY_SIZE (3 * sizeof(uint32_t) + \ 238 sizeof(VkComponentMapping)) 239 240 struct v3dv_meta_color_clear_pipeline { 241 VkPipeline pipeline; 242 VkRenderPass pass; 243 bool cached; 244 uint64_t key; 245 }; 246 247 struct v3dv_meta_depth_clear_pipeline { 248 VkPipeline pipeline; 249 uint64_t key; 250 }; 251 252 struct v3dv_meta_blit_pipeline { 253 VkPipeline pipeline; 254 VkRenderPass pass; 255 VkRenderPass pass_no_load; 256 uint8_t key[V3DV_META_BLIT_CACHE_KEY_SIZE]; 257 }; 258 259 struct v3dv_meta_texel_buffer_copy_pipeline { 260 VkPipeline pipeline; 261 VkRenderPass pass; 262 VkRenderPass pass_no_load; 263 uint8_t key[V3DV_META_TEXEL_BUFFER_COPY_CACHE_KEY_SIZE]; 264 }; 265 266 struct v3dv_pipeline_key { 267 bool robust_buffer_access; 268 uint8_t topology; 269 uint8_t logicop_func; 270 bool msaa; 271 bool sample_coverage; 272 bool sample_alpha_to_coverage; 273 bool sample_alpha_to_one; 274 uint8_t cbufs; 275 struct { 276 enum pipe_format format; 277 const uint8_t *swizzle; 278 } color_fmt[V3D_MAX_DRAW_BUFFERS]; 279 uint8_t f32_color_rb; 280 uint32_t va_swap_rb_mask; 281 bool has_multiview; 282 }; 283 284 struct v3dv_pipeline_cache_stats { 285 uint32_t miss; 286 uint32_t hit; 287 uint32_t count; 288 }; 289 290 /* Equivalent to gl_shader_stage, but including the coordinate shaders 291 * 292 * FIXME: perhaps move to common 293 */ 294 enum broadcom_shader_stage { 295 BROADCOM_SHADER_VERTEX, 296 BROADCOM_SHADER_VERTEX_BIN, 297 BROADCOM_SHADER_GEOMETRY, 298 BROADCOM_SHADER_GEOMETRY_BIN, 299 BROADCOM_SHADER_FRAGMENT, 300 BROADCOM_SHADER_COMPUTE, 301 }; 302 303 #define BROADCOM_SHADER_STAGES (BROADCOM_SHADER_COMPUTE + 1) 304 305 /* Assumes that coordinate shaders will be custom-handled by the caller */ 306 static inline enum broadcom_shader_stage 307 gl_shader_stage_to_broadcom(gl_shader_stage stage) 308 { 309 switch (stage) { 310 case MESA_SHADER_VERTEX: 311 return BROADCOM_SHADER_VERTEX; 312 case MESA_SHADER_GEOMETRY: 313 return BROADCOM_SHADER_GEOMETRY; 314 case MESA_SHADER_FRAGMENT: 315 return BROADCOM_SHADER_FRAGMENT; 316 case MESA_SHADER_COMPUTE: 317 return BROADCOM_SHADER_COMPUTE; 318 default: 319 unreachable("Unknown gl shader stage"); 320 } 321 } 322 323 static inline gl_shader_stage 324 broadcom_shader_stage_to_gl(enum broadcom_shader_stage stage) 325 { 326 switch (stage) { 327 case BROADCOM_SHADER_VERTEX: 328 case BROADCOM_SHADER_VERTEX_BIN: 329 return MESA_SHADER_VERTEX; 330 case BROADCOM_SHADER_GEOMETRY: 331 case BROADCOM_SHADER_GEOMETRY_BIN: 332 return MESA_SHADER_GEOMETRY; 333 case BROADCOM_SHADER_FRAGMENT: 334 return MESA_SHADER_FRAGMENT; 335 case BROADCOM_SHADER_COMPUTE: 336 return MESA_SHADER_COMPUTE; 337 default: 338 unreachable("Unknown broadcom shader stage"); 339 } 340 } 341 342 static inline bool 343 broadcom_shader_stage_is_binning(enum broadcom_shader_stage stage) 344 { 345 switch (stage) { 346 case BROADCOM_SHADER_VERTEX_BIN: 347 case BROADCOM_SHADER_GEOMETRY_BIN: 348 return true; 349 default: 350 return false; 351 } 352 } 353 354 static inline bool 355 broadcom_shader_stage_is_render_with_binning(enum broadcom_shader_stage stage) 356 { 357 switch (stage) { 358 case BROADCOM_SHADER_VERTEX: 359 case BROADCOM_SHADER_GEOMETRY: 360 return true; 361 default: 362 return false; 363 } 364 } 365 366 static inline enum broadcom_shader_stage 367 broadcom_binning_shader_stage_for_render_stage(enum broadcom_shader_stage stage) 368 { 369 switch (stage) { 370 case BROADCOM_SHADER_VERTEX: 371 return BROADCOM_SHADER_VERTEX_BIN; 372 case BROADCOM_SHADER_GEOMETRY: 373 return BROADCOM_SHADER_GEOMETRY_BIN; 374 default: 375 unreachable("Invalid shader stage"); 376 } 377 } 378 379 static inline const char * 380 broadcom_shader_stage_name(enum broadcom_shader_stage stage) 381 { 382 switch(stage) { 383 case BROADCOM_SHADER_VERTEX_BIN: 384 return "MESA_SHADER_VERTEX_BIN"; 385 case BROADCOM_SHADER_GEOMETRY_BIN: 386 return "MESA_SHADER_GEOMETRY_BIN"; 387 default: 388 return gl_shader_stage_name(broadcom_shader_stage_to_gl(stage)); 389 } 390 } 391 392 struct v3dv_pipeline_cache { 393 struct vk_object_base base; 394 395 struct v3dv_device *device; 396 mtx_t mutex; 397 398 struct hash_table *nir_cache; 399 struct v3dv_pipeline_cache_stats nir_stats; 400 401 struct hash_table *cache; 402 struct v3dv_pipeline_cache_stats stats; 403 404 /* For VK_EXT_pipeline_creation_cache_control. */ 405 bool externally_synchronized; 406 }; 407 408 struct v3dv_device { 409 struct vk_device vk; 410 411 struct v3dv_instance *instance; 412 struct v3dv_physical_device *pdevice; 413 414 struct v3d_device_info devinfo; 415 struct v3dv_queue queue; 416 417 /* A sync object to track the last job submitted to the GPU. */ 418 uint32_t last_job_sync; 419 420 /* A mutex to prevent concurrent access to last_job_sync from the queue */ 421 mtx_t mutex; 422 423 /* Resources used for meta operations */ 424 struct { 425 mtx_t mtx; 426 struct { 427 VkPipelineLayout p_layout; 428 struct hash_table *cache; /* v3dv_meta_color_clear_pipeline */ 429 } color_clear; 430 struct { 431 VkPipelineLayout p_layout; 432 struct hash_table *cache; /* v3dv_meta_depth_clear_pipeline */ 433 } depth_clear; 434 struct { 435 VkDescriptorSetLayout ds_layout; 436 VkPipelineLayout p_layout; 437 struct hash_table *cache[3]; /* v3dv_meta_blit_pipeline for 1d, 2d, 3d */ 438 } blit; 439 struct { 440 VkDescriptorSetLayout ds_layout; 441 VkPipelineLayout p_layout; 442 struct hash_table *cache[3]; /* v3dv_meta_texel_buffer_copy_pipeline for 1d, 2d, 3d */ 443 } texel_buffer_copy; 444 } meta; 445 446 struct v3dv_bo_cache { 447 /** List of struct v3d_bo freed, by age. */ 448 struct list_head time_list; 449 /** List of struct v3d_bo freed, per size, by age. */ 450 struct list_head *size_list; 451 uint32_t size_list_size; 452 453 mtx_t lock; 454 455 uint32_t cache_size; 456 uint32_t cache_count; 457 uint32_t max_cache_size; 458 } bo_cache; 459 460 uint32_t bo_size; 461 uint32_t bo_count; 462 463 struct v3dv_pipeline_cache default_pipeline_cache; 464 465 /* GL_SHADER_STATE_RECORD needs to speficy default attribute values. The 466 * following covers the most common case, that is all attributes format 467 * being float being float, allowing us to reuse the same BO for all 468 * pipelines matching this requirement. Pipelines that need integer 469 * attributes will create their own BO. 470 */ 471 struct v3dv_bo *default_attribute_float; 472 VkPhysicalDeviceFeatures features; 473 }; 474 475 struct v3dv_device_memory { 476 struct vk_object_base base; 477 478 struct v3dv_bo *bo; 479 const VkMemoryType *type; 480 bool has_bo_ownership; 481 bool is_for_wsi; 482 }; 483 484 #define V3D_OUTPUT_IMAGE_FORMAT_NO 255 485 #define TEXTURE_DATA_FORMAT_NO 255 486 487 struct v3dv_format { 488 bool supported; 489 490 /* One of V3D33_OUTPUT_IMAGE_FORMAT_*, or OUTPUT_IMAGE_FORMAT_NO */ 491 uint8_t rt_type; 492 493 /* One of V3D33_TEXTURE_DATA_FORMAT_*. */ 494 uint8_t tex_type; 495 496 /* Swizzle to apply to the RGBA shader output for storing to the tile 497 * buffer, to the RGBA tile buffer to produce shader input (for 498 * blending), and for turning the rgba8888 texture sampler return 499 * value into shader rgba values. 500 */ 501 uint8_t swizzle[4]; 502 503 /* Whether the return value is 16F/I/UI or 32F/I/UI. */ 504 uint8_t return_size; 505 506 /* If the format supports (linear) filtering when texturing. */ 507 bool supports_filtering; 508 }; 509 510 struct v3d_resource_slice { 511 uint32_t offset; 512 uint32_t stride; 513 uint32_t padded_height; 514 /* Size of a single pane of the slice. For 3D textures, there will be 515 * a number of panes equal to the minified, power-of-two-aligned 516 * depth. 517 */ 518 uint32_t size; 519 uint8_t ub_pad; 520 enum v3d_tiling_mode tiling; 521 uint32_t padded_height_of_output_image_in_uif_blocks; 522 }; 523 524 struct v3dv_image { 525 struct vk_image vk; 526 527 const struct v3dv_format *format; 528 uint32_t cpp; 529 bool tiled; 530 531 struct v3d_resource_slice slices[V3D_MAX_MIP_LEVELS]; 532 uint64_t size; /* Total size in bytes */ 533 uint32_t cube_map_stride; 534 535 struct v3dv_device_memory *mem; 536 VkDeviceSize mem_offset; 537 uint32_t alignment; 538 }; 539 540 VkImageViewType v3dv_image_type_to_view_type(VkImageType type); 541 542 /* Pre-generating packets needs to consider changes in packet sizes across hw 543 * versions. Keep things simple and allocate enough space for any supported 544 * version. We ensure the size is large enough through static asserts. 545 */ 546 #define V3DV_TEXTURE_SHADER_STATE_LENGTH 32 547 #define V3DV_SAMPLER_STATE_LENGTH 24 548 #define V3DV_BLEND_CFG_LENGTH 5 549 #define V3DV_CFG_BITS_LENGTH 4 550 #define V3DV_GL_SHADER_STATE_RECORD_LENGTH 36 551 #define V3DV_VCM_CACHE_SIZE_LENGTH 2 552 #define V3DV_GL_SHADER_STATE_ATTRIBUTE_RECORD_LENGTH 16 553 #define V3DV_STENCIL_CFG_LENGTH 6 554 555 struct v3dv_image_view { 556 struct vk_image_view vk; 557 558 const struct v3dv_format *format; 559 bool swap_rb; 560 uint32_t internal_bpp; 561 uint32_t internal_type; 562 uint32_t offset; 563 564 /* Precomputed (composed from createinfo->components and formar swizzle) 565 * swizzles to pass in to the shader key. 566 * 567 * This could be also included on the descriptor bo, but the shader state 568 * packet doesn't need it on a bo, so we can just avoid a memory copy 569 */ 570 uint8_t swizzle[4]; 571 572 /* Prepacked TEXTURE_SHADER_STATE. It will be copied to the descriptor info 573 * during UpdateDescriptorSets. 574 * 575 * Empirical tests show that cube arrays need a different shader state 576 * depending on whether they are used with a sampler or not, so for these 577 * we generate two states and select the one to use based on the descriptor 578 * type. 579 */ 580 uint8_t texture_shader_state[2][V3DV_TEXTURE_SHADER_STATE_LENGTH]; 581 }; 582 583 uint32_t v3dv_layer_offset(const struct v3dv_image *image, uint32_t level, uint32_t layer); 584 585 struct v3dv_buffer { 586 struct vk_object_base base; 587 588 VkDeviceSize size; 589 VkBufferUsageFlags usage; 590 uint32_t alignment; 591 592 struct v3dv_device_memory *mem; 593 VkDeviceSize mem_offset; 594 }; 595 596 struct v3dv_buffer_view { 597 struct vk_object_base base; 598 599 struct v3dv_buffer *buffer; 600 601 VkFormat vk_format; 602 const struct v3dv_format *format; 603 uint32_t internal_bpp; 604 uint32_t internal_type; 605 606 uint32_t offset; 607 uint32_t size; 608 uint32_t num_elements; 609 610 /* Prepacked TEXTURE_SHADER_STATE. */ 611 uint8_t texture_shader_state[V3DV_TEXTURE_SHADER_STATE_LENGTH]; 612 }; 613 614 struct v3dv_subpass_attachment { 615 uint32_t attachment; 616 VkImageLayout layout; 617 }; 618 619 struct v3dv_subpass { 620 uint32_t input_count; 621 struct v3dv_subpass_attachment *input_attachments; 622 623 uint32_t color_count; 624 struct v3dv_subpass_attachment *color_attachments; 625 struct v3dv_subpass_attachment *resolve_attachments; 626 627 struct v3dv_subpass_attachment ds_attachment; 628 629 /* If we need to emit the clear of the depth/stencil attachment using a 630 * a draw call instead of using the TLB (GFXH-1461). 631 */ 632 bool do_depth_clear_with_draw; 633 bool do_stencil_clear_with_draw; 634 635 /* Multiview */ 636 uint32_t view_mask; 637 }; 638 639 struct v3dv_render_pass_attachment { 640 VkAttachmentDescription desc; 641 642 uint32_t first_subpass; 643 uint32_t last_subpass; 644 645 /* When multiview is enabled, we no longer care about when a particular 646 * attachment is first or last used in a render pass, since not all views 647 * in the attachment will meet that criteria. Instead, we need to track 648 * each individual view (layer) in each attachment and emit our stores, 649 * loads and clears accordingly. 650 */ 651 struct { 652 uint32_t first_subpass; 653 uint32_t last_subpass; 654 } views[MAX_MULTIVIEW_VIEW_COUNT]; 655 656 /* If this is a multismapled attachment that is going to be resolved, 657 * whether we can use the TLB resolve on store. 658 */ 659 bool use_tlb_resolve; 660 }; 661 662 struct v3dv_render_pass { 663 struct vk_object_base base; 664 665 bool multiview_enabled; 666 667 uint32_t attachment_count; 668 struct v3dv_render_pass_attachment *attachments; 669 670 uint32_t subpass_count; 671 struct v3dv_subpass *subpasses; 672 673 struct v3dv_subpass_attachment *subpass_attachments; 674 }; 675 676 struct v3dv_framebuffer { 677 struct vk_object_base base; 678 679 uint32_t width; 680 uint32_t height; 681 uint32_t layers; 682 683 /* Typically, edge tiles in the framebuffer have padding depending on the 684 * underlying tiling layout. One consequnce of this is that when the 685 * framebuffer dimensions are not aligned to tile boundaries, tile stores 686 * would still write full tiles on the edges and write to the padded area. 687 * If the framebuffer is aliasing a smaller region of a larger image, then 688 * we need to be careful with this though, as we won't have padding on the 689 * edge tiles (which typically means that we need to load the tile buffer 690 * before we store). 691 */ 692 bool has_edge_padding; 693 694 uint32_t attachment_count; 695 uint32_t color_attachment_count; 696 struct v3dv_image_view *attachments[0]; 697 }; 698 699 struct v3dv_frame_tiling { 700 uint32_t width; 701 uint32_t height; 702 uint32_t layers; 703 uint32_t render_target_count; 704 uint32_t internal_bpp; 705 bool msaa; 706 uint32_t tile_width; 707 uint32_t tile_height; 708 uint32_t draw_tiles_x; 709 uint32_t draw_tiles_y; 710 uint32_t supertile_width; 711 uint32_t supertile_height; 712 uint32_t frame_width_in_supertiles; 713 uint32_t frame_height_in_supertiles; 714 }; 715 716 void v3dv_framebuffer_compute_internal_bpp_msaa(const struct v3dv_framebuffer *framebuffer, 717 const struct v3dv_subpass *subpass, 718 uint8_t *max_bpp, bool *msaa); 719 720 bool v3dv_subpass_area_is_tile_aligned(struct v3dv_device *device, 721 const VkRect2D *area, 722 struct v3dv_framebuffer *fb, 723 struct v3dv_render_pass *pass, 724 uint32_t subpass_idx); 725 726 struct v3dv_cmd_pool { 727 struct vk_object_base base; 728 729 VkAllocationCallbacks alloc; 730 struct list_head cmd_buffers; 731 }; 732 733 enum v3dv_cmd_buffer_status { 734 V3DV_CMD_BUFFER_STATUS_NEW = 0, 735 V3DV_CMD_BUFFER_STATUS_INITIALIZED = 1, 736 V3DV_CMD_BUFFER_STATUS_RECORDING = 2, 737 V3DV_CMD_BUFFER_STATUS_EXECUTABLE = 3 738 }; 739 740 union v3dv_clear_value { 741 uint32_t color[4]; 742 struct { 743 float z; 744 uint8_t s; 745 }; 746 }; 747 748 struct v3dv_cmd_buffer_attachment_state { 749 /* The original clear value as provided by the Vulkan API */ 750 VkClearValue vk_clear_value; 751 752 /* The hardware clear value */ 753 union v3dv_clear_value clear_value; 754 }; 755 756 struct v3dv_viewport_state { 757 uint32_t count; 758 VkViewport viewports[MAX_VIEWPORTS]; 759 float translate[MAX_VIEWPORTS][3]; 760 float scale[MAX_VIEWPORTS][3]; 761 }; 762 763 struct v3dv_scissor_state { 764 uint32_t count; 765 VkRect2D scissors[MAX_SCISSORS]; 766 }; 767 768 /* Mostly a v3dv mapping of VkDynamicState, used to track which data as 769 * defined as dynamic 770 */ 771 enum v3dv_dynamic_state_bits { 772 V3DV_DYNAMIC_VIEWPORT = 1 << 0, 773 V3DV_DYNAMIC_SCISSOR = 1 << 1, 774 V3DV_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 2, 775 V3DV_DYNAMIC_STENCIL_WRITE_MASK = 1 << 3, 776 V3DV_DYNAMIC_STENCIL_REFERENCE = 1 << 4, 777 V3DV_DYNAMIC_BLEND_CONSTANTS = 1 << 5, 778 V3DV_DYNAMIC_DEPTH_BIAS = 1 << 6, 779 V3DV_DYNAMIC_LINE_WIDTH = 1 << 7, 780 V3DV_DYNAMIC_COLOR_WRITE_ENABLE = 1 << 8, 781 V3DV_DYNAMIC_ALL = (1 << 9) - 1, 782 }; 783 784 /* Flags for dirty pipeline state. 785 */ 786 enum v3dv_cmd_dirty_bits { 787 V3DV_CMD_DIRTY_VIEWPORT = 1 << 0, 788 V3DV_CMD_DIRTY_SCISSOR = 1 << 1, 789 V3DV_CMD_DIRTY_STENCIL_COMPARE_MASK = 1 << 2, 790 V3DV_CMD_DIRTY_STENCIL_WRITE_MASK = 1 << 3, 791 V3DV_CMD_DIRTY_STENCIL_REFERENCE = 1 << 4, 792 V3DV_CMD_DIRTY_PIPELINE = 1 << 5, 793 V3DV_CMD_DIRTY_COMPUTE_PIPELINE = 1 << 6, 794 V3DV_CMD_DIRTY_VERTEX_BUFFER = 1 << 7, 795 V3DV_CMD_DIRTY_INDEX_BUFFER = 1 << 8, 796 V3DV_CMD_DIRTY_DESCRIPTOR_SETS = 1 << 9, 797 V3DV_CMD_DIRTY_COMPUTE_DESCRIPTOR_SETS = 1 << 10, 798 V3DV_CMD_DIRTY_PUSH_CONSTANTS = 1 << 11, 799 V3DV_CMD_DIRTY_BLEND_CONSTANTS = 1 << 12, 800 V3DV_CMD_DIRTY_OCCLUSION_QUERY = 1 << 13, 801 V3DV_CMD_DIRTY_DEPTH_BIAS = 1 << 14, 802 V3DV_CMD_DIRTY_LINE_WIDTH = 1 << 15, 803 V3DV_CMD_DIRTY_VIEW_INDEX = 1 << 16, 804 V3DV_CMD_DIRTY_COLOR_WRITE_ENABLE = 1 << 17, 805 }; 806 807 struct v3dv_dynamic_state { 808 /** 809 * Bitmask of (1 << VK_DYNAMIC_STATE_*). 810 * Defines the set of saved dynamic state. 811 */ 812 uint32_t mask; 813 814 struct v3dv_viewport_state viewport; 815 816 struct v3dv_scissor_state scissor; 817 818 struct { 819 uint32_t front; 820 uint32_t back; 821 } stencil_compare_mask; 822 823 struct { 824 uint32_t front; 825 uint32_t back; 826 } stencil_write_mask; 827 828 struct { 829 uint32_t front; 830 uint32_t back; 831 } stencil_reference; 832 833 float blend_constants[4]; 834 835 struct { 836 float constant_factor; 837 float depth_bias_clamp; 838 float slope_factor; 839 } depth_bias; 840 841 float line_width; 842 843 uint32_t color_write_enable; 844 }; 845 846 extern const struct v3dv_dynamic_state default_dynamic_state; 847 848 void v3dv_viewport_compute_xform(const VkViewport *viewport, 849 float scale[3], 850 float translate[3]); 851 852 enum v3dv_ez_state { 853 V3D_EZ_UNDECIDED = 0, 854 V3D_EZ_GT_GE, 855 V3D_EZ_LT_LE, 856 V3D_EZ_DISABLED, 857 }; 858 859 enum v3dv_job_type { 860 V3DV_JOB_TYPE_GPU_CL = 0, 861 V3DV_JOB_TYPE_GPU_CL_SECONDARY, 862 V3DV_JOB_TYPE_GPU_TFU, 863 V3DV_JOB_TYPE_GPU_CSD, 864 V3DV_JOB_TYPE_CPU_RESET_QUERIES, 865 V3DV_JOB_TYPE_CPU_END_QUERY, 866 V3DV_JOB_TYPE_CPU_COPY_QUERY_RESULTS, 867 V3DV_JOB_TYPE_CPU_SET_EVENT, 868 V3DV_JOB_TYPE_CPU_WAIT_EVENTS, 869 V3DV_JOB_TYPE_CPU_COPY_BUFFER_TO_IMAGE, 870 V3DV_JOB_TYPE_CPU_CSD_INDIRECT, 871 V3DV_JOB_TYPE_CPU_TIMESTAMP_QUERY, 872 }; 873 874 struct v3dv_reset_query_cpu_job_info { 875 struct v3dv_query_pool *pool; 876 uint32_t first; 877 uint32_t count; 878 }; 879 880 struct v3dv_end_query_cpu_job_info { 881 struct v3dv_query_pool *pool; 882 uint32_t query; 883 884 /* This is one unless multiview is used */ 885 uint32_t count; 886 }; 887 888 struct v3dv_copy_query_results_cpu_job_info { 889 struct v3dv_query_pool *pool; 890 uint32_t first; 891 uint32_t count; 892 struct v3dv_buffer *dst; 893 uint32_t offset; 894 uint32_t stride; 895 VkQueryResultFlags flags; 896 }; 897 898 struct v3dv_event_set_cpu_job_info { 899 struct v3dv_event *event; 900 int state; 901 }; 902 903 struct v3dv_event_wait_cpu_job_info { 904 /* List of events to wait on */ 905 uint32_t event_count; 906 struct v3dv_event **events; 907 908 /* Whether any postponed jobs after the wait should wait on semaphores */ 909 bool sem_wait; 910 }; 911 912 struct v3dv_copy_buffer_to_image_cpu_job_info { 913 struct v3dv_image *image; 914 struct v3dv_buffer *buffer; 915 uint32_t buffer_offset; 916 uint32_t buffer_stride; 917 uint32_t buffer_layer_stride; 918 VkOffset3D image_offset; 919 VkExtent3D image_extent; 920 uint32_t mip_level; 921 uint32_t base_layer; 922 uint32_t layer_count; 923 }; 924 925 struct v3dv_csd_indirect_cpu_job_info { 926 struct v3dv_buffer *buffer; 927 uint32_t offset; 928 struct v3dv_job *csd_job; 929 uint32_t wg_size; 930 uint32_t *wg_uniform_offsets[3]; 931 bool needs_wg_uniform_rewrite; 932 }; 933 934 struct v3dv_timestamp_query_cpu_job_info { 935 struct v3dv_query_pool *pool; 936 uint32_t query; 937 938 /* This is one unless multiview is used */ 939 uint32_t count; 940 }; 941 942 struct v3dv_job { 943 struct list_head list_link; 944 945 /* We only create job clones when executing secondary command buffers into 946 * primaries. These clones don't make deep copies of the original object 947 * so we want to flag them to avoid freeing resources they don't own. 948 */ 949 bool is_clone; 950 951 enum v3dv_job_type type; 952 953 struct v3dv_device *device; 954 955 struct v3dv_cmd_buffer *cmd_buffer; 956 957 struct v3dv_cl bcl; 958 struct v3dv_cl rcl; 959 struct v3dv_cl indirect; 960 961 /* Set of all BOs referenced by the job. This will be used for making 962 * the list of BOs that the kernel will need to have paged in to 963 * execute our job. 964 */ 965 struct set *bos; 966 uint32_t bo_count; 967 uint64_t bo_handle_mask; 968 969 struct v3dv_bo *tile_alloc; 970 struct v3dv_bo *tile_state; 971 972 bool tmu_dirty_rcl; 973 974 uint32_t first_subpass; 975 976 /* When the current subpass is split into multiple jobs, this flag is set 977 * to true for any jobs after the first in the same subpass. 978 */ 979 bool is_subpass_continue; 980 981 /* If this job is the last job emitted for a subpass. */ 982 bool is_subpass_finish; 983 984 struct v3dv_frame_tiling frame_tiling; 985 986 enum v3dv_ez_state ez_state; 987 enum v3dv_ez_state first_ez_state; 988 989 /* If we have already decided if we need to disable Early Z/S completely 990 * for this job. 991 */ 992 bool decided_global_ez_enable; 993 994 /* If this job has been configured to use early Z/S clear */ 995 bool early_zs_clear; 996 997 /* Number of draw calls recorded into the job */ 998 uint32_t draw_count; 999 1000 /* A flag indicating whether we want to flush every draw separately. This 1001 * can be used for debugging, or for cases where special circumstances 1002 * require this behavior. 1003 */ 1004 bool always_flush; 1005 1006 /* Whether we need to serialize this job in our command stream */ 1007 bool serialize; 1008 1009 /* If this is a CL job, whether we should sync before binning */ 1010 bool needs_bcl_sync; 1011 1012 /* Job specs for CPU jobs */ 1013 union { 1014 struct v3dv_reset_query_cpu_job_info query_reset; 1015 struct v3dv_end_query_cpu_job_info query_end; 1016 struct v3dv_copy_query_results_cpu_job_info query_copy_results; 1017 struct v3dv_event_set_cpu_job_info event_set; 1018 struct v3dv_event_wait_cpu_job_info event_wait; 1019 struct v3dv_copy_buffer_to_image_cpu_job_info copy_buffer_to_image; 1020 struct v3dv_csd_indirect_cpu_job_info csd_indirect; 1021 struct v3dv_timestamp_query_cpu_job_info query_timestamp; 1022 } cpu; 1023 1024 /* Job specs for TFU jobs */ 1025 struct drm_v3d_submit_tfu tfu; 1026 1027 /* Job specs for CSD jobs */ 1028 struct { 1029 struct v3dv_bo *shared_memory; 1030 uint32_t wg_count[3]; 1031 uint32_t wg_base[3]; 1032 struct drm_v3d_submit_csd submit; 1033 } csd; 1034 }; 1035 1036 void v3dv_job_init(struct v3dv_job *job, 1037 enum v3dv_job_type type, 1038 struct v3dv_device *device, 1039 struct v3dv_cmd_buffer *cmd_buffer, 1040 int32_t subpass_idx); 1041 void v3dv_job_destroy(struct v3dv_job *job); 1042 1043 void v3dv_job_add_bo(struct v3dv_job *job, struct v3dv_bo *bo); 1044 void v3dv_job_add_bo_unchecked(struct v3dv_job *job, struct v3dv_bo *bo); 1045 1046 void v3dv_job_start_frame(struct v3dv_job *job, 1047 uint32_t width, 1048 uint32_t height, 1049 uint32_t layers, 1050 bool allocate_tile_state_for_all_layers, 1051 uint32_t render_target_count, 1052 uint8_t max_internal_bpp, 1053 bool msaa); 1054 1055 struct v3dv_job * 1056 v3dv_job_clone_in_cmd_buffer(struct v3dv_job *job, 1057 struct v3dv_cmd_buffer *cmd_buffer); 1058 1059 struct v3dv_job *v3dv_cmd_buffer_create_cpu_job(struct v3dv_device *device, 1060 enum v3dv_job_type type, 1061 struct v3dv_cmd_buffer *cmd_buffer, 1062 uint32_t subpass_idx); 1063 1064 void 1065 v3dv_cmd_buffer_ensure_array_state(struct v3dv_cmd_buffer *cmd_buffer, 1066 uint32_t slot_size, 1067 uint32_t used_count, 1068 uint32_t *alloc_count, 1069 void **ptr); 1070 1071 void v3dv_cmd_buffer_emit_pre_draw(struct v3dv_cmd_buffer *cmd_buffer); 1072 1073 /* FIXME: only used on v3dv_cmd_buffer and v3dvx_cmd_buffer, perhaps move to a 1074 * cmd_buffer specific header? 1075 */ 1076 struct v3dv_draw_info { 1077 uint32_t vertex_count; 1078 uint32_t instance_count; 1079 uint32_t first_vertex; 1080 uint32_t first_instance; 1081 }; 1082 1083 struct v3dv_vertex_binding { 1084 struct v3dv_buffer *buffer; 1085 VkDeviceSize offset; 1086 }; 1087 1088 struct v3dv_descriptor_state { 1089 struct v3dv_descriptor_set *descriptor_sets[MAX_SETS]; 1090 uint32_t valid; 1091 uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS]; 1092 }; 1093 1094 struct v3dv_cmd_pipeline_state { 1095 struct v3dv_pipeline *pipeline; 1096 1097 struct v3dv_descriptor_state descriptor_state; 1098 }; 1099 1100 struct v3dv_cmd_buffer_state { 1101 struct v3dv_render_pass *pass; 1102 struct v3dv_framebuffer *framebuffer; 1103 VkRect2D render_area; 1104 1105 /* Current job being recorded */ 1106 struct v3dv_job *job; 1107 1108 uint32_t subpass_idx; 1109 1110 struct v3dv_cmd_pipeline_state gfx; 1111 struct v3dv_cmd_pipeline_state compute; 1112 1113 struct v3dv_dynamic_state dynamic; 1114 1115 uint32_t dirty; 1116 VkShaderStageFlagBits dirty_descriptor_stages; 1117 VkShaderStageFlagBits dirty_push_constants_stages; 1118 1119 /* Current clip window. We use this to check whether we have an active 1120 * scissor, since in that case we can't use TLB clears and need to fallback 1121 * to drawing rects. 1122 */ 1123 VkRect2D clip_window; 1124 1125 /* Whether our render area is aligned to tile boundaries. If this is false 1126 * then we have tiles that are only partially covered by the render area, 1127 * and therefore, we need to be careful with our loads and stores so we don't 1128 * modify pixels for the tile area that is not covered by the render area. 1129 * This means, for example, that we can't use the TLB to clear, since that 1130 * always clears full tiles. 1131 */ 1132 bool tile_aligned_render_area; 1133 1134 uint32_t attachment_alloc_count; 1135 struct v3dv_cmd_buffer_attachment_state *attachments; 1136 1137 struct v3dv_vertex_binding vertex_bindings[MAX_VBS]; 1138 1139 struct { 1140 VkBuffer buffer; 1141 VkDeviceSize offset; 1142 uint8_t index_size; 1143 } index_buffer; 1144 1145 /* Current uniforms */ 1146 struct { 1147 struct v3dv_cl_reloc vs_bin; 1148 struct v3dv_cl_reloc vs; 1149 struct v3dv_cl_reloc gs_bin; 1150 struct v3dv_cl_reloc gs; 1151 struct v3dv_cl_reloc fs; 1152 } uniforms; 1153 1154 /* Current view index for multiview rendering */ 1155 uint32_t view_index; 1156 1157 /* Used to flag OOM conditions during command buffer recording */ 1158 bool oom; 1159 1160 /* Whether we have recorded a pipeline barrier that we still need to 1161 * process. 1162 */ 1163 bool has_barrier; 1164 bool has_bcl_barrier; 1165 1166 /* Secondary command buffer state */ 1167 struct { 1168 bool occlusion_query_enable; 1169 } inheritance; 1170 1171 /* Command buffer state saved during a meta operation */ 1172 struct { 1173 uint32_t subpass_idx; 1174 VkRenderPass pass; 1175 VkFramebuffer framebuffer; 1176 1177 uint32_t attachment_alloc_count; 1178 uint32_t attachment_count; 1179 struct v3dv_cmd_buffer_attachment_state *attachments; 1180 1181 bool tile_aligned_render_area; 1182 VkRect2D render_area; 1183 1184 struct v3dv_dynamic_state dynamic; 1185 1186 struct v3dv_cmd_pipeline_state gfx; 1187 bool has_descriptor_state; 1188 1189 uint32_t push_constants[MAX_PUSH_CONSTANTS_SIZE / 4]; 1190 } meta; 1191 1192 /* Command buffer state for queries */ 1193 struct { 1194 /* A list of vkCmdQueryEnd commands recorded in the command buffer during 1195 * a render pass. We queue these here and then schedule the corresponding 1196 * CPU jobs for them at the time we finish the GPU job in which they have 1197 * been recorded. 1198 */ 1199 struct { 1200 uint32_t used_count; 1201 uint32_t alloc_count; 1202 struct v3dv_end_query_cpu_job_info *states; 1203 } end; 1204 1205 /* This BO is not NULL if we have an active query, that is, we have 1206 * called vkCmdBeginQuery but not vkCmdEndQuery. 1207 */ 1208 struct { 1209 struct v3dv_bo *bo; 1210 uint32_t offset; 1211 } active_query; 1212 } query; 1213 }; 1214 1215 /* The following struct represents the info from a descriptor that we store on 1216 * the host memory. They are mostly links to other existing vulkan objects, 1217 * like the image_view in order to access to swizzle info, or the buffer used 1218 * for a UBO/SSBO, for example. 1219 * 1220 * FIXME: revisit if makes sense to just move everything that would be needed 1221 * from a descriptor to the bo. 1222 */ 1223 struct v3dv_descriptor { 1224 VkDescriptorType type; 1225 1226 union { 1227 struct { 1228 struct v3dv_image_view *image_view; 1229 struct v3dv_sampler *sampler; 1230 }; 1231 1232 struct { 1233 struct v3dv_buffer *buffer; 1234 uint32_t offset; 1235 uint32_t range; 1236 }; 1237 1238 struct v3dv_buffer_view *buffer_view; 1239 }; 1240 }; 1241 1242 struct v3dv_query { 1243 bool maybe_available; 1244 union { 1245 /* Used by GPU queries (occlusion) */ 1246 struct { 1247 struct v3dv_bo *bo; 1248 uint32_t offset; 1249 }; 1250 /* Used by CPU queries (timestamp) */ 1251 uint64_t value; 1252 }; 1253 }; 1254 1255 struct v3dv_query_pool { 1256 struct vk_object_base base; 1257 1258 struct v3dv_bo *bo; /* Only used with GPU queries (occlusion) */ 1259 1260 VkQueryType query_type; 1261 uint32_t query_count; 1262 struct v3dv_query *queries; 1263 }; 1264 1265 VkResult v3dv_get_query_pool_results_cpu(struct v3dv_device *device, 1266 struct v3dv_query_pool *pool, 1267 uint32_t first, 1268 uint32_t count, 1269 void *data, 1270 VkDeviceSize stride, 1271 VkQueryResultFlags flags); 1272 1273 typedef void (*v3dv_cmd_buffer_private_obj_destroy_cb)(VkDevice device, 1274 uint64_t pobj, 1275 VkAllocationCallbacks *alloc); 1276 struct v3dv_cmd_buffer_private_obj { 1277 struct list_head list_link; 1278 uint64_t obj; 1279 v3dv_cmd_buffer_private_obj_destroy_cb destroy_cb; 1280 }; 1281 1282 struct v3dv_cmd_buffer { 1283 struct vk_command_buffer vk; 1284 1285 struct v3dv_device *device; 1286 1287 struct v3dv_cmd_pool *pool; 1288 struct list_head pool_link; 1289 1290 /* Used at submit time to link command buffers in the submission that have 1291 * spawned wait threads, so we can then wait on all of them to complete 1292 * before we process any signal sempahores or fences. 1293 */ 1294 struct list_head list_link; 1295 1296 VkCommandBufferUsageFlags usage_flags; 1297 VkCommandBufferLevel level; 1298 1299 enum v3dv_cmd_buffer_status status; 1300 1301 struct v3dv_cmd_buffer_state state; 1302 1303 /* FIXME: we have just one client-side and bo for the push constants, 1304 * independently of the stageFlags in vkCmdPushConstants, and the 1305 * pipelineBindPoint in vkCmdBindPipeline. We could probably do more stage 1306 * tunning in the future if it makes sense. 1307 */ 1308 uint32_t push_constants_data[MAX_PUSH_CONSTANTS_SIZE / 4]; 1309 struct v3dv_cl_reloc push_constants_resource; 1310 1311 /* Collection of Vulkan objects created internally by the driver (typically 1312 * during recording of meta operations) that are part of the command buffer 1313 * and should be destroyed with it. 1314 */ 1315 struct list_head private_objs; /* v3dv_cmd_buffer_private_obj */ 1316 1317 /* Per-command buffer resources for meta operations. */ 1318 struct { 1319 struct { 1320 /* The current descriptor pool for blit sources */ 1321 VkDescriptorPool dspool; 1322 } blit; 1323 struct { 1324 /* The current descriptor pool for texel buffer copy sources */ 1325 VkDescriptorPool dspool; 1326 } texel_buffer_copy; 1327 } meta; 1328 1329 /* List of jobs in the command buffer. For primary command buffers it 1330 * represents the jobs we want to submit to the GPU. For secondary command 1331 * buffers it represents jobs that will be merged into a primary command 1332 * buffer via vkCmdExecuteCommands. 1333 */ 1334 struct list_head jobs; 1335 }; 1336 1337 struct v3dv_job *v3dv_cmd_buffer_start_job(struct v3dv_cmd_buffer *cmd_buffer, 1338 int32_t subpass_idx, 1339 enum v3dv_job_type type); 1340 void v3dv_cmd_buffer_finish_job(struct v3dv_cmd_buffer *cmd_buffer); 1341 1342 struct v3dv_job *v3dv_cmd_buffer_subpass_start(struct v3dv_cmd_buffer *cmd_buffer, 1343 uint32_t subpass_idx); 1344 struct v3dv_job *v3dv_cmd_buffer_subpass_resume(struct v3dv_cmd_buffer *cmd_buffer, 1345 uint32_t subpass_idx); 1346 1347 void v3dv_cmd_buffer_subpass_finish(struct v3dv_cmd_buffer *cmd_buffer); 1348 1349 void v3dv_cmd_buffer_meta_state_push(struct v3dv_cmd_buffer *cmd_buffer, 1350 bool push_descriptor_state); 1351 void v3dv_cmd_buffer_meta_state_pop(struct v3dv_cmd_buffer *cmd_buffer, 1352 uint32_t dirty_dynamic_state, 1353 bool needs_subpass_resume); 1354 1355 void v3dv_cmd_buffer_reset_queries(struct v3dv_cmd_buffer *cmd_buffer, 1356 struct v3dv_query_pool *pool, 1357 uint32_t first, 1358 uint32_t count); 1359 1360 void v3dv_cmd_buffer_begin_query(struct v3dv_cmd_buffer *cmd_buffer, 1361 struct v3dv_query_pool *pool, 1362 uint32_t query, 1363 VkQueryControlFlags flags); 1364 1365 void v3dv_cmd_buffer_end_query(struct v3dv_cmd_buffer *cmd_buffer, 1366 struct v3dv_query_pool *pool, 1367 uint32_t query); 1368 1369 void v3dv_cmd_buffer_copy_query_results(struct v3dv_cmd_buffer *cmd_buffer, 1370 struct v3dv_query_pool *pool, 1371 uint32_t first, 1372 uint32_t count, 1373 struct v3dv_buffer *dst, 1374 uint32_t offset, 1375 uint32_t stride, 1376 VkQueryResultFlags flags); 1377 1378 void v3dv_cmd_buffer_add_tfu_job(struct v3dv_cmd_buffer *cmd_buffer, 1379 struct drm_v3d_submit_tfu *tfu); 1380 1381 void v3dv_cmd_buffer_rewrite_indirect_csd_job(struct v3dv_csd_indirect_cpu_job_info *info, 1382 const uint32_t *wg_counts); 1383 1384 void v3dv_cmd_buffer_add_private_obj(struct v3dv_cmd_buffer *cmd_buffer, 1385 uint64_t obj, 1386 v3dv_cmd_buffer_private_obj_destroy_cb destroy_cb); 1387 1388 struct v3dv_semaphore { 1389 struct vk_object_base base; 1390 1391 /* A syncobject handle associated with this semaphore */ 1392 uint32_t sync; 1393 1394 /* A temporary syncobject handle produced from a vkImportSemaphoreFd. */ 1395 uint32_t temp_sync; 1396 }; 1397 1398 struct v3dv_fence { 1399 struct vk_object_base base; 1400 1401 /* A syncobject handle associated with this fence */ 1402 uint32_t sync; 1403 1404 /* A temporary syncobject handle produced from a vkImportFenceFd. */ 1405 uint32_t temp_sync; 1406 }; 1407 1408 struct v3dv_event { 1409 struct vk_object_base base; 1410 int state; 1411 }; 1412 1413 struct v3dv_shader_variant { 1414 enum broadcom_shader_stage stage; 1415 1416 union { 1417 struct v3d_prog_data *base; 1418 struct v3d_vs_prog_data *vs; 1419 struct v3d_gs_prog_data *gs; 1420 struct v3d_fs_prog_data *fs; 1421 struct v3d_compute_prog_data *cs; 1422 } prog_data; 1423 1424 /* We explicitly save the prog_data_size as it would make easier to 1425 * serialize 1426 */ 1427 uint32_t prog_data_size; 1428 1429 /* The assembly for this variant will be uploaded to a BO shared with all 1430 * other shader stages in that pipeline. This is the offset in that BO. 1431 */ 1432 uint32_t assembly_offset; 1433 1434 /* Note: it is really likely that qpu_insts would be NULL, as it will be 1435 * used only temporarily, to upload it to the shared bo, as we compile the 1436 * different stages individually. 1437 */ 1438 uint64_t *qpu_insts; 1439 uint32_t qpu_insts_size; 1440 }; 1441 1442 /* 1443 * Per-stage info for each stage, useful so shader_module_compile_to_nir and 1444 * other methods doesn't have so many parameters. 1445 * 1446 * FIXME: for the case of the coordinate shader and the vertex shader, module, 1447 * entrypoint, spec_info and nir are the same. There are also info only 1448 * relevant to some stages. But seemed too much a hassle to create a new 1449 * struct only to handle that. Revisit if such kind of info starts to grow. 1450 */ 1451 struct v3dv_pipeline_stage { 1452 struct v3dv_pipeline *pipeline; 1453 1454 enum broadcom_shader_stage stage; 1455 1456 const struct vk_shader_module *module; 1457 const char *entrypoint; 1458 const VkSpecializationInfo *spec_info; 1459 1460 nir_shader *nir; 1461 1462 /* The following is the combined hash of module+entrypoint+spec_info+nir */ 1463 unsigned char shader_sha1[20]; 1464 1465 /** A name for this program, so you can track it in shader-db output. */ 1466 uint32_t program_id; 1467 1468 VkPipelineCreationFeedbackEXT feedback; 1469 }; 1470 1471 /* We are using the descriptor pool entry for two things: 1472 * * Track the allocated sets, so we can properly free it if needed 1473 * * Track the suballocated pool bo regions, so if some descriptor set is 1474 * freed, the gap could be reallocated later. 1475 * 1476 * Those only make sense if the pool was not created with the flag 1477 * VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT 1478 */ 1479 struct v3dv_descriptor_pool_entry 1480 { 1481 struct v3dv_descriptor_set *set; 1482 /* Offset and size of the subregion allocated for this entry from the 1483 * pool->bo 1484 */ 1485 uint32_t offset; 1486 uint32_t size; 1487 }; 1488 1489 struct v3dv_descriptor_pool { 1490 struct vk_object_base base; 1491 1492 /* If this descriptor pool has been allocated for the driver for internal 1493 * use, typically to implement meta operations. 1494 */ 1495 bool is_driver_internal; 1496 1497 struct v3dv_bo *bo; 1498 /* Current offset at the descriptor bo. 0 means that we didn't use it for 1499 * any descriptor. If the descriptor bo is NULL, current offset is 1500 * meaningless 1501 */ 1502 uint32_t current_offset; 1503 1504 /* If VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT is not set the 1505 * descriptor sets are handled as a whole as pool memory and handled by the 1506 * following pointers. If set, they are not used, and individually 1507 * descriptor sets are allocated/freed. 1508 */ 1509 uint8_t *host_memory_base; 1510 uint8_t *host_memory_ptr; 1511 uint8_t *host_memory_end; 1512 1513 uint32_t entry_count; 1514 uint32_t max_entry_count; 1515 struct v3dv_descriptor_pool_entry entries[0]; 1516 }; 1517 1518 struct v3dv_descriptor_set { 1519 struct vk_object_base base; 1520 1521 struct v3dv_descriptor_pool *pool; 1522 1523 const struct v3dv_descriptor_set_layout *layout; 1524 1525 /* Offset relative to the descriptor pool bo for this set */ 1526 uint32_t base_offset; 1527 1528 /* The descriptors below can be indexed (set/binding) using the set_layout 1529 */ 1530 struct v3dv_descriptor descriptors[0]; 1531 }; 1532 1533 struct v3dv_descriptor_set_binding_layout { 1534 VkDescriptorType type; 1535 1536 /* Number of array elements in this binding */ 1537 uint32_t array_size; 1538 1539 /* Index into the flattend descriptor set */ 1540 uint32_t descriptor_index; 1541 1542 uint32_t dynamic_offset_count; 1543 uint32_t dynamic_offset_index; 1544 1545 /* Offset into the descriptor set where this descriptor lives (final offset 1546 * on the descriptor bo need to take into account set->base_offset) 1547 */ 1548 uint32_t descriptor_offset; 1549 1550 /* Offset in the v3dv_descriptor_set_layout of the immutable samplers, or 0 1551 * if there are no immutable samplers. 1552 */ 1553 uint32_t immutable_samplers_offset; 1554 }; 1555 1556 struct v3dv_descriptor_set_layout { 1557 struct vk_object_base base; 1558 1559 VkDescriptorSetLayoutCreateFlags flags; 1560 1561 /* Number of bindings in this descriptor set */ 1562 uint32_t binding_count; 1563 1564 /* Total bo size needed for this descriptor set 1565 */ 1566 uint32_t bo_size; 1567 1568 /* Shader stages affected by this descriptor set */ 1569 uint16_t shader_stages; 1570 1571 /* Number of descriptors in this descriptor set */ 1572 uint32_t descriptor_count; 1573 1574 /* Number of dynamic offsets used by this descriptor set */ 1575 uint16_t dynamic_offset_count; 1576 1577 /* Bindings in this descriptor set */ 1578 struct v3dv_descriptor_set_binding_layout binding[0]; 1579 }; 1580 1581 struct v3dv_pipeline_layout { 1582 struct vk_object_base base; 1583 1584 struct { 1585 struct v3dv_descriptor_set_layout *layout; 1586 uint32_t dynamic_offset_start; 1587 } set[MAX_SETS]; 1588 1589 uint32_t num_sets; 1590 1591 /* Shader stages that are declared to use descriptors from this layout */ 1592 uint32_t shader_stages; 1593 1594 uint32_t dynamic_offset_count; 1595 uint32_t push_constant_size; 1596 }; 1597 1598 /* 1599 * We are using descriptor maps for ubo/ssbo and texture/samplers, so we need 1600 * it to be big enough to include the max value for all of them. 1601 * 1602 * FIXME: one alternative would be to allocate the map as big as you need for 1603 * each descriptor type. That would means more individual allocations. 1604 */ 1605 #define DESCRIPTOR_MAP_SIZE MAX3(V3D_MAX_TEXTURE_SAMPLERS, \ 1606 MAX_UNIFORM_BUFFERS, \ 1607 MAX_STORAGE_BUFFERS) 1608 1609 1610 struct v3dv_descriptor_map { 1611 /* TODO: avoid fixed size array/justify the size */ 1612 unsigned num_desc; /* Number of descriptors */ 1613 int set[DESCRIPTOR_MAP_SIZE]; 1614 int binding[DESCRIPTOR_MAP_SIZE]; 1615 int array_index[DESCRIPTOR_MAP_SIZE]; 1616 int array_size[DESCRIPTOR_MAP_SIZE]; 1617 1618 /* NOTE: the following is only for sampler, but this is the easier place to 1619 * put it. 1620 */ 1621 uint8_t return_size[DESCRIPTOR_MAP_SIZE]; 1622 }; 1623 1624 struct v3dv_sampler { 1625 struct vk_object_base base; 1626 1627 bool compare_enable; 1628 bool unnormalized_coordinates; 1629 bool clamp_to_transparent_black_border; 1630 1631 /* Prepacked SAMPLER_STATE, that is referenced as part of the tmu 1632 * configuration. If needed it will be copied to the descriptor info during 1633 * UpdateDescriptorSets 1634 */ 1635 uint8_t sampler_state[V3DV_SAMPLER_STATE_LENGTH]; 1636 }; 1637 1638 struct v3dv_descriptor_template_entry { 1639 /* The type of descriptor in this entry */ 1640 VkDescriptorType type; 1641 1642 /* Binding in the descriptor set */ 1643 uint32_t binding; 1644 1645 /* Offset at which to write into the descriptor set binding */ 1646 uint32_t array_element; 1647 1648 /* Number of elements to write into the descriptor set binding */ 1649 uint32_t array_count; 1650 1651 /* Offset into the user provided data */ 1652 size_t offset; 1653 1654 /* Stride between elements into the user provided data */ 1655 size_t stride; 1656 }; 1657 1658 struct v3dv_descriptor_update_template { 1659 struct vk_object_base base; 1660 1661 VkPipelineBindPoint bind_point; 1662 1663 /* The descriptor set this template corresponds to. This value is only 1664 * valid if the template was created with the templateType 1665 * VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET. 1666 */ 1667 uint8_t set; 1668 1669 /* Number of entries in this template */ 1670 uint32_t entry_count; 1671 1672 /* Entries of the template */ 1673 struct v3dv_descriptor_template_entry entries[0]; 1674 }; 1675 1676 1677 /* We keep two special values for the sampler idx that represents exactly when a 1678 * sampler is not needed/provided. The main use is that even if we don't have 1679 * sampler, we still need to do the output unpacking (through 1680 * nir_lower_tex). The easier way to do this is to add those special "no 1681 * sampler" in the sampler_map, and then use the proper unpacking for that 1682 * case. 1683 * 1684 * We have one when we want a 16bit output size, and other when we want a 1685 * 32bit output size. We use the info coming from the RelaxedPrecision 1686 * decoration to decide between one and the other. 1687 */ 1688 #define V3DV_NO_SAMPLER_16BIT_IDX 0 1689 #define V3DV_NO_SAMPLER_32BIT_IDX 1 1690 1691 /* 1692 * Following two methods are using on the combined to/from texture/sampler 1693 * indices maps at v3dv_pipeline. 1694 */ 1695 static inline uint32_t 1696 v3dv_pipeline_combined_index_key_create(uint32_t texture_index, 1697 uint32_t sampler_index) 1698 { 1699 return texture_index << 24 | sampler_index; 1700 } 1701 1702 static inline void 1703 v3dv_pipeline_combined_index_key_unpack(uint32_t combined_index_key, 1704 uint32_t *texture_index, 1705 uint32_t *sampler_index) 1706 { 1707 uint32_t texture = combined_index_key >> 24; 1708 uint32_t sampler = combined_index_key & 0xffffff; 1709 1710 if (texture_index) 1711 *texture_index = texture; 1712 1713 if (sampler_index) 1714 *sampler_index = sampler; 1715 } 1716 1717 struct v3dv_descriptor_maps { 1718 struct v3dv_descriptor_map ubo_map; 1719 struct v3dv_descriptor_map ssbo_map; 1720 struct v3dv_descriptor_map sampler_map; 1721 struct v3dv_descriptor_map texture_map; 1722 }; 1723 1724 /* The structure represents data shared between different objects, like the 1725 * pipeline and the pipeline cache, so we ref count it to know when it should 1726 * be freed. 1727 */ 1728 struct v3dv_pipeline_shared_data { 1729 uint32_t ref_cnt; 1730 1731 unsigned char sha1_key[20]; 1732 1733 struct v3dv_descriptor_maps *maps[BROADCOM_SHADER_STAGES]; 1734 struct v3dv_shader_variant *variants[BROADCOM_SHADER_STAGES]; 1735 1736 struct v3dv_bo *assembly_bo; 1737 }; 1738 1739 struct v3dv_pipeline { 1740 struct vk_object_base base; 1741 1742 struct v3dv_device *device; 1743 1744 VkShaderStageFlags active_stages; 1745 1746 struct v3dv_render_pass *pass; 1747 struct v3dv_subpass *subpass; 1748 1749 /* Note: We can't use just a MESA_SHADER_STAGES array because we also need 1750 * to track binning shaders. Note these will be freed once the pipeline 1751 * has been compiled. 1752 */ 1753 struct v3dv_pipeline_stage *vs; 1754 struct v3dv_pipeline_stage *vs_bin; 1755 struct v3dv_pipeline_stage *gs; 1756 struct v3dv_pipeline_stage *gs_bin; 1757 struct v3dv_pipeline_stage *fs; 1758 struct v3dv_pipeline_stage *cs; 1759 1760 /* Flags for whether optional pipeline stages are present, for convenience */ 1761 bool has_gs; 1762 1763 /* Spilling memory requirements */ 1764 struct { 1765 struct v3dv_bo *bo; 1766 uint32_t size_per_thread; 1767 } spill; 1768 1769 struct v3dv_dynamic_state dynamic_state; 1770 1771 struct v3dv_pipeline_layout *layout; 1772 1773 /* Whether this pipeline enables depth writes */ 1774 bool z_updates_enable; 1775 1776 enum v3dv_ez_state ez_state; 1777 1778 bool msaa; 1779 bool sample_rate_shading; 1780 uint32_t sample_mask; 1781 1782 bool primitive_restart; 1783 1784 /* Accessed by binding. So vb[binding]->stride is the stride of the vertex 1785 * array with such binding 1786 */ 1787 struct v3dv_pipeline_vertex_binding { 1788 uint32_t stride; 1789 uint32_t instance_divisor; 1790 } vb[MAX_VBS]; 1791 uint32_t vb_count; 1792 1793 /* Note that a lot of info from VkVertexInputAttributeDescription is 1794 * already prepacked, so here we are only storing those that need recheck 1795 * later. The array must be indexed by driver location, since that is the 1796 * order in which we need to emit the attributes. 1797 */ 1798 struct v3dv_pipeline_vertex_attrib { 1799 uint32_t binding; 1800 uint32_t offset; 1801 VkFormat vk_format; 1802 } va[MAX_VERTEX_ATTRIBS]; 1803 uint32_t va_count; 1804 1805 enum pipe_prim_type topology; 1806 1807 struct v3dv_pipeline_shared_data *shared_data; 1808 1809 /* In general we can reuse v3dv_device->default_attribute_float, so note 1810 * that the following can be NULL. 1811 * 1812 * FIXME: the content of this BO will be small, so it could be improved to 1813 * be uploaded to a common BO. But as in most cases it will be NULL, it is 1814 * not a priority. 1815 */ 1816 struct v3dv_bo *default_attribute_values; 1817 1818 struct vpm_config vpm_cfg; 1819 struct vpm_config vpm_cfg_bin; 1820 1821 /* If the pipeline should emit any of the stencil configuration packets */ 1822 bool emit_stencil_cfg[2]; 1823 1824 /* Blend state */ 1825 struct { 1826 /* Per-RT bit mask with blend enables */ 1827 uint8_t enables; 1828 /* Per-RT prepacked blend config packets */ 1829 uint8_t cfg[V3D_MAX_DRAW_BUFFERS][V3DV_BLEND_CFG_LENGTH]; 1830 /* Flag indicating whether the blend factors in use require 1831 * color constants. 1832 */ 1833 bool needs_color_constants; 1834 /* Mask with enabled color channels for each RT (4 bits per RT) */ 1835 uint32_t color_write_masks; 1836 } blend; 1837 1838 /* Depth bias */ 1839 struct { 1840 bool enabled; 1841 bool is_z16; 1842 } depth_bias; 1843 1844 /* Packets prepacked during pipeline creation 1845 */ 1846 uint8_t cfg_bits[V3DV_CFG_BITS_LENGTH]; 1847 uint8_t shader_state_record[V3DV_GL_SHADER_STATE_RECORD_LENGTH]; 1848 uint8_t vcm_cache_size[V3DV_VCM_CACHE_SIZE_LENGTH]; 1849 uint8_t vertex_attrs[V3DV_GL_SHADER_STATE_ATTRIBUTE_RECORD_LENGTH * 1850 MAX_VERTEX_ATTRIBS]; 1851 uint8_t stencil_cfg[2][V3DV_STENCIL_CFG_LENGTH]; 1852 }; 1853 1854 static inline VkPipelineBindPoint 1855 v3dv_pipeline_get_binding_point(struct v3dv_pipeline *pipeline) 1856 { 1857 assert(pipeline->active_stages == VK_SHADER_STAGE_COMPUTE_BIT || 1858 !(pipeline->active_stages & VK_SHADER_STAGE_COMPUTE_BIT)); 1859 return pipeline->active_stages == VK_SHADER_STAGE_COMPUTE_BIT ? 1860 VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS; 1861 } 1862 1863 static inline struct v3dv_descriptor_state* 1864 v3dv_cmd_buffer_get_descriptor_state(struct v3dv_cmd_buffer *cmd_buffer, 1865 struct v3dv_pipeline *pipeline) 1866 { 1867 if (v3dv_pipeline_get_binding_point(pipeline) == VK_PIPELINE_BIND_POINT_COMPUTE) 1868 return &cmd_buffer->state.compute.descriptor_state; 1869 else 1870 return &cmd_buffer->state.gfx.descriptor_state; 1871 } 1872 1873 const nir_shader_compiler_options *v3dv_pipeline_get_nir_options(void); 1874 1875 uint32_t v3dv_physical_device_vendor_id(struct v3dv_physical_device *dev); 1876 uint32_t v3dv_physical_device_device_id(struct v3dv_physical_device *dev); 1877 1878 #ifdef DEBUG 1879 #define v3dv_debug_ignored_stype(sType) \ 1880 fprintf(stderr, "%s: ignored VkStructureType %u:%s\n\n", __func__, (sType), vk_StructureType_to_str(sType)) 1881 #else 1882 #define v3dv_debug_ignored_stype(sType) 1883 #endif 1884 1885 const uint8_t *v3dv_get_format_swizzle(struct v3dv_device *device, VkFormat f); 1886 uint8_t v3dv_get_tex_return_size(const struct v3dv_format *vf, bool compare_enable); 1887 const struct v3dv_format * 1888 v3dv_get_compatible_tfu_format(struct v3dv_device *device, 1889 uint32_t bpp, VkFormat *out_vk_format); 1890 bool v3dv_buffer_format_supports_features(struct v3dv_device *device, 1891 VkFormat vk_format, 1892 VkFormatFeatureFlags features); 1893 1894 struct v3dv_cl_reloc v3dv_write_uniforms(struct v3dv_cmd_buffer *cmd_buffer, 1895 struct v3dv_pipeline *pipeline, 1896 struct v3dv_shader_variant *variant); 1897 1898 struct v3dv_cl_reloc v3dv_write_uniforms_wg_offsets(struct v3dv_cmd_buffer *cmd_buffer, 1899 struct v3dv_pipeline *pipeline, 1900 struct v3dv_shader_variant *variant, 1901 uint32_t **wg_count_offsets); 1902 1903 struct v3dv_shader_variant * 1904 v3dv_get_shader_variant(struct v3dv_pipeline_stage *p_stage, 1905 struct v3dv_pipeline_cache *cache, 1906 struct v3d_key *key, 1907 size_t key_size, 1908 const VkAllocationCallbacks *pAllocator, 1909 VkResult *out_vk_result); 1910 1911 struct v3dv_shader_variant * 1912 v3dv_shader_variant_create(struct v3dv_device *device, 1913 enum broadcom_shader_stage stage, 1914 struct v3d_prog_data *prog_data, 1915 uint32_t prog_data_size, 1916 uint32_t assembly_offset, 1917 uint64_t *qpu_insts, 1918 uint32_t qpu_insts_size, 1919 VkResult *out_vk_result); 1920 1921 void 1922 v3dv_shader_variant_destroy(struct v3dv_device *device, 1923 struct v3dv_shader_variant *variant); 1924 1925 static inline void 1926 v3dv_pipeline_shared_data_ref(struct v3dv_pipeline_shared_data *shared_data) 1927 { 1928 assert(shared_data && shared_data->ref_cnt >= 1); 1929 p_atomic_inc(&shared_data->ref_cnt); 1930 } 1931 1932 void 1933 v3dv_pipeline_shared_data_destroy(struct v3dv_device *device, 1934 struct v3dv_pipeline_shared_data *shared_data); 1935 1936 static inline void 1937 v3dv_pipeline_shared_data_unref(struct v3dv_device *device, 1938 struct v3dv_pipeline_shared_data *shared_data) 1939 { 1940 assert(shared_data && shared_data->ref_cnt >= 1); 1941 if (p_atomic_dec_zero(&shared_data->ref_cnt)) 1942 v3dv_pipeline_shared_data_destroy(device, shared_data); 1943 } 1944 1945 struct v3dv_descriptor * 1946 v3dv_descriptor_map_get_descriptor(struct v3dv_descriptor_state *descriptor_state, 1947 struct v3dv_descriptor_map *map, 1948 struct v3dv_pipeline_layout *pipeline_layout, 1949 uint32_t index, 1950 uint32_t *dynamic_offset); 1951 1952 const struct v3dv_sampler * 1953 v3dv_descriptor_map_get_sampler(struct v3dv_descriptor_state *descriptor_state, 1954 struct v3dv_descriptor_map *map, 1955 struct v3dv_pipeline_layout *pipeline_layout, 1956 uint32_t index); 1957 1958 struct v3dv_cl_reloc 1959 v3dv_descriptor_map_get_sampler_state(struct v3dv_device *device, 1960 struct v3dv_descriptor_state *descriptor_state, 1961 struct v3dv_descriptor_map *map, 1962 struct v3dv_pipeline_layout *pipeline_layout, 1963 uint32_t index); 1964 1965 struct v3dv_cl_reloc 1966 v3dv_descriptor_map_get_texture_shader_state(struct v3dv_device *device, 1967 struct v3dv_descriptor_state *descriptor_state, 1968 struct v3dv_descriptor_map *map, 1969 struct v3dv_pipeline_layout *pipeline_layout, 1970 uint32_t index); 1971 1972 const struct v3dv_format* 1973 v3dv_descriptor_map_get_texture_format(struct v3dv_descriptor_state *descriptor_state, 1974 struct v3dv_descriptor_map *map, 1975 struct v3dv_pipeline_layout *pipeline_layout, 1976 uint32_t index, 1977 VkFormat *out_vk_format); 1978 1979 struct v3dv_bo* 1980 v3dv_descriptor_map_get_texture_bo(struct v3dv_descriptor_state *descriptor_state, 1981 struct v3dv_descriptor_map *map, 1982 struct v3dv_pipeline_layout *pipeline_layout, 1983 uint32_t index); 1984 1985 static inline const struct v3dv_sampler * 1986 v3dv_immutable_samplers(const struct v3dv_descriptor_set_layout *set, 1987 const struct v3dv_descriptor_set_binding_layout *binding) 1988 { 1989 assert(binding->immutable_samplers_offset); 1990 return (const struct v3dv_sampler *) ((const char *) set + binding->immutable_samplers_offset); 1991 } 1992 1993 void v3dv_pipeline_cache_init(struct v3dv_pipeline_cache *cache, 1994 struct v3dv_device *device, 1995 VkPipelineCacheCreateFlags, 1996 bool cache_enabled); 1997 1998 void v3dv_pipeline_cache_finish(struct v3dv_pipeline_cache *cache); 1999 2000 void v3dv_pipeline_cache_upload_nir(struct v3dv_pipeline *pipeline, 2001 struct v3dv_pipeline_cache *cache, 2002 nir_shader *nir, 2003 unsigned char sha1_key[20]); 2004 2005 nir_shader* v3dv_pipeline_cache_search_for_nir(struct v3dv_pipeline *pipeline, 2006 struct v3dv_pipeline_cache *cache, 2007 const nir_shader_compiler_options *nir_options, 2008 unsigned char sha1_key[20]); 2009 2010 struct v3dv_pipeline_shared_data * 2011 v3dv_pipeline_cache_search_for_pipeline(struct v3dv_pipeline_cache *cache, 2012 unsigned char sha1_key[20], 2013 bool *cache_hit); 2014 2015 void 2016 v3dv_pipeline_cache_upload_pipeline(struct v3dv_pipeline *pipeline, 2017 struct v3dv_pipeline_cache *cache); 2018 2019 struct v3dv_bo * 2020 v3dv_pipeline_create_default_attribute_values(struct v3dv_device *device, 2021 struct v3dv_pipeline *pipeline); 2022 2023 void v3dv_shader_module_internal_init(struct v3dv_device *device, 2024 struct vk_shader_module *module, 2025 nir_shader *nir); 2026 2027 #define V3DV_FROM_HANDLE(__v3dv_type, __name, __handle) \ 2028 VK_FROM_HANDLE(__v3dv_type, __name, __handle) 2029 2030 VK_DEFINE_HANDLE_CASTS(v3dv_cmd_buffer, vk.base, VkCommandBuffer, 2031 VK_OBJECT_TYPE_COMMAND_BUFFER) 2032 VK_DEFINE_HANDLE_CASTS(v3dv_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE) 2033 VK_DEFINE_HANDLE_CASTS(v3dv_instance, vk.base, VkInstance, 2034 VK_OBJECT_TYPE_INSTANCE) 2035 VK_DEFINE_HANDLE_CASTS(v3dv_physical_device, vk.base, VkPhysicalDevice, 2036 VK_OBJECT_TYPE_PHYSICAL_DEVICE) 2037 VK_DEFINE_HANDLE_CASTS(v3dv_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE) 2038 2039 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_cmd_pool, base, VkCommandPool, 2040 VK_OBJECT_TYPE_COMMAND_POOL) 2041 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_buffer, base, VkBuffer, 2042 VK_OBJECT_TYPE_BUFFER) 2043 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_buffer_view, base, VkBufferView, 2044 VK_OBJECT_TYPE_BUFFER_VIEW) 2045 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_device_memory, base, VkDeviceMemory, 2046 VK_OBJECT_TYPE_DEVICE_MEMORY) 2047 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_descriptor_pool, base, VkDescriptorPool, 2048 VK_OBJECT_TYPE_DESCRIPTOR_POOL) 2049 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_descriptor_set, base, VkDescriptorSet, 2050 VK_OBJECT_TYPE_DESCRIPTOR_SET) 2051 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_descriptor_set_layout, base, 2052 VkDescriptorSetLayout, 2053 VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT) 2054 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_descriptor_update_template, base, 2055 VkDescriptorUpdateTemplate, 2056 VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE) 2057 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_event, base, VkEvent, VK_OBJECT_TYPE_EVENT) 2058 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_fence, base, VkFence, VK_OBJECT_TYPE_FENCE) 2059 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_framebuffer, base, VkFramebuffer, 2060 VK_OBJECT_TYPE_FRAMEBUFFER) 2061 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_image, vk.base, VkImage, 2062 VK_OBJECT_TYPE_IMAGE) 2063 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_image_view, vk.base, VkImageView, 2064 VK_OBJECT_TYPE_IMAGE_VIEW) 2065 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_pipeline, base, VkPipeline, 2066 VK_OBJECT_TYPE_PIPELINE) 2067 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_pipeline_cache, base, VkPipelineCache, 2068 VK_OBJECT_TYPE_PIPELINE_CACHE) 2069 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_pipeline_layout, base, VkPipelineLayout, 2070 VK_OBJECT_TYPE_PIPELINE_LAYOUT) 2071 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_query_pool, base, VkQueryPool, 2072 VK_OBJECT_TYPE_QUERY_POOL) 2073 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_render_pass, base, VkRenderPass, 2074 VK_OBJECT_TYPE_RENDER_PASS) 2075 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_sampler, base, VkSampler, 2076 VK_OBJECT_TYPE_SAMPLER) 2077 VK_DEFINE_NONDISP_HANDLE_CASTS(v3dv_semaphore, base, VkSemaphore, 2078 VK_OBJECT_TYPE_SEMAPHORE) 2079 2080 static inline int 2081 v3dv_ioctl(int fd, unsigned long request, void *arg) 2082 { 2083 if (using_v3d_simulator) 2084 return v3d_simulator_ioctl(fd, request, arg); 2085 else 2086 return drmIoctl(fd, request, arg); 2087 } 2088 2089 /* Flags OOM conditions in command buffer state. 2090 * 2091 * Note: notice that no-op jobs don't have a command buffer reference. 2092 */ 2093 static inline void 2094 v3dv_flag_oom(struct v3dv_cmd_buffer *cmd_buffer, struct v3dv_job *job) 2095 { 2096 if (cmd_buffer) { 2097 cmd_buffer->state.oom = true; 2098 } else { 2099 assert(job); 2100 if (job->cmd_buffer) 2101 job->cmd_buffer->state.oom = true; 2102 } 2103 } 2104 2105 #define v3dv_return_if_oom(_cmd_buffer, _job) do { \ 2106 const struct v3dv_cmd_buffer *__cmd_buffer = _cmd_buffer; \ 2107 if (__cmd_buffer && __cmd_buffer->state.oom) \ 2108 return; \ 2109 const struct v3dv_job *__job = _job; \ 2110 if (__job && __job->cmd_buffer && __job->cmd_buffer->state.oom) \ 2111 return; \ 2112 } while(0) \ 2113 2114 static inline uint32_t 2115 u64_hash(const void *key) 2116 { 2117 return _mesa_hash_data(key, sizeof(uint64_t)); 2118 } 2119 2120 static inline bool 2121 u64_compare(const void *key1, const void *key2) 2122 { 2123 return memcmp(key1, key2, sizeof(uint64_t)) == 0; 2124 } 2125 2126 /* Helper to call hw ver speficic functions */ 2127 #define v3dv_X(device, thing) ({ \ 2128 __typeof(&v3d42_##thing) v3d_X_thing; \ 2129 switch (device->devinfo.ver) { \ 2130 case 42: \ 2131 v3d_X_thing = &v3d42_##thing; \ 2132 break; \ 2133 default: \ 2134 unreachable("Unsupported hardware generation"); \ 2135 } \ 2136 v3d_X_thing; \ 2137 }) 2138 2139 2140 /* v3d_macros from common requires v3dX and V3DX definitions. Below we need to 2141 * define v3dX for each version supported, because when we compile code that 2142 * is not version-specific, all version-specific macros need to be already 2143 * defined. 2144 */ 2145 #ifdef v3dX 2146 # include "v3dvx_private.h" 2147 #else 2148 # define v3dX(x) v3d42_##x 2149 # include "v3dvx_private.h" 2150 # undef v3dX 2151 #endif 2152 2153 #endif /* V3DV_PRIVATE_H */ 2154