1 /* 2 * Copyright 2021 Collabora Ltd. 3 * 4 * derived from tu_private.h driver which is: 5 * Copyright 2016 Red Hat. 6 * Copyright 2016 Bas Nieuwenhuizen 7 * Copyright 2015 Intel Corporation 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice (including the next 17 * paragraph) shall be included in all copies or substantial portions of the 18 * Software. 19 * 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 * DEALINGS IN THE SOFTWARE. 27 */ 28 29 #ifndef PANVK_PRIVATE_H 30 #define PANVK_PRIVATE_H 31 32 #include <assert.h> 33 #include <pthread.h> 34 #include <stdbool.h> 35 #include <stdint.h> 36 #include <stdio.h> 37 #include <stdlib.h> 38 #include <string.h> 39 #ifdef HAVE_VALGRIND 40 #include <memcheck.h> 41 #include <valgrind.h> 42 #define VG(x) x 43 #else 44 #define VG(x) 45 #endif 46 47 #include "c11/threads.h" 48 #include "compiler/shader_enums.h" 49 #include "util/list.h" 50 #include "util/macros.h" 51 #include "vk_alloc.h" 52 #include "vk_command_buffer.h" 53 #include "vk_device.h" 54 #include "vk_instance.h" 55 #include "vk_log.h" 56 #include "vk_object.h" 57 #include "vk_physical_device.h" 58 #include "vk_queue.h" 59 #include "wsi_common.h" 60 61 #include "drm-uapi/panfrost_drm.h" 62 63 #include "pan_blend.h" 64 #include "pan_cs.h" 65 #include "pan_device.h" 66 #include "panvk_mempool.h" 67 #include "pan_texture.h" 68 #include "pan_scoreboard.h" 69 #include "vk_extensions.h" 70 #include "panvk_varyings.h" 71 72 /* Pre-declarations needed for WSI entrypoints */ 73 struct wl_surface; 74 struct wl_display; 75 typedef struct xcb_connection_t xcb_connection_t; 76 typedef uint32_t xcb_visualid_t; 77 typedef uint32_t xcb_window_t; 78 79 #include <vulkan/vk_android_native_buffer.h> 80 #include <vulkan/vk_icd.h> 81 #include <vulkan/vulkan.h> 82 83 #include "panvk_entrypoints.h" 84 85 #define MAX_BIND_POINTS 2 /* compute + graphics */ 86 #define MAX_VBS 16 87 #define MAX_VERTEX_ATTRIBS 16 88 #define MAX_RTS 8 89 #define MAX_VSC_PIPES 32 90 #define MAX_VIEWPORTS 1 91 #define MAX_SCISSORS 16 92 #define MAX_DISCARD_RECTANGLES 4 93 #define MAX_PUSH_CONSTANTS_SIZE 128 94 #define MAX_PUSH_DESCRIPTORS 32 95 #define MAX_DYNAMIC_UNIFORM_BUFFERS 16 96 #define MAX_DYNAMIC_STORAGE_BUFFERS 8 97 #define MAX_DYNAMIC_BUFFERS \ 98 (MAX_DYNAMIC_UNIFORM_BUFFERS + MAX_DYNAMIC_STORAGE_BUFFERS) 99 #define MAX_SAMPLES_LOG2 4 100 #define NUM_META_FS_KEYS 13 101 #define PANVK_MAX_DRM_DEVICES 1 102 #define MAX_VIEWS 8 103 104 #define NUM_DEPTH_CLEAR_PIPELINES 3 105 106 #define panvk_printflike(a, b) __attribute__((__format__(__printf__, a, b))) 107 108 void 109 panvk_logi(const char *format, ...) panvk_printflike(1, 2); 110 void 111 panvk_logi_v(const char *format, va_list va); 112 113 #define panvk_stub() assert(!"stub") 114 115 #define PANVK_META_COPY_BUF2IMG_NUM_FORMATS 12 116 #define PANVK_META_COPY_IMG2BUF_NUM_FORMATS 12 117 #define PANVK_META_COPY_IMG2IMG_NUM_FORMATS 14 118 #define PANVK_META_COPY_NUM_TEX_TYPES 5 119 #define PANVK_META_COPY_BUF2BUF_NUM_BLKSIZES 5 120 121 static inline unsigned 122 panvk_meta_copy_tex_type(unsigned dim, bool isarray) 123 { 124 assert(dim > 0 && dim <= 3); 125 assert(dim < 3 || !isarray); 126 return (((dim - 1) << 1) | (isarray ? 1 : 0)); 127 } 128 129 struct panvk_meta { 130 struct panvk_pool bin_pool; 131 struct panvk_pool desc_pool; 132 133 /* Access to the blitter pools are protected by the blitter 134 * shader/rsd locks. They can't be merged with other binary/desc 135 * pools unless we patch pan_blitter.c to external pool locks. 136 */ 137 struct { 138 struct panvk_pool bin_pool; 139 struct panvk_pool desc_pool; 140 } blitter; 141 142 struct { 143 struct { 144 mali_ptr shader; 145 struct pan_shader_info shader_info; 146 } color[MAX_RTS][3], zs, z, s; /* 3 base types */ 147 } clear_attachment; 148 149 struct { 150 struct { 151 mali_ptr rsd; 152 struct panfrost_ubo_push pushmap; 153 } buf2img[PANVK_META_COPY_BUF2IMG_NUM_FORMATS]; 154 struct { 155 mali_ptr rsd; 156 struct panfrost_ubo_push pushmap; 157 } img2buf[PANVK_META_COPY_NUM_TEX_TYPES][PANVK_META_COPY_IMG2BUF_NUM_FORMATS]; 158 struct { 159 mali_ptr rsd; 160 } img2img[2][PANVK_META_COPY_NUM_TEX_TYPES][PANVK_META_COPY_IMG2IMG_NUM_FORMATS]; 161 struct { 162 mali_ptr rsd; 163 struct panfrost_ubo_push pushmap; 164 } buf2buf[PANVK_META_COPY_BUF2BUF_NUM_BLKSIZES]; 165 struct { 166 mali_ptr rsd; 167 struct panfrost_ubo_push pushmap; 168 } fillbuf; 169 } copy; 170 }; 171 172 struct panvk_physical_device { 173 struct vk_physical_device vk; 174 175 /* The API agnostic device object. */ 176 struct panfrost_device pdev; 177 178 struct panvk_instance *instance; 179 180 char path[20]; 181 char name[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE]; 182 uint8_t driver_uuid[VK_UUID_SIZE]; 183 uint8_t device_uuid[VK_UUID_SIZE]; 184 uint8_t cache_uuid[VK_UUID_SIZE]; 185 186 struct wsi_device wsi_device; 187 struct panvk_meta meta; 188 189 int master_fd; 190 }; 191 192 enum panvk_debug_flags { 193 PANVK_DEBUG_STARTUP = 1 << 0, 194 PANVK_DEBUG_NIR = 1 << 1, 195 PANVK_DEBUG_TRACE = 1 << 2, 196 PANVK_DEBUG_SYNC = 1 << 3, 197 PANVK_DEBUG_AFBC = 1 << 4, 198 PANVK_DEBUG_LINEAR = 1 << 5, 199 }; 200 201 struct panvk_instance { 202 struct vk_instance vk; 203 204 uint32_t api_version; 205 int physical_device_count; 206 struct panvk_physical_device physical_devices[PANVK_MAX_DRM_DEVICES]; 207 208 enum panvk_debug_flags debug_flags; 209 }; 210 211 VkResult 212 panvk_wsi_init(struct panvk_physical_device *physical_device); 213 void 214 panvk_wsi_finish(struct panvk_physical_device *physical_device); 215 216 bool 217 panvk_instance_extension_supported(const char *name); 218 uint32_t 219 panvk_physical_device_api_version(struct panvk_physical_device *dev); 220 bool 221 panvk_physical_device_extension_supported(struct panvk_physical_device *dev, 222 const char *name); 223 224 struct panvk_pipeline_cache { 225 struct vk_object_base base; 226 VkAllocationCallbacks alloc; 227 }; 228 229 /* queue types */ 230 #define PANVK_QUEUE_GENERAL 0 231 232 #define PANVK_MAX_QUEUE_FAMILIES 1 233 234 struct panvk_queue { 235 struct vk_queue vk; 236 struct panvk_device *device; 237 uint32_t sync; 238 }; 239 240 struct panvk_device { 241 struct vk_device vk; 242 243 struct panvk_instance *instance; 244 245 struct panvk_queue *queues[PANVK_MAX_QUEUE_FAMILIES]; 246 int queue_count[PANVK_MAX_QUEUE_FAMILIES]; 247 248 struct panvk_physical_device *physical_device; 249 int _lost; 250 }; 251 252 VkResult _panvk_device_set_lost(struct panvk_device *device, 253 const char *file, int line, 254 const char *msg, ...) PRINTFLIKE(4, 5); 255 #define panvk_device_set_lost(dev, ...) \ 256 _panvk_device_set_lost(dev, __FILE__, __LINE__, __VA_ARGS__) 257 258 static inline bool 259 panvk_device_is_lost(struct panvk_device *device) 260 { 261 return unlikely(p_atomic_read(&device->_lost)); 262 } 263 264 #define TILER_DESC_WORDS 56 265 266 struct panvk_batch { 267 struct list_head node; 268 struct util_dynarray jobs; 269 struct util_dynarray event_ops; 270 struct pan_scoreboard scoreboard; 271 struct { 272 const struct panvk_framebuffer *info; 273 struct panfrost_ptr desc; 274 } fb; 275 struct { 276 struct panfrost_bo *src, *dst; 277 } blit; 278 struct panfrost_ptr tls; 279 mali_ptr fragment_job; 280 struct { 281 struct pan_tiler_context ctx; 282 struct panfrost_ptr descs; 283 uint32_t templ[TILER_DESC_WORDS]; 284 } tiler; 285 struct pan_tls_info tlsinfo; 286 unsigned wls_total_size; 287 bool issued; 288 }; 289 290 struct panvk_syncobj { 291 uint32_t permanent, temporary; 292 }; 293 294 enum panvk_event_op_type { 295 PANVK_EVENT_OP_SET, 296 PANVK_EVENT_OP_RESET, 297 PANVK_EVENT_OP_WAIT, 298 }; 299 300 struct panvk_event_op { 301 enum panvk_event_op_type type; 302 struct panvk_event *event; 303 }; 304 305 struct panvk_fence { 306 struct vk_object_base base; 307 struct panvk_syncobj syncobj; 308 }; 309 310 struct panvk_semaphore { 311 struct vk_object_base base; 312 struct panvk_syncobj syncobj; 313 }; 314 315 int 316 panvk_signal_syncobjs(struct panvk_device *device, 317 struct panvk_syncobj *syncobj1, 318 struct panvk_syncobj *syncobj2); 319 320 int 321 panvk_syncobj_to_fd(struct panvk_device *device, 322 struct panvk_syncobj *sync); 323 324 struct panvk_device_memory { 325 struct vk_object_base base; 326 struct panfrost_bo *bo; 327 }; 328 329 struct panvk_descriptor { 330 union { 331 struct { 332 VkImageLayout layout; 333 struct panvk_image_view *view; 334 struct panvk_sampler *sampler; 335 } image; 336 337 struct { 338 struct panvk_buffer *buffer; 339 uint64_t offset; 340 uint64_t range; 341 } buffer_info; 342 343 struct panvk_buffer_view *buffer_view; 344 }; 345 }; 346 347 struct panvk_descriptor_set { 348 struct vk_object_base base; 349 struct panvk_descriptor_pool *pool; 350 const struct panvk_descriptor_set_layout *layout; 351 struct panvk_descriptor *descs; 352 void *ubos; 353 void *samplers; 354 void *textures; 355 }; 356 357 #define MAX_SETS 4 358 359 struct panvk_descriptor_set_binding_layout { 360 VkDescriptorType type; 361 362 /* Number of array elements in this binding */ 363 unsigned array_size; 364 365 /* Indices in the desc arrays */ 366 unsigned desc_idx; 367 union { 368 struct { 369 unsigned sampler_idx; 370 unsigned tex_idx; 371 }; 372 struct { 373 union { 374 unsigned ssbo_idx; 375 unsigned ubo_idx; 376 }; 377 unsigned dynoffset_idx; 378 }; 379 }; 380 381 /* Shader stages affected by this set+binding */ 382 uint16_t shader_stages; 383 384 struct panvk_sampler **immutable_samplers; 385 }; 386 387 struct panvk_descriptor_set_layout { 388 struct vk_object_base base; 389 390 /* The create flags for this descriptor set layout */ 391 VkDescriptorSetLayoutCreateFlags flags; 392 393 /* Shader stages affected by this descriptor set */ 394 uint16_t shader_stages; 395 396 unsigned num_descs; 397 unsigned num_samplers; 398 unsigned num_textures; 399 unsigned num_ubos; 400 unsigned num_ssbos; 401 unsigned num_dynoffsets; 402 403 /* Number of bindings in this descriptor set */ 404 uint32_t binding_count; 405 406 /* Bindings in this descriptor set */ 407 struct panvk_descriptor_set_binding_layout bindings[0]; 408 }; 409 410 struct panvk_pipeline_layout { 411 struct vk_object_base base; 412 unsigned char sha1[20]; 413 414 unsigned num_samplers; 415 unsigned num_textures; 416 unsigned num_ubos; 417 unsigned num_ssbos; 418 unsigned num_dynoffsets; 419 uint32_t num_sets; 420 421 struct { 422 struct panvk_descriptor_set_layout *layout; 423 unsigned sampler_offset; 424 unsigned tex_offset; 425 unsigned ubo_offset; 426 unsigned ssbo_offset; 427 unsigned dynoffset_offset; 428 } sets[MAX_SETS]; 429 }; 430 431 struct panvk_desc_pool_counters { 432 unsigned samplers; 433 unsigned combined_image_samplers; 434 unsigned sampled_images; 435 unsigned storage_images; 436 unsigned uniform_texel_bufs; 437 unsigned storage_texel_bufs; 438 unsigned input_attachments; 439 unsigned uniform_bufs; 440 unsigned storage_bufs; 441 unsigned uniform_dyn_bufs; 442 unsigned storage_dyn_bufs; 443 unsigned sets; 444 }; 445 446 struct panvk_descriptor_pool { 447 struct vk_object_base base; 448 struct panvk_desc_pool_counters max; 449 struct panvk_desc_pool_counters cur; 450 struct panvk_descriptor_set *sets; 451 }; 452 453 struct panvk_buffer { 454 struct vk_object_base base; 455 VkDeviceSize size; 456 457 VkBufferUsageFlags usage; 458 VkBufferCreateFlags flags; 459 460 struct panfrost_bo *bo; 461 VkDeviceSize bo_offset; 462 }; 463 464 enum panvk_dynamic_state_bits { 465 PANVK_DYNAMIC_VIEWPORT = 1 << 0, 466 PANVK_DYNAMIC_SCISSOR = 1 << 1, 467 PANVK_DYNAMIC_LINE_WIDTH = 1 << 2, 468 PANVK_DYNAMIC_DEPTH_BIAS = 1 << 3, 469 PANVK_DYNAMIC_BLEND_CONSTANTS = 1 << 4, 470 PANVK_DYNAMIC_DEPTH_BOUNDS = 1 << 5, 471 PANVK_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 6, 472 PANVK_DYNAMIC_STENCIL_WRITE_MASK = 1 << 7, 473 PANVK_DYNAMIC_STENCIL_REFERENCE = 1 << 8, 474 PANVK_DYNAMIC_DISCARD_RECTANGLE = 1 << 9, 475 PANVK_DYNAMIC_ALL = (1 << 10) - 1, 476 }; 477 478 struct panvk_descriptor_state { 479 struct { 480 const struct panvk_descriptor_set *set; 481 struct panfrost_ptr dynoffsets; 482 } sets[MAX_SETS]; 483 mali_ptr sysvals[MESA_SHADER_STAGES]; 484 mali_ptr ubos; 485 mali_ptr textures; 486 mali_ptr samplers; 487 }; 488 489 #define INVOCATION_DESC_WORDS 2 490 491 struct panvk_draw_info { 492 unsigned first_index; 493 unsigned index_count; 494 unsigned first_vertex; 495 unsigned vertex_count; 496 unsigned padded_vertex_count; 497 unsigned first_instance; 498 unsigned instance_count; 499 int vertex_offset; 500 unsigned offset_start; 501 uint32_t invocation[INVOCATION_DESC_WORDS]; 502 struct { 503 mali_ptr varyings; 504 mali_ptr attributes; 505 mali_ptr push_constants; 506 } stages[MESA_SHADER_STAGES]; 507 mali_ptr varying_bufs; 508 mali_ptr attribute_bufs; 509 mali_ptr textures; 510 mali_ptr samplers; 511 mali_ptr ubos; 512 mali_ptr position; 513 union { 514 mali_ptr psiz; 515 float line_width; 516 }; 517 mali_ptr tls; 518 mali_ptr fb; 519 const struct pan_tiler_context *tiler_ctx; 520 mali_ptr fs_rsd; 521 mali_ptr viewport; 522 struct { 523 struct panfrost_ptr vertex; 524 struct panfrost_ptr tiler; 525 } jobs; 526 }; 527 528 struct panvk_attrib_info { 529 unsigned buf; 530 unsigned offset; 531 enum pipe_format format; 532 }; 533 534 struct panvk_attrib_buf_info { 535 bool special; 536 union { 537 struct { 538 unsigned stride; 539 bool per_instance; 540 }; 541 unsigned special_id; 542 }; 543 }; 544 545 struct panvk_attribs_info { 546 struct panvk_attrib_info attrib[PAN_MAX_ATTRIBUTE]; 547 unsigned attrib_count; 548 struct panvk_attrib_buf_info buf[PAN_MAX_ATTRIBUTE]; 549 unsigned buf_count; 550 }; 551 552 struct panvk_attrib_buf { 553 mali_ptr address; 554 unsigned size; 555 }; 556 557 struct panvk_cmd_state { 558 uint32_t dirty; 559 560 struct panvk_varyings_info varyings; 561 mali_ptr fs_rsd; 562 563 struct { 564 float constants[4]; 565 } blend; 566 567 struct { 568 struct { 569 float constant_factor; 570 float clamp; 571 float slope_factor; 572 } depth_bias; 573 float line_width; 574 } rast; 575 576 struct { 577 struct panvk_attrib_buf bufs[MAX_VBS]; 578 unsigned count; 579 mali_ptr attribs; 580 mali_ptr attrib_bufs; 581 } vb; 582 583 /* Index buffer */ 584 struct { 585 struct panvk_buffer *buffer; 586 uint64_t offset; 587 uint32_t type; 588 uint32_t max_index_count; 589 uint8_t index_size; 590 uint64_t index_va; 591 } ib; 592 593 struct { 594 struct { 595 uint8_t compare_mask; 596 uint8_t write_mask; 597 uint8_t ref; 598 } s_front, s_back; 599 } zs; 600 601 struct { 602 struct pan_fb_info info; 603 bool crc_valid[MAX_RTS]; 604 } fb; 605 606 const struct panvk_render_pass *pass; 607 const struct panvk_subpass *subpass; 608 const struct panvk_framebuffer *framebuffer; 609 VkRect2D render_area; 610 611 struct panvk_clear_value *clear; 612 613 mali_ptr vpd; 614 VkViewport viewport; 615 VkRect2D scissor; 616 617 struct panvk_batch *batch; 618 }; 619 620 struct panvk_cmd_pool { 621 struct vk_object_base base; 622 VkAllocationCallbacks alloc; 623 struct list_head active_cmd_buffers; 624 struct list_head free_cmd_buffers; 625 uint32_t queue_family_index; 626 struct panvk_bo_pool desc_bo_pool; 627 struct panvk_bo_pool varying_bo_pool; 628 struct panvk_bo_pool tls_bo_pool; 629 }; 630 631 enum panvk_cmd_buffer_status { 632 PANVK_CMD_BUFFER_STATUS_INVALID, 633 PANVK_CMD_BUFFER_STATUS_INITIAL, 634 PANVK_CMD_BUFFER_STATUS_RECORDING, 635 PANVK_CMD_BUFFER_STATUS_EXECUTABLE, 636 PANVK_CMD_BUFFER_STATUS_PENDING, 637 }; 638 639 struct panvk_cmd_bind_point_state { 640 struct panvk_descriptor_state desc_state; 641 const struct panvk_pipeline *pipeline; 642 }; 643 644 struct panvk_cmd_buffer { 645 struct vk_command_buffer vk; 646 647 struct panvk_device *device; 648 649 struct panvk_cmd_pool *pool; 650 struct list_head pool_link; 651 struct panvk_pool desc_pool; 652 struct panvk_pool varying_pool; 653 struct panvk_pool tls_pool; 654 struct list_head batches; 655 656 VkCommandBufferUsageFlags usage_flags; 657 VkCommandBufferLevel level; 658 enum panvk_cmd_buffer_status status; 659 660 struct panvk_cmd_state state; 661 uint32_t queue_family_index; 662 663 uint8_t push_constants[MAX_PUSH_CONSTANTS_SIZE]; 664 VkShaderStageFlags push_constant_stages; 665 struct panvk_descriptor_set meta_push_descriptors; 666 667 struct panvk_cmd_bind_point_state bind_points[MAX_BIND_POINTS]; 668 669 VkResult record_result; 670 }; 671 672 #define panvk_cmd_get_bind_point_state(cmdbuf, bindpoint) \ 673 &(cmdbuf)->bind_points[VK_PIPELINE_BIND_POINT_ ## bindpoint] 674 675 #define panvk_cmd_get_pipeline(cmdbuf, bindpoint) \ 676 (cmdbuf)->bind_points[VK_PIPELINE_BIND_POINT_ ## bindpoint].pipeline 677 678 #define panvk_cmd_get_desc_state(cmdbuf, bindpoint) \ 679 &(cmdbuf)->bind_points[VK_PIPELINE_BIND_POINT_ ## bindpoint].desc_state 680 681 struct panvk_batch * 682 panvk_cmd_open_batch(struct panvk_cmd_buffer *cmdbuf); 683 684 void 685 panvk_cmd_fb_info_set_subpass(struct panvk_cmd_buffer *cmdbuf); 686 687 void 688 panvk_cmd_fb_info_init(struct panvk_cmd_buffer *cmdbuf); 689 690 void 691 panvk_cmd_preload_fb_after_batch_split(struct panvk_cmd_buffer *cmdbuf); 692 693 void 694 panvk_pack_color(struct panvk_clear_value *out, 695 const VkClearColorValue *in, 696 enum pipe_format format); 697 698 struct panvk_event { 699 struct vk_object_base base; 700 uint32_t syncobj; 701 }; 702 703 struct panvk_shader_module { 704 struct vk_object_base base; 705 unsigned char sha1[20]; 706 707 uint32_t code_size; 708 const uint32_t *code[0]; 709 }; 710 711 struct panvk_shader { 712 struct pan_shader_info info; 713 struct util_dynarray binary; 714 unsigned sysval_ubo; 715 }; 716 717 struct panvk_shader * 718 panvk_shader_create(struct panvk_device *dev, 719 gl_shader_stage stage, 720 const VkPipelineShaderStageCreateInfo *stage_info, 721 const struct panvk_pipeline_layout *layout, 722 unsigned sysval_ubo, 723 struct pan_blend_state *blend_state, 724 bool static_blend_constants, 725 const VkAllocationCallbacks *alloc); 726 727 void 728 panvk_shader_destroy(struct panvk_device *dev, 729 struct panvk_shader *shader, 730 const VkAllocationCallbacks *alloc); 731 732 union panvk_sysval_data { 733 float f32[4]; 734 double f64[2]; 735 uint32_t u32[4]; 736 uint64_t u64[2]; 737 }; 738 739 #define RSD_WORDS 16 740 #define BLEND_DESC_WORDS 4 741 742 struct panvk_pipeline { 743 struct vk_object_base base; 744 745 struct panvk_varyings_info varyings; 746 struct panvk_attribs_info attribs; 747 748 const struct panvk_pipeline_layout *layout; 749 750 unsigned active_stages; 751 752 uint32_t dynamic_state_mask; 753 754 struct panfrost_bo *binary_bo; 755 struct panfrost_bo *state_bo; 756 757 mali_ptr vpd; 758 mali_ptr rsds[MESA_SHADER_STAGES]; 759 760 unsigned num_ubos; 761 unsigned num_sysvals; 762 763 struct { 764 unsigned ubo_idx; 765 mali_ptr ubo; 766 struct panfrost_sysvals ids; 767 uint32_t dirty_mask; 768 } sysvals[MESA_SHADER_STAGES]; 769 770 unsigned tls_size; 771 unsigned wls_size; 772 773 struct { 774 mali_ptr address; 775 struct pan_shader_info info; 776 uint32_t rsd_template[RSD_WORDS]; 777 bool required; 778 bool dynamic_rsd; 779 uint8_t rt_mask; 780 } fs; 781 782 struct { 783 unsigned topology; 784 bool writes_point_size; 785 bool primitive_restart; 786 } ia; 787 788 struct { 789 bool clamp_depth; 790 float line_width; 791 struct { 792 bool enable; 793 float constant_factor; 794 float clamp; 795 float slope_factor; 796 } depth_bias; 797 bool front_ccw; 798 bool cull_front_face; 799 bool cull_back_face; 800 } rast; 801 802 struct { 803 bool z_test; 804 bool z_write; 805 unsigned z_compare_func; 806 bool s_test; 807 struct { 808 unsigned fail_op; 809 unsigned pass_op; 810 unsigned z_fail_op; 811 unsigned compare_func; 812 uint8_t compare_mask; 813 uint8_t write_mask; 814 uint8_t ref; 815 } s_front, s_back; 816 } zs; 817 818 struct { 819 uint8_t rast_samples; 820 uint8_t min_samples; 821 uint16_t sample_mask; 822 bool alpha_to_coverage; 823 bool alpha_to_one; 824 } ms; 825 826 struct { 827 struct pan_blend_state state; 828 uint32_t bd_template[8][BLEND_DESC_WORDS]; 829 struct { 830 uint8_t index; 831 uint16_t bifrost_factor; 832 } constant[8]; 833 bool reads_dest; 834 } blend; 835 836 VkViewport viewport; 837 VkRect2D scissor; 838 }; 839 840 struct panvk_image_level { 841 VkDeviceSize offset; 842 VkDeviceSize size; 843 uint32_t pitch; 844 }; 845 846 struct panvk_slice_layout { 847 unsigned width; 848 unsigned height; 849 unsigned depth; 850 unsigned offset; 851 unsigned line_stride; 852 unsigned size; 853 854 /* If there is a header preceding each slice, how big is 855 * that header? Used for AFBC. 856 */ 857 unsigned afbc_header_size; 858 859 /* If checksumming is enabled following the slice, what 860 * is its offset/stride? 861 */ 862 struct { 863 unsigned offset; 864 unsigned stride; 865 unsigned size; 866 } checksum; 867 }; 868 869 #define PANVK_MAX_MIP_LEVELS 13 870 871 struct panvk_plane_layout { 872 struct panvk_slice_layout slices[PANVK_MAX_MIP_LEVELS]; 873 unsigned offset; 874 unsigned array_stride; 875 unsigned size; 876 }; 877 878 struct panvk_plane_memory { 879 const struct panfrost_bo *bo; 880 unsigned offset; 881 }; 882 883 #define PANVK_MAX_PLANES 1 884 885 struct panvk_image { 886 struct vk_object_base base; 887 struct pan_image pimage; 888 VkImageType type; 889 890 /* The original VkFormat provided by the client. This may not match any 891 * of the actual surface formats. 892 */ 893 VkFormat vk_format; 894 VkImageAspectFlags aspects; 895 VkImageUsageFlags usage; /**< Superset of VkImageCreateInfo::usage. */ 896 VkImageTiling tiling; /** VkImageCreateInfo::tiling */ 897 VkImageCreateFlags flags; /** VkImageCreateInfo::flags */ 898 VkExtent3D extent; 899 900 unsigned queue_family_mask; 901 bool exclusive; 902 bool shareable; 903 }; 904 905 unsigned 906 panvk_image_get_plane_size(const struct panvk_image *image, unsigned plane); 907 908 unsigned 909 panvk_image_get_total_size(const struct panvk_image *image); 910 911 #define TEXTURE_DESC_WORDS 8 912 913 struct panvk_image_view { 914 struct vk_object_base base; 915 struct pan_image_view pview; 916 917 VkFormat vk_format; 918 struct panfrost_bo *bo; 919 struct { 920 uint32_t tex[TEXTURE_DESC_WORDS]; 921 } descs; 922 }; 923 924 #define SAMPLER_DESC_WORDS 8 925 926 struct panvk_sampler { 927 struct vk_object_base base; 928 uint32_t desc[SAMPLER_DESC_WORDS]; 929 }; 930 931 struct panvk_buffer_view { 932 struct vk_object_base base; 933 }; 934 935 struct panvk_attachment_info { 936 struct panvk_image_view *iview; 937 }; 938 939 struct panvk_framebuffer { 940 struct vk_object_base base; 941 942 uint32_t width; 943 uint32_t height; 944 uint32_t layers; 945 946 uint32_t attachment_count; 947 struct panvk_attachment_info attachments[0]; 948 }; 949 950 struct panvk_clear_value { 951 union { 952 uint32_t color[4]; 953 struct { 954 float depth; 955 uint8_t stencil; 956 }; 957 }; 958 }; 959 960 struct panvk_subpass_attachment { 961 uint32_t idx; 962 VkImageLayout layout; 963 bool clear; 964 bool preload; 965 }; 966 967 struct panvk_subpass { 968 uint32_t input_count; 969 uint32_t color_count; 970 struct panvk_subpass_attachment *input_attachments; 971 uint8_t active_color_attachments; 972 struct panvk_subpass_attachment *color_attachments; 973 struct panvk_subpass_attachment *resolve_attachments; 974 struct panvk_subpass_attachment zs_attachment; 975 976 uint32_t view_mask; 977 }; 978 979 struct panvk_render_pass_attachment { 980 VkAttachmentDescriptionFlags flags; 981 enum pipe_format format; 982 unsigned samples; 983 VkAttachmentLoadOp load_op; 984 VkAttachmentStoreOp store_op; 985 VkAttachmentLoadOp stencil_load_op; 986 VkAttachmentStoreOp stencil_store_op; 987 VkImageLayout initial_layout; 988 VkImageLayout final_layout; 989 unsigned view_mask; 990 unsigned first_used_in_subpass; 991 }; 992 993 struct panvk_render_pass { 994 struct vk_object_base base; 995 996 uint32_t attachment_count; 997 uint32_t subpass_count; 998 struct panvk_subpass_attachment *subpass_attachments; 999 struct panvk_render_pass_attachment *attachments; 1000 struct panvk_subpass subpasses[0]; 1001 }; 1002 1003 VK_DEFINE_HANDLE_CASTS(panvk_cmd_buffer, vk.base, VkCommandBuffer, VK_OBJECT_TYPE_COMMAND_BUFFER) 1004 VK_DEFINE_HANDLE_CASTS(panvk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE) 1005 VK_DEFINE_HANDLE_CASTS(panvk_instance, vk.base, VkInstance, VK_OBJECT_TYPE_INSTANCE) 1006 VK_DEFINE_HANDLE_CASTS(panvk_physical_device, vk.base, VkPhysicalDevice, VK_OBJECT_TYPE_PHYSICAL_DEVICE) 1007 VK_DEFINE_HANDLE_CASTS(panvk_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE) 1008 1009 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_cmd_pool, base, VkCommandPool, VK_OBJECT_TYPE_COMMAND_POOL) 1010 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_buffer, base, VkBuffer, VK_OBJECT_TYPE_BUFFER) 1011 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_buffer_view, base, VkBufferView, VK_OBJECT_TYPE_BUFFER_VIEW) 1012 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_pool, base, VkDescriptorPool, VK_OBJECT_TYPE_DESCRIPTOR_POOL) 1013 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_set, base, VkDescriptorSet, VK_OBJECT_TYPE_DESCRIPTOR_SET) 1014 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_set_layout, base, 1015 VkDescriptorSetLayout, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT) 1016 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_device_memory, base, VkDeviceMemory, VK_OBJECT_TYPE_DEVICE_MEMORY) 1017 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_fence, base, VkFence, VK_OBJECT_TYPE_FENCE) 1018 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_event, base, VkEvent, VK_OBJECT_TYPE_EVENT) 1019 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_framebuffer, base, VkFramebuffer, VK_OBJECT_TYPE_FRAMEBUFFER) 1020 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_image, base, VkImage, VK_OBJECT_TYPE_IMAGE) 1021 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_image_view, base, VkImageView, VK_OBJECT_TYPE_IMAGE_VIEW); 1022 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline_cache, base, VkPipelineCache, VK_OBJECT_TYPE_PIPELINE_CACHE) 1023 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline, base, VkPipeline, VK_OBJECT_TYPE_PIPELINE) 1024 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline_layout, base, VkPipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT) 1025 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_render_pass, base, VkRenderPass, VK_OBJECT_TYPE_RENDER_PASS) 1026 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_sampler, base, VkSampler, VK_OBJECT_TYPE_SAMPLER) 1027 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_shader_module, base, VkShaderModule, VK_OBJECT_TYPE_SHADER_MODULE) 1028 VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_semaphore, base, VkSemaphore, VK_OBJECT_TYPE_SEMAPHORE) 1029 1030 #define panvk_arch_name(name, version) panvk_## version ## _ ## name 1031 1032 #define panvk_arch_dispatch(arch, name, ...) \ 1033 do { \ 1034 switch (arch) { \ 1035 case 5: panvk_arch_name(name, v5)(__VA_ARGS__); break; \ 1036 case 6: panvk_arch_name(name, v6)(__VA_ARGS__); break; \ 1037 case 7: panvk_arch_name(name, v7)(__VA_ARGS__); break; \ 1038 default: unreachable("Invalid arch"); \ 1039 } \ 1040 } while (0) 1041 1042 #ifdef PAN_ARCH 1043 #if PAN_ARCH == 5 1044 #define panvk_per_arch(name) panvk_arch_name(name, v5) 1045 #elif PAN_ARCH == 6 1046 #define panvk_per_arch(name) panvk_arch_name(name, v6) 1047 #elif PAN_ARCH == 7 1048 #define panvk_per_arch(name) panvk_arch_name(name, v7) 1049 #endif 1050 #include "panvk_vX_cmd_buffer.h" 1051 #include "panvk_vX_cs.h" 1052 #include "panvk_vX_meta.h" 1053 #else 1054 #define PAN_ARCH 5 1055 #define panvk_per_arch(name) panvk_arch_name(name, v5) 1056 #include "panvk_vX_cmd_buffer.h" 1057 #include "panvk_vX_cs.h" 1058 #include "panvk_vX_meta.h" 1059 #undef PAN_ARCH 1060 #undef panvk_per_arch 1061 #define PAN_ARCH 6 1062 #define panvk_per_arch(name) panvk_arch_name(name, v6) 1063 #include "panvk_vX_cmd_buffer.h" 1064 #include "panvk_vX_cs.h" 1065 #include "panvk_vX_meta.h" 1066 #undef PAN_ARCH 1067 #undef panvk_per_arch 1068 #define PAN_ARCH 7 1069 #define panvk_per_arch(name) panvk_arch_name(name, v7) 1070 #include "panvk_vX_cmd_buffer.h" 1071 #include "panvk_vX_cs.h" 1072 #include "panvk_vX_meta.h" 1073 #undef PAN_ARCH 1074 #undef panvk_per_arch 1075 #endif 1076 1077 #ifdef PAN_ARCH 1078 bool 1079 panvk_per_arch(blend_needs_lowering)(const struct panfrost_device *dev, 1080 const struct pan_blend_state *state, 1081 unsigned rt); 1082 1083 struct panvk_shader * 1084 panvk_per_arch(shader_create)(struct panvk_device *dev, 1085 gl_shader_stage stage, 1086 const VkPipelineShaderStageCreateInfo *stage_info, 1087 const struct panvk_pipeline_layout *layout, 1088 unsigned sysval_ubo, 1089 struct pan_blend_state *blend_state, 1090 bool static_blend_constants, 1091 const VkAllocationCallbacks *alloc); 1092 #endif 1093 1094 #endif /* PANVK_PRIVATE_H */ 1095