1/* 2 * Copyright © 2016 Red Hat. 3 * Copyright © 2016 Bas Nieuwenhuizen 4 * 5 * based in part on anv driver which is: 6 * Copyright © 2015 Intel Corporation 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a 9 * copy of this software and associated documentation files (the "Software"), 10 * to deal in the Software without restriction, including without limitation 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 * and/or sell copies of the Software, and to permit persons to whom the 13 * Software is furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the next 16 * paragraph) shall be included in all copies or substantial portions of the 17 * Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 * DEALINGS IN THE SOFTWARE. 26 */ 27 28#ifndef TU_PRIVATE_H 29#define TU_PRIVATE_H 30 31#include <assert.h> 32#include <pthread.h> 33#include <stdbool.h> 34#include <stdint.h> 35#include <stdio.h> 36#include <stdlib.h> 37#include <string.h> 38#ifdef HAVE_VALGRIND 39#include <memcheck.h> 40#include <valgrind.h> 41#define VG(x) x 42#else 43#define VG(x) 44#endif 45 46#include "c11/threads.h" 47#include "compiler/shader_enums.h" 48#include "main/macros.h" 49#include "util/list.h" 50#include "util/macros.h" 51#include "vk_alloc.h" 52#include "vk_debug_report.h" 53#include "wsi_common.h" 54 55#include "drm/msm_drm.h" 56#include "ir3/ir3_compiler.h" 57#include "ir3/ir3_shader.h" 58 59#include "adreno_common.xml.h" 60#include "adreno_pm4.xml.h" 61#include "a6xx.xml.h" 62 63#include "tu_descriptor_set.h" 64#include "tu_extensions.h" 65 66/* Pre-declarations needed for WSI entrypoints */ 67struct wl_surface; 68struct wl_display; 69typedef struct xcb_connection_t xcb_connection_t; 70typedef uint32_t xcb_visualid_t; 71typedef uint32_t xcb_window_t; 72 73#include <vulkan/vk_android_native_buffer.h> 74#include <vulkan/vk_icd.h> 75#include <vulkan/vulkan.h> 76#include <vulkan/vulkan_intel.h> 77 78#include "tu_entrypoints.h" 79 80#define MAX_VBS 32 81#define MAX_VERTEX_ATTRIBS 32 82#define MAX_RTS 8 83#define MAX_VSC_PIPES 32 84#define MAX_VIEWPORTS 1 85#define MAX_SCISSORS 16 86#define MAX_DISCARD_RECTANGLES 4 87#define MAX_PUSH_CONSTANTS_SIZE 128 88#define MAX_PUSH_DESCRIPTORS 32 89#define MAX_DYNAMIC_UNIFORM_BUFFERS 16 90#define MAX_DYNAMIC_STORAGE_BUFFERS 8 91#define MAX_DYNAMIC_BUFFERS \ 92 (MAX_DYNAMIC_UNIFORM_BUFFERS + MAX_DYNAMIC_STORAGE_BUFFERS) 93#define MAX_SAMPLES_LOG2 4 94#define NUM_META_FS_KEYS 13 95#define TU_MAX_DRM_DEVICES 8 96#define MAX_VIEWS 8 97 98#define NUM_DEPTH_CLEAR_PIPELINES 3 99 100/* 101 * This is the point we switch from using CP to compute shader 102 * for certain buffer operations. 103 */ 104#define TU_BUFFER_OPS_CS_THRESHOLD 4096 105 106enum tu_mem_heap 107{ 108 TU_MEM_HEAP_VRAM, 109 TU_MEM_HEAP_VRAM_CPU_ACCESS, 110 TU_MEM_HEAP_GTT, 111 TU_MEM_HEAP_COUNT 112}; 113 114enum tu_mem_type 115{ 116 TU_MEM_TYPE_VRAM, 117 TU_MEM_TYPE_GTT_WRITE_COMBINE, 118 TU_MEM_TYPE_VRAM_CPU_ACCESS, 119 TU_MEM_TYPE_GTT_CACHED, 120 TU_MEM_TYPE_COUNT 121}; 122 123#define tu_printflike(a, b) __attribute__((__format__(__printf__, a, b))) 124 125static inline uint32_t 126align_u32(uint32_t v, uint32_t a) 127{ 128 assert(a != 0 && a == (a & -a)); 129 return (v + a - 1) & ~(a - 1); 130} 131 132static inline uint32_t 133align_u32_npot(uint32_t v, uint32_t a) 134{ 135 return (v + a - 1) / a * a; 136} 137 138static inline uint64_t 139align_u64(uint64_t v, uint64_t a) 140{ 141 assert(a != 0 && a == (a & -a)); 142 return (v + a - 1) & ~(a - 1); 143} 144 145static inline int32_t 146align_i32(int32_t v, int32_t a) 147{ 148 assert(a != 0 && a == (a & -a)); 149 return (v + a - 1) & ~(a - 1); 150} 151 152/** Alignment must be a power of 2. */ 153static inline bool 154tu_is_aligned(uintmax_t n, uintmax_t a) 155{ 156 assert(a == (a & -a)); 157 return (n & (a - 1)) == 0; 158} 159 160static inline uint32_t 161round_up_u32(uint32_t v, uint32_t a) 162{ 163 return (v + a - 1) / a; 164} 165 166static inline uint64_t 167round_up_u64(uint64_t v, uint64_t a) 168{ 169 return (v + a - 1) / a; 170} 171 172static inline uint32_t 173tu_minify(uint32_t n, uint32_t levels) 174{ 175 if (unlikely(n == 0)) 176 return 0; 177 else 178 return MAX2(n >> levels, 1); 179} 180static inline float 181tu_clamp_f(float f, float min, float max) 182{ 183 assert(min < max); 184 185 if (f > max) 186 return max; 187 else if (f < min) 188 return min; 189 else 190 return f; 191} 192 193static inline bool 194tu_clear_mask(uint32_t *inout_mask, uint32_t clear_mask) 195{ 196 if (*inout_mask & clear_mask) { 197 *inout_mask &= ~clear_mask; 198 return true; 199 } else { 200 return false; 201 } 202} 203 204#define for_each_bit(b, dword) \ 205 for (uint32_t __dword = (dword); \ 206 (b) = __builtin_ffs(__dword) - 1, __dword; __dword &= ~(1 << (b))) 207 208#define typed_memcpy(dest, src, count) \ 209 ({ \ 210 STATIC_ASSERT(sizeof(*src) == sizeof(*dest)); \ 211 memcpy((dest), (src), (count) * sizeof(*(src))); \ 212 }) 213 214/* Whenever we generate an error, pass it through this function. Useful for 215 * debugging, where we can break on it. Only call at error site, not when 216 * propagating errors. Might be useful to plug in a stack trace here. 217 */ 218 219struct tu_instance; 220 221VkResult 222__vk_errorf(struct tu_instance *instance, 223 VkResult error, 224 const char *file, 225 int line, 226 const char *format, 227 ...); 228 229#define vk_error(instance, error) \ 230 __vk_errorf(instance, error, __FILE__, __LINE__, NULL); 231#define vk_errorf(instance, error, format, ...) \ 232 __vk_errorf(instance, error, __FILE__, __LINE__, format, ##__VA_ARGS__); 233 234void 235__tu_finishme(const char *file, int line, const char *format, ...) 236 tu_printflike(3, 4); 237void 238tu_loge(const char *format, ...) tu_printflike(1, 2); 239void 240tu_loge_v(const char *format, va_list va); 241void 242tu_logi(const char *format, ...) tu_printflike(1, 2); 243void 244tu_logi_v(const char *format, va_list va); 245 246/** 247 * Print a FINISHME message, including its source location. 248 */ 249#define tu_finishme(format, ...) \ 250 do { \ 251 static bool reported = false; \ 252 if (!reported) { \ 253 __tu_finishme(__FILE__, __LINE__, format, ##__VA_ARGS__); \ 254 reported = true; \ 255 } \ 256 } while (0) 257 258/* A non-fatal assert. Useful for debugging. */ 259#ifdef DEBUG 260#define tu_assert(x) \ 261 ({ \ 262 if (unlikely(!(x))) \ 263 fprintf(stderr, "%s:%d ASSERT: %s\n", __FILE__, __LINE__, #x); \ 264 }) 265#else 266#define tu_assert(x) 267#endif 268 269/* Suppress -Wunused in stub functions */ 270#define tu_use_args(...) __tu_use_args(0, ##__VA_ARGS__) 271static inline void 272__tu_use_args(int ignore, ...) 273{ 274} 275 276#define tu_stub() \ 277 do { \ 278 tu_finishme("stub %s", __func__); \ 279 } while (0) 280 281void * 282tu_lookup_entrypoint_unchecked(const char *name); 283void * 284tu_lookup_entrypoint_checked( 285 const char *name, 286 uint32_t core_version, 287 const struct tu_instance_extension_table *instance, 288 const struct tu_device_extension_table *device); 289 290struct tu_physical_device 291{ 292 VK_LOADER_DATA _loader_data; 293 294 struct tu_instance *instance; 295 296 char path[20]; 297 char name[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE]; 298 uint8_t driver_uuid[VK_UUID_SIZE]; 299 uint8_t device_uuid[VK_UUID_SIZE]; 300 uint8_t cache_uuid[VK_UUID_SIZE]; 301 302 struct wsi_device wsi_device; 303 304 int local_fd; 305 int master_fd; 306 307 unsigned gpu_id; 308 uint32_t gmem_size; 309 uint32_t tile_align_w; 310 uint32_t tile_align_h; 311 312 /* This is the drivers on-disk cache used as a fallback as opposed to 313 * the pipeline cache defined by apps. 314 */ 315 struct disk_cache *disk_cache; 316 317 struct tu_device_extension_table supported_extensions; 318}; 319 320enum tu_debug_flags 321{ 322 TU_DEBUG_STARTUP = 1 << 0, 323 TU_DEBUG_NIR = 1 << 1, 324 TU_DEBUG_IR3 = 1 << 2, 325}; 326 327struct tu_instance 328{ 329 VK_LOADER_DATA _loader_data; 330 331 VkAllocationCallbacks alloc; 332 333 uint32_t api_version; 334 int physical_device_count; 335 struct tu_physical_device physical_devices[TU_MAX_DRM_DEVICES]; 336 337 enum tu_debug_flags debug_flags; 338 339 struct vk_debug_report_instance debug_report_callbacks; 340 341 struct tu_instance_extension_table enabled_extensions; 342}; 343 344VkResult 345tu_wsi_init(struct tu_physical_device *physical_device); 346void 347tu_wsi_finish(struct tu_physical_device *physical_device); 348 349bool 350tu_instance_extension_supported(const char *name); 351uint32_t 352tu_physical_device_api_version(struct tu_physical_device *dev); 353bool 354tu_physical_device_extension_supported(struct tu_physical_device *dev, 355 const char *name); 356 357struct cache_entry; 358 359struct tu_pipeline_cache 360{ 361 struct tu_device *device; 362 pthread_mutex_t mutex; 363 364 uint32_t total_size; 365 uint32_t table_size; 366 uint32_t kernel_count; 367 struct cache_entry **hash_table; 368 bool modified; 369 370 VkAllocationCallbacks alloc; 371}; 372 373struct tu_pipeline_key 374{ 375}; 376 377void 378tu_pipeline_cache_init(struct tu_pipeline_cache *cache, 379 struct tu_device *device); 380void 381tu_pipeline_cache_finish(struct tu_pipeline_cache *cache); 382void 383tu_pipeline_cache_load(struct tu_pipeline_cache *cache, 384 const void *data, 385 size_t size); 386 387struct tu_shader_variant; 388 389bool 390tu_create_shader_variants_from_pipeline_cache( 391 struct tu_device *device, 392 struct tu_pipeline_cache *cache, 393 const unsigned char *sha1, 394 struct tu_shader_variant **variants); 395 396void 397tu_pipeline_cache_insert_shaders(struct tu_device *device, 398 struct tu_pipeline_cache *cache, 399 const unsigned char *sha1, 400 struct tu_shader_variant **variants, 401 const void *const *codes, 402 const unsigned *code_sizes); 403 404struct tu_meta_state 405{ 406 VkAllocationCallbacks alloc; 407 408 struct tu_pipeline_cache cache; 409}; 410 411/* queue types */ 412#define TU_QUEUE_GENERAL 0 413 414#define TU_MAX_QUEUE_FAMILIES 1 415 416struct tu_fence 417{ 418 bool signaled; 419 int fd; 420}; 421 422void 423tu_fence_init(struct tu_fence *fence, bool signaled); 424void 425tu_fence_finish(struct tu_fence *fence); 426void 427tu_fence_update_fd(struct tu_fence *fence, int fd); 428void 429tu_fence_copy(struct tu_fence *fence, const struct tu_fence *src); 430void 431tu_fence_signal(struct tu_fence *fence); 432void 433tu_fence_wait_idle(struct tu_fence *fence); 434 435struct tu_queue 436{ 437 VK_LOADER_DATA _loader_data; 438 struct tu_device *device; 439 uint32_t queue_family_index; 440 int queue_idx; 441 VkDeviceQueueCreateFlags flags; 442 443 uint32_t msm_queue_id; 444 struct tu_fence submit_fence; 445}; 446 447struct tu_device 448{ 449 VK_LOADER_DATA _loader_data; 450 451 VkAllocationCallbacks alloc; 452 453 struct tu_instance *instance; 454 455 struct tu_meta_state meta_state; 456 457 struct tu_queue *queues[TU_MAX_QUEUE_FAMILIES]; 458 int queue_count[TU_MAX_QUEUE_FAMILIES]; 459 460 struct tu_physical_device *physical_device; 461 462 struct ir3_compiler *compiler; 463 464 /* Backup in-memory cache to be used if the app doesn't provide one */ 465 struct tu_pipeline_cache *mem_cache; 466 467 struct list_head shader_slabs; 468 mtx_t shader_slab_mutex; 469 470 struct tu_device_extension_table enabled_extensions; 471}; 472 473struct tu_bo 474{ 475 uint32_t gem_handle; 476 uint64_t size; 477 uint64_t iova; 478 void *map; 479}; 480 481VkResult 482tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size); 483VkResult 484tu_bo_init_dmabuf(struct tu_device *dev, 485 struct tu_bo *bo, 486 uint64_t size, 487 int fd); 488int 489tu_bo_export_dmabuf(struct tu_device *dev, struct tu_bo *bo); 490void 491tu_bo_finish(struct tu_device *dev, struct tu_bo *bo); 492VkResult 493tu_bo_map(struct tu_device *dev, struct tu_bo *bo); 494 495struct tu_cs_entry 496{ 497 /* No ownership */ 498 const struct tu_bo *bo; 499 500 uint32_t size; 501 uint32_t offset; 502}; 503 504enum tu_cs_mode 505{ 506 507 /* 508 * A command stream in TU_CS_MODE_GROW mode grows automatically whenever it 509 * is full. tu_cs_begin must be called before command packet emission and 510 * tu_cs_end must be called after. 511 * 512 * This mode may create multiple entries internally. The entries must be 513 * submitted together. 514 */ 515 TU_CS_MODE_GROW, 516 517 /* 518 * A command stream in TU_CS_MODE_EXTERNAL mode wraps an external, 519 * fixed-size buffer. tu_cs_begin and tu_cs_end are optional and have no 520 * effect on it. 521 * 522 * This mode does not create any entry or any BO. 523 */ 524 TU_CS_MODE_EXTERNAL, 525 526 /* 527 * A command stream in TU_CS_MODE_SUB_STREAM mode does not support direct 528 * command packet emission. tu_cs_begin_sub_stream must be called to get a 529 * sub-stream to emit comamnd packets to. When done with the sub-stream, 530 * tu_cs_end_sub_stream must be called. 531 * 532 * This mode does not create any entry internally. 533 */ 534 TU_CS_MODE_SUB_STREAM, 535}; 536 537struct tu_cs 538{ 539 uint32_t *start; 540 uint32_t *cur; 541 uint32_t *reserved_end; 542 uint32_t *end; 543 544 enum tu_cs_mode mode; 545 uint32_t next_bo_size; 546 547 struct tu_cs_entry *entries; 548 uint32_t entry_count; 549 uint32_t entry_capacity; 550 551 struct tu_bo **bos; 552 uint32_t bo_count; 553 uint32_t bo_capacity; 554}; 555 556struct tu_device_memory 557{ 558 struct tu_bo bo; 559 VkDeviceSize size; 560 561 /* for dedicated allocations */ 562 struct tu_image *image; 563 struct tu_buffer *buffer; 564 565 uint32_t type_index; 566 void *map; 567 void *user_ptr; 568}; 569 570struct tu_descriptor_range 571{ 572 uint64_t va; 573 uint32_t size; 574}; 575 576struct tu_descriptor_set 577{ 578 const struct tu_descriptor_set_layout *layout; 579 uint32_t size; 580 581 uint64_t va; 582 uint32_t *mapped_ptr; 583 struct tu_descriptor_range *dynamic_descriptors; 584}; 585 586struct tu_push_descriptor_set 587{ 588 struct tu_descriptor_set set; 589 uint32_t capacity; 590}; 591 592struct tu_descriptor_pool_entry 593{ 594 uint32_t offset; 595 uint32_t size; 596 struct tu_descriptor_set *set; 597}; 598 599struct tu_descriptor_pool 600{ 601 uint8_t *mapped_ptr; 602 uint64_t current_offset; 603 uint64_t size; 604 605 uint8_t *host_memory_base; 606 uint8_t *host_memory_ptr; 607 uint8_t *host_memory_end; 608 609 uint32_t entry_count; 610 uint32_t max_entry_count; 611 struct tu_descriptor_pool_entry entries[0]; 612}; 613 614struct tu_descriptor_update_template_entry 615{ 616 VkDescriptorType descriptor_type; 617 618 /* The number of descriptors to update */ 619 uint32_t descriptor_count; 620 621 /* Into mapped_ptr or dynamic_descriptors, in units of the respective array 622 */ 623 uint32_t dst_offset; 624 625 /* In dwords. Not valid/used for dynamic descriptors */ 626 uint32_t dst_stride; 627 628 uint32_t buffer_offset; 629 630 /* Only valid for combined image samplers and samplers */ 631 uint16_t has_sampler; 632 633 /* In bytes */ 634 size_t src_offset; 635 size_t src_stride; 636 637 /* For push descriptors */ 638 const uint32_t *immutable_samplers; 639}; 640 641struct tu_descriptor_update_template 642{ 643 uint32_t entry_count; 644 VkPipelineBindPoint bind_point; 645 struct tu_descriptor_update_template_entry entry[0]; 646}; 647 648struct tu_buffer 649{ 650 VkDeviceSize size; 651 652 VkBufferUsageFlags usage; 653 VkBufferCreateFlags flags; 654 655 struct tu_bo *bo; 656 VkDeviceSize bo_offset; 657}; 658 659enum tu_dynamic_state_bits 660{ 661 TU_DYNAMIC_VIEWPORT = 1 << 0, 662 TU_DYNAMIC_SCISSOR = 1 << 1, 663 TU_DYNAMIC_LINE_WIDTH = 1 << 2, 664 TU_DYNAMIC_DEPTH_BIAS = 1 << 3, 665 TU_DYNAMIC_BLEND_CONSTANTS = 1 << 4, 666 TU_DYNAMIC_DEPTH_BOUNDS = 1 << 5, 667 TU_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 6, 668 TU_DYNAMIC_STENCIL_WRITE_MASK = 1 << 7, 669 TU_DYNAMIC_STENCIL_REFERENCE = 1 << 8, 670 TU_DYNAMIC_DISCARD_RECTANGLE = 1 << 9, 671 TU_DYNAMIC_ALL = (1 << 10) - 1, 672}; 673 674struct tu_vertex_binding 675{ 676 struct tu_buffer *buffer; 677 VkDeviceSize offset; 678}; 679 680struct tu_viewport_state 681{ 682 uint32_t count; 683 VkViewport viewports[MAX_VIEWPORTS]; 684}; 685 686struct tu_scissor_state 687{ 688 uint32_t count; 689 VkRect2D scissors[MAX_SCISSORS]; 690}; 691 692struct tu_discard_rectangle_state 693{ 694 uint32_t count; 695 VkRect2D rectangles[MAX_DISCARD_RECTANGLES]; 696}; 697 698struct tu_dynamic_state 699{ 700 /** 701 * Bitmask of (1 << VK_DYNAMIC_STATE_*). 702 * Defines the set of saved dynamic state. 703 */ 704 uint32_t mask; 705 706 struct tu_viewport_state viewport; 707 708 struct tu_scissor_state scissor; 709 710 float line_width; 711 712 struct 713 { 714 float bias; 715 float clamp; 716 float slope; 717 } depth_bias; 718 719 float blend_constants[4]; 720 721 struct 722 { 723 float min; 724 float max; 725 } depth_bounds; 726 727 struct 728 { 729 uint32_t front; 730 uint32_t back; 731 } stencil_compare_mask; 732 733 struct 734 { 735 uint32_t front; 736 uint32_t back; 737 } stencil_write_mask; 738 739 struct 740 { 741 uint32_t front; 742 uint32_t back; 743 } stencil_reference; 744 745 struct tu_discard_rectangle_state discard_rectangle; 746}; 747 748extern const struct tu_dynamic_state default_dynamic_state; 749 750const char * 751tu_get_debug_option_name(int id); 752 753const char * 754tu_get_perftest_option_name(int id); 755 756/** 757 * Attachment state when recording a renderpass instance. 758 * 759 * The clear value is valid only if there exists a pending clear. 760 */ 761struct tu_attachment_state 762{ 763 VkImageAspectFlags pending_clear_aspects; 764 uint32_t cleared_views; 765 VkClearValue clear_value; 766 VkImageLayout current_layout; 767}; 768 769struct tu_descriptor_state 770{ 771 struct tu_descriptor_set *sets[MAX_SETS]; 772 uint32_t dirty; 773 uint32_t valid; 774 struct tu_push_descriptor_set push_set; 775 bool push_dirty; 776 uint32_t dynamic_buffers[4 * MAX_DYNAMIC_BUFFERS]; 777}; 778 779struct tu_tile 780{ 781 uint8_t pipe; 782 uint8_t slot; 783 VkOffset2D begin; 784 VkOffset2D end; 785}; 786 787struct tu_tiling_config 788{ 789 VkRect2D render_area; 790 uint32_t buffer_cpp[MAX_RTS + 2]; 791 uint32_t buffer_count; 792 793 /* position and size of the first tile */ 794 VkRect2D tile0; 795 /* number of tiles */ 796 VkExtent2D tile_count; 797 798 uint32_t gmem_offsets[MAX_RTS + 2]; 799 800 /* size of the first VSC pipe */ 801 VkExtent2D pipe0; 802 /* number of VSC pipes */ 803 VkExtent2D pipe_count; 804 805 /* pipe register values */ 806 uint32_t pipe_config[MAX_VSC_PIPES]; 807 uint32_t pipe_sizes[MAX_VSC_PIPES]; 808}; 809 810enum tu_cmd_dirty_bits 811{ 812 TU_CMD_DIRTY_PIPELINE = 1 << 0, 813 TU_CMD_DIRTY_VERTEX_BUFFERS = 1 << 1, 814 815 TU_CMD_DIRTY_DYNAMIC_LINE_WIDTH = 1 << 16, 816 TU_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 17, 817 TU_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK = 1 << 18, 818 TU_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE = 1 << 19, 819}; 820 821struct tu_cmd_state 822{ 823 uint32_t dirty; 824 825 struct tu_pipeline *pipeline; 826 827 /* Vertex buffers */ 828 struct 829 { 830 struct tu_buffer *buffers[MAX_VBS]; 831 VkDeviceSize offsets[MAX_VBS]; 832 } vb; 833 834 struct tu_dynamic_state dynamic; 835 836 /* Index buffer */ 837 struct tu_buffer *index_buffer; 838 uint64_t index_offset; 839 uint32_t index_type; 840 uint32_t max_index_count; 841 uint64_t index_va; 842 843 const struct tu_render_pass *pass; 844 const struct tu_subpass *subpass; 845 const struct tu_framebuffer *framebuffer; 846 struct tu_attachment_state *attachments; 847 848 struct tu_tiling_config tiling_config; 849 850 struct tu_cs_entry tile_load_ib; 851 struct tu_cs_entry tile_store_ib; 852}; 853 854struct tu_cmd_pool 855{ 856 VkAllocationCallbacks alloc; 857 struct list_head cmd_buffers; 858 struct list_head free_cmd_buffers; 859 uint32_t queue_family_index; 860}; 861 862struct tu_cmd_buffer_upload 863{ 864 uint8_t *map; 865 unsigned offset; 866 uint64_t size; 867 struct list_head list; 868}; 869 870enum tu_cmd_buffer_status 871{ 872 TU_CMD_BUFFER_STATUS_INVALID, 873 TU_CMD_BUFFER_STATUS_INITIAL, 874 TU_CMD_BUFFER_STATUS_RECORDING, 875 TU_CMD_BUFFER_STATUS_EXECUTABLE, 876 TU_CMD_BUFFER_STATUS_PENDING, 877}; 878 879struct tu_bo_list 880{ 881 uint32_t count; 882 uint32_t capacity; 883 struct drm_msm_gem_submit_bo *bo_infos; 884}; 885 886#define TU_BO_LIST_FAILED (~0) 887 888void 889tu_bo_list_init(struct tu_bo_list *list); 890void 891tu_bo_list_destroy(struct tu_bo_list *list); 892void 893tu_bo_list_reset(struct tu_bo_list *list); 894uint32_t 895tu_bo_list_add(struct tu_bo_list *list, 896 const struct tu_bo *bo, 897 uint32_t flags); 898VkResult 899tu_bo_list_merge(struct tu_bo_list *list, const struct tu_bo_list *other); 900 901struct tu_cmd_buffer 902{ 903 VK_LOADER_DATA _loader_data; 904 905 struct tu_device *device; 906 907 struct tu_cmd_pool *pool; 908 struct list_head pool_link; 909 910 VkCommandBufferUsageFlags usage_flags; 911 VkCommandBufferLevel level; 912 enum tu_cmd_buffer_status status; 913 914 struct tu_cmd_state state; 915 struct tu_vertex_binding vertex_bindings[MAX_VBS]; 916 uint32_t queue_family_index; 917 918 uint8_t push_constants[MAX_PUSH_CONSTANTS_SIZE]; 919 VkShaderStageFlags push_constant_stages; 920 struct tu_descriptor_set meta_push_descriptors; 921 922 struct tu_descriptor_state descriptors[VK_PIPELINE_BIND_POINT_RANGE_SIZE]; 923 924 struct tu_cmd_buffer_upload upload; 925 926 VkResult record_result; 927 928 struct tu_bo_list bo_list; 929 struct tu_cs cs; 930 struct tu_cs draw_cs; 931 struct tu_cs tile_cs; 932 933 uint16_t marker_reg; 934 uint32_t marker_seqno; 935 936 struct tu_bo scratch_bo; 937 uint32_t scratch_seqno; 938 939 bool wait_for_idle; 940}; 941 942void 943tu6_emit_event_write(struct tu_cmd_buffer *cmd, 944 struct tu_cs *cs, 945 enum vgt_event_type event, 946 bool need_seqno); 947 948bool 949tu_get_memory_fd(struct tu_device *device, 950 struct tu_device_memory *memory, 951 int *pFD); 952 953/* 954 * Takes x,y,z as exact numbers of invocations, instead of blocks. 955 * 956 * Limitations: Can't call normal dispatch functions without binding or 957 * rebinding 958 * the compute pipeline. 959 */ 960void 961tu_unaligned_dispatch(struct tu_cmd_buffer *cmd_buffer, 962 uint32_t x, 963 uint32_t y, 964 uint32_t z); 965 966struct tu_event 967{ 968 uint64_t *map; 969}; 970 971struct tu_shader_module; 972 973#define TU_HASH_SHADER_IS_GEOM_COPY_SHADER (1 << 0) 974#define TU_HASH_SHADER_SISCHED (1 << 1) 975#define TU_HASH_SHADER_UNSAFE_MATH (1 << 2) 976void 977tu_hash_shaders(unsigned char *hash, 978 const VkPipelineShaderStageCreateInfo **stages, 979 const struct tu_pipeline_layout *layout, 980 const struct tu_pipeline_key *key, 981 uint32_t flags); 982 983static inline gl_shader_stage 984vk_to_mesa_shader_stage(VkShaderStageFlagBits vk_stage) 985{ 986 assert(__builtin_popcount(vk_stage) == 1); 987 return ffs(vk_stage) - 1; 988} 989 990static inline VkShaderStageFlagBits 991mesa_to_vk_shader_stage(gl_shader_stage mesa_stage) 992{ 993 return (1 << mesa_stage); 994} 995 996#define TU_STAGE_MASK ((1 << MESA_SHADER_STAGES) - 1) 997 998#define tu_foreach_stage(stage, stage_bits) \ 999 for (gl_shader_stage stage, \ 1000 __tmp = (gl_shader_stage)((stage_bits) &TU_STAGE_MASK); \ 1001 stage = __builtin_ffs(__tmp) - 1, __tmp; __tmp &= ~(1 << (stage))) 1002 1003struct tu_shader_module 1004{ 1005 unsigned char sha1[20]; 1006 1007 uint32_t code_size; 1008 const uint32_t *code[0]; 1009}; 1010 1011struct tu_shader_compile_options 1012{ 1013 struct ir3_shader_key key; 1014 1015 bool optimize; 1016 bool include_binning_pass; 1017}; 1018 1019struct tu_shader 1020{ 1021 struct ir3_shader ir3_shader; 1022 1023 /* This may be true for vertex shaders. When true, variants[1] is the 1024 * binning variant and binning_binary is non-NULL. 1025 */ 1026 bool has_binning_pass; 1027 1028 void *binary; 1029 void *binning_binary; 1030 1031 struct ir3_shader_variant variants[0]; 1032}; 1033 1034struct tu_shader * 1035tu_shader_create(struct tu_device *dev, 1036 gl_shader_stage stage, 1037 const VkPipelineShaderStageCreateInfo *stage_info, 1038 const VkAllocationCallbacks *alloc); 1039 1040void 1041tu_shader_destroy(struct tu_device *dev, 1042 struct tu_shader *shader, 1043 const VkAllocationCallbacks *alloc); 1044 1045void 1046tu_shader_compile_options_init( 1047 struct tu_shader_compile_options *options, 1048 const VkGraphicsPipelineCreateInfo *pipeline_info); 1049 1050VkResult 1051tu_shader_compile(struct tu_device *dev, 1052 struct tu_shader *shader, 1053 const struct tu_shader *next_stage, 1054 const struct tu_shader_compile_options *options, 1055 const VkAllocationCallbacks *alloc); 1056 1057struct tu_pipeline 1058{ 1059 struct tu_cs cs; 1060 1061 struct tu_dynamic_state dynamic_state; 1062 1063 struct tu_pipeline_layout *layout; 1064 1065 bool need_indirect_descriptor_sets; 1066 VkShaderStageFlags active_stages; 1067 1068 struct 1069 { 1070 struct tu_bo binary_bo; 1071 struct tu_cs_entry state_ib; 1072 struct tu_cs_entry binning_state_ib; 1073 } program; 1074 1075 struct 1076 { 1077 uint8_t bindings[MAX_VERTEX_ATTRIBS]; 1078 uint16_t strides[MAX_VERTEX_ATTRIBS]; 1079 uint16_t offsets[MAX_VERTEX_ATTRIBS]; 1080 uint32_t count; 1081 1082 uint8_t binning_bindings[MAX_VERTEX_ATTRIBS]; 1083 uint16_t binning_strides[MAX_VERTEX_ATTRIBS]; 1084 uint16_t binning_offsets[MAX_VERTEX_ATTRIBS]; 1085 uint32_t binning_count; 1086 1087 struct tu_cs_entry state_ib; 1088 struct tu_cs_entry binning_state_ib; 1089 } vi; 1090 1091 struct 1092 { 1093 enum pc_di_primtype primtype; 1094 bool primitive_restart; 1095 } ia; 1096 1097 struct 1098 { 1099 struct tu_cs_entry state_ib; 1100 } vp; 1101 1102 struct 1103 { 1104 uint32_t gras_su_cntl; 1105 struct tu_cs_entry state_ib; 1106 } rast; 1107 1108 struct 1109 { 1110 struct tu_cs_entry state_ib; 1111 } ds; 1112 1113 struct 1114 { 1115 struct tu_cs_entry state_ib; 1116 } blend; 1117}; 1118 1119void 1120tu6_emit_viewport(struct tu_cs *cs, const VkViewport *viewport); 1121 1122void 1123tu6_emit_scissor(struct tu_cs *cs, const VkRect2D *scissor); 1124 1125void 1126tu6_emit_gras_su_cntl(struct tu_cs *cs, 1127 uint32_t gras_su_cntl, 1128 float line_width); 1129 1130void 1131tu6_emit_depth_bias(struct tu_cs *cs, 1132 float constant_factor, 1133 float clamp, 1134 float slope_factor); 1135 1136void 1137tu6_emit_stencil_compare_mask(struct tu_cs *cs, 1138 uint32_t front, 1139 uint32_t back); 1140 1141void 1142tu6_emit_stencil_write_mask(struct tu_cs *cs, uint32_t front, uint32_t back); 1143 1144void 1145tu6_emit_stencil_reference(struct tu_cs *cs, uint32_t front, uint32_t back); 1146 1147void 1148tu6_emit_blend_constants(struct tu_cs *cs, const float constants[4]); 1149 1150struct tu_userdata_info * 1151tu_lookup_user_sgpr(struct tu_pipeline *pipeline, 1152 gl_shader_stage stage, 1153 int idx); 1154 1155struct tu_shader_variant * 1156tu_get_shader(struct tu_pipeline *pipeline, gl_shader_stage stage); 1157 1158struct tu_graphics_pipeline_create_info 1159{ 1160 bool use_rectlist; 1161 bool db_depth_clear; 1162 bool db_stencil_clear; 1163 bool db_depth_disable_expclear; 1164 bool db_stencil_disable_expclear; 1165 bool db_flush_depth_inplace; 1166 bool db_flush_stencil_inplace; 1167 bool db_resummarize; 1168 uint32_t custom_blend_mode; 1169}; 1170 1171struct tu_native_format 1172{ 1173 int vtx; /* VFMTn_xxx or -1 */ 1174 int tex; /* TFMTn_xxx or -1 */ 1175 int rb; /* RBn_xxx or -1 */ 1176 int swap; /* enum a3xx_color_swap */ 1177 bool present; /* internal only; always true to external users */ 1178}; 1179 1180const struct tu_native_format * 1181tu6_get_native_format(VkFormat format); 1182 1183int 1184tu_pack_clear_value(const VkClearValue *val, 1185 VkFormat format, 1186 uint32_t buf[4]); 1187enum a6xx_2d_ifmt tu6_rb_fmt_to_ifmt(enum a6xx_color_fmt fmt); 1188 1189struct tu_image_level 1190{ 1191 VkDeviceSize offset; 1192 VkDeviceSize size; 1193 uint32_t pitch; 1194}; 1195 1196struct tu_image 1197{ 1198 VkImageType type; 1199 /* The original VkFormat provided by the client. This may not match any 1200 * of the actual surface formats. 1201 */ 1202 VkFormat vk_format; 1203 VkImageAspectFlags aspects; 1204 VkImageUsageFlags usage; /**< Superset of VkImageCreateInfo::usage. */ 1205 VkImageTiling tiling; /** VkImageCreateInfo::tiling */ 1206 VkImageCreateFlags flags; /** VkImageCreateInfo::flags */ 1207 VkExtent3D extent; 1208 uint32_t level_count; 1209 uint32_t layer_count; 1210 1211 VkDeviceSize size; 1212 uint32_t alignment; 1213 1214 /* memory layout */ 1215 VkDeviceSize layer_size; 1216 struct tu_image_level levels[15]; 1217 unsigned tile_mode; 1218 1219 unsigned queue_family_mask; 1220 bool exclusive; 1221 bool shareable; 1222 1223 /* For VK_ANDROID_native_buffer, the WSI image owns the memory, */ 1224 VkDeviceMemory owned_memory; 1225 1226 /* Set when bound */ 1227 const struct tu_bo *bo; 1228 VkDeviceSize bo_offset; 1229}; 1230 1231unsigned 1232tu_image_queue_family_mask(const struct tu_image *image, 1233 uint32_t family, 1234 uint32_t queue_family); 1235 1236static inline uint32_t 1237tu_get_layerCount(const struct tu_image *image, 1238 const VkImageSubresourceRange *range) 1239{ 1240 return range->layerCount == VK_REMAINING_ARRAY_LAYERS 1241 ? image->layer_count - range->baseArrayLayer 1242 : range->layerCount; 1243} 1244 1245static inline uint32_t 1246tu_get_levelCount(const struct tu_image *image, 1247 const VkImageSubresourceRange *range) 1248{ 1249 return range->levelCount == VK_REMAINING_MIP_LEVELS 1250 ? image->level_count - range->baseMipLevel 1251 : range->levelCount; 1252} 1253 1254struct tu_image_view 1255{ 1256 struct tu_image *image; /**< VkImageViewCreateInfo::image */ 1257 1258 VkImageViewType type; 1259 VkImageAspectFlags aspect_mask; 1260 VkFormat vk_format; 1261 uint32_t base_layer; 1262 uint32_t layer_count; 1263 uint32_t base_mip; 1264 uint32_t level_count; 1265 VkExtent3D extent; /**< Extent of VkImageViewCreateInfo::baseMipLevel. */ 1266 1267 uint32_t descriptor[16]; 1268 1269 /* Descriptor for use as a storage image as opposed to a sampled image. 1270 * This has a few differences for cube maps (e.g. type). 1271 */ 1272 uint32_t storage_descriptor[16]; 1273}; 1274 1275struct tu_sampler 1276{ 1277}; 1278 1279struct tu_image_create_info 1280{ 1281 const VkImageCreateInfo *vk_info; 1282 bool scanout; 1283 bool no_metadata_planes; 1284}; 1285 1286VkResult 1287tu_image_create(VkDevice _device, 1288 const struct tu_image_create_info *info, 1289 const VkAllocationCallbacks *alloc, 1290 VkImage *pImage); 1291 1292VkResult 1293tu_image_from_gralloc(VkDevice device_h, 1294 const VkImageCreateInfo *base_info, 1295 const VkNativeBufferANDROID *gralloc_info, 1296 const VkAllocationCallbacks *alloc, 1297 VkImage *out_image_h); 1298 1299void 1300tu_image_view_init(struct tu_image_view *view, 1301 struct tu_device *device, 1302 const VkImageViewCreateInfo *pCreateInfo); 1303 1304struct tu_buffer_view 1305{ 1306 VkFormat vk_format; 1307 uint64_t range; /**< VkBufferViewCreateInfo::range */ 1308 uint32_t state[4]; 1309}; 1310void 1311tu_buffer_view_init(struct tu_buffer_view *view, 1312 struct tu_device *device, 1313 const VkBufferViewCreateInfo *pCreateInfo); 1314 1315static inline struct VkExtent3D 1316tu_sanitize_image_extent(const VkImageType imageType, 1317 const struct VkExtent3D imageExtent) 1318{ 1319 switch (imageType) { 1320 case VK_IMAGE_TYPE_1D: 1321 return (VkExtent3D) { imageExtent.width, 1, 1 }; 1322 case VK_IMAGE_TYPE_2D: 1323 return (VkExtent3D) { imageExtent.width, imageExtent.height, 1 }; 1324 case VK_IMAGE_TYPE_3D: 1325 return imageExtent; 1326 default: 1327 unreachable("invalid image type"); 1328 } 1329} 1330 1331static inline struct VkOffset3D 1332tu_sanitize_image_offset(const VkImageType imageType, 1333 const struct VkOffset3D imageOffset) 1334{ 1335 switch (imageType) { 1336 case VK_IMAGE_TYPE_1D: 1337 return (VkOffset3D) { imageOffset.x, 0, 0 }; 1338 case VK_IMAGE_TYPE_2D: 1339 return (VkOffset3D) { imageOffset.x, imageOffset.y, 0 }; 1340 case VK_IMAGE_TYPE_3D: 1341 return imageOffset; 1342 default: 1343 unreachable("invalid image type"); 1344 } 1345} 1346 1347struct tu_attachment_info 1348{ 1349 struct tu_image_view *attachment; 1350}; 1351 1352struct tu_framebuffer 1353{ 1354 uint32_t width; 1355 uint32_t height; 1356 uint32_t layers; 1357 1358 uint32_t attachment_count; 1359 struct tu_attachment_info attachments[0]; 1360}; 1361 1362struct tu_subpass_barrier 1363{ 1364 VkPipelineStageFlags src_stage_mask; 1365 VkAccessFlags src_access_mask; 1366 VkAccessFlags dst_access_mask; 1367}; 1368 1369void 1370tu_subpass_barrier(struct tu_cmd_buffer *cmd_buffer, 1371 const struct tu_subpass_barrier *barrier); 1372 1373struct tu_subpass_attachment 1374{ 1375 uint32_t attachment; 1376 VkImageLayout layout; 1377}; 1378 1379struct tu_subpass 1380{ 1381 uint32_t input_count; 1382 uint32_t color_count; 1383 struct tu_subpass_attachment *input_attachments; 1384 struct tu_subpass_attachment *color_attachments; 1385 struct tu_subpass_attachment *resolve_attachments; 1386 struct tu_subpass_attachment depth_stencil_attachment; 1387 1388 /** Subpass has at least one resolve attachment */ 1389 bool has_resolve; 1390 1391 struct tu_subpass_barrier start_barrier; 1392 1393 uint32_t view_mask; 1394 VkSampleCountFlagBits max_sample_count; 1395}; 1396 1397struct tu_render_pass_attachment 1398{ 1399 VkFormat format; 1400 uint32_t samples; 1401 VkAttachmentLoadOp load_op; 1402 VkAttachmentLoadOp stencil_load_op; 1403 VkImageLayout initial_layout; 1404 VkImageLayout final_layout; 1405 uint32_t view_mask; 1406}; 1407 1408struct tu_render_pass 1409{ 1410 uint32_t attachment_count; 1411 uint32_t subpass_count; 1412 struct tu_subpass_attachment *subpass_attachments; 1413 struct tu_render_pass_attachment *attachments; 1414 struct tu_subpass_barrier end_barrier; 1415 struct tu_subpass subpasses[0]; 1416}; 1417 1418VkResult 1419tu_device_init_meta(struct tu_device *device); 1420void 1421tu_device_finish_meta(struct tu_device *device); 1422 1423struct tu_query_pool 1424{ 1425 uint32_t stride; 1426 uint32_t availability_offset; 1427 uint64_t size; 1428 char *ptr; 1429 VkQueryType type; 1430 uint32_t pipeline_stats_mask; 1431}; 1432 1433struct tu_semaphore 1434{ 1435 uint32_t syncobj; 1436 uint32_t temp_syncobj; 1437}; 1438 1439void 1440tu_set_descriptor_set(struct tu_cmd_buffer *cmd_buffer, 1441 VkPipelineBindPoint bind_point, 1442 struct tu_descriptor_set *set, 1443 unsigned idx); 1444 1445void 1446tu_update_descriptor_sets(struct tu_device *device, 1447 struct tu_cmd_buffer *cmd_buffer, 1448 VkDescriptorSet overrideSet, 1449 uint32_t descriptorWriteCount, 1450 const VkWriteDescriptorSet *pDescriptorWrites, 1451 uint32_t descriptorCopyCount, 1452 const VkCopyDescriptorSet *pDescriptorCopies); 1453 1454void 1455tu_update_descriptor_set_with_template( 1456 struct tu_device *device, 1457 struct tu_cmd_buffer *cmd_buffer, 1458 struct tu_descriptor_set *set, 1459 VkDescriptorUpdateTemplate descriptorUpdateTemplate, 1460 const void *pData); 1461 1462void 1463tu_meta_push_descriptor_set(struct tu_cmd_buffer *cmd_buffer, 1464 VkPipelineBindPoint pipelineBindPoint, 1465 VkPipelineLayout _layout, 1466 uint32_t set, 1467 uint32_t descriptorWriteCount, 1468 const VkWriteDescriptorSet *pDescriptorWrites); 1469 1470int 1471tu_drm_get_gpu_id(const struct tu_physical_device *dev, uint32_t *id); 1472 1473int 1474tu_drm_get_gmem_size(const struct tu_physical_device *dev, uint32_t *size); 1475 1476int 1477tu_drm_submitqueue_new(const struct tu_device *dev, 1478 int priority, 1479 uint32_t *queue_id); 1480 1481void 1482tu_drm_submitqueue_close(const struct tu_device *dev, uint32_t queue_id); 1483 1484uint32_t 1485tu_gem_new(const struct tu_device *dev, uint64_t size, uint32_t flags); 1486uint32_t 1487tu_gem_import_dmabuf(const struct tu_device *dev, 1488 int prime_fd, 1489 uint64_t size); 1490int 1491tu_gem_export_dmabuf(const struct tu_device *dev, uint32_t gem_handle); 1492void 1493tu_gem_close(const struct tu_device *dev, uint32_t gem_handle); 1494uint64_t 1495tu_gem_info_offset(const struct tu_device *dev, uint32_t gem_handle); 1496uint64_t 1497tu_gem_info_iova(const struct tu_device *dev, uint32_t gem_handle); 1498 1499#define TU_DEFINE_HANDLE_CASTS(__tu_type, __VkType) \ 1500 \ 1501 static inline struct __tu_type *__tu_type##_from_handle(__VkType _handle) \ 1502 { \ 1503 return (struct __tu_type *) _handle; \ 1504 } \ 1505 \ 1506 static inline __VkType __tu_type##_to_handle(struct __tu_type *_obj) \ 1507 { \ 1508 return (__VkType) _obj; \ 1509 } 1510 1511#define TU_DEFINE_NONDISP_HANDLE_CASTS(__tu_type, __VkType) \ 1512 \ 1513 static inline struct __tu_type *__tu_type##_from_handle(__VkType _handle) \ 1514 { \ 1515 return (struct __tu_type *) (uintptr_t) _handle; \ 1516 } \ 1517 \ 1518 static inline __VkType __tu_type##_to_handle(struct __tu_type *_obj) \ 1519 { \ 1520 return (__VkType)(uintptr_t) _obj; \ 1521 } 1522 1523#define TU_FROM_HANDLE(__tu_type, __name, __handle) \ 1524 struct __tu_type *__name = __tu_type##_from_handle(__handle) 1525 1526TU_DEFINE_HANDLE_CASTS(tu_cmd_buffer, VkCommandBuffer) 1527TU_DEFINE_HANDLE_CASTS(tu_device, VkDevice) 1528TU_DEFINE_HANDLE_CASTS(tu_instance, VkInstance) 1529TU_DEFINE_HANDLE_CASTS(tu_physical_device, VkPhysicalDevice) 1530TU_DEFINE_HANDLE_CASTS(tu_queue, VkQueue) 1531 1532TU_DEFINE_NONDISP_HANDLE_CASTS(tu_cmd_pool, VkCommandPool) 1533TU_DEFINE_NONDISP_HANDLE_CASTS(tu_buffer, VkBuffer) 1534TU_DEFINE_NONDISP_HANDLE_CASTS(tu_buffer_view, VkBufferView) 1535TU_DEFINE_NONDISP_HANDLE_CASTS(tu_descriptor_pool, VkDescriptorPool) 1536TU_DEFINE_NONDISP_HANDLE_CASTS(tu_descriptor_set, VkDescriptorSet) 1537TU_DEFINE_NONDISP_HANDLE_CASTS(tu_descriptor_set_layout, 1538 VkDescriptorSetLayout) 1539TU_DEFINE_NONDISP_HANDLE_CASTS(tu_descriptor_update_template, 1540 VkDescriptorUpdateTemplate) 1541TU_DEFINE_NONDISP_HANDLE_CASTS(tu_device_memory, VkDeviceMemory) 1542TU_DEFINE_NONDISP_HANDLE_CASTS(tu_fence, VkFence) 1543TU_DEFINE_NONDISP_HANDLE_CASTS(tu_event, VkEvent) 1544TU_DEFINE_NONDISP_HANDLE_CASTS(tu_framebuffer, VkFramebuffer) 1545TU_DEFINE_NONDISP_HANDLE_CASTS(tu_image, VkImage) 1546TU_DEFINE_NONDISP_HANDLE_CASTS(tu_image_view, VkImageView); 1547TU_DEFINE_NONDISP_HANDLE_CASTS(tu_pipeline_cache, VkPipelineCache) 1548TU_DEFINE_NONDISP_HANDLE_CASTS(tu_pipeline, VkPipeline) 1549TU_DEFINE_NONDISP_HANDLE_CASTS(tu_pipeline_layout, VkPipelineLayout) 1550TU_DEFINE_NONDISP_HANDLE_CASTS(tu_query_pool, VkQueryPool) 1551TU_DEFINE_NONDISP_HANDLE_CASTS(tu_render_pass, VkRenderPass) 1552TU_DEFINE_NONDISP_HANDLE_CASTS(tu_sampler, VkSampler) 1553TU_DEFINE_NONDISP_HANDLE_CASTS(tu_shader_module, VkShaderModule) 1554TU_DEFINE_NONDISP_HANDLE_CASTS(tu_semaphore, VkSemaphore) 1555 1556#endif /* TU_PRIVATE_H */ 1557