1 /* 2 * Copyright 2019 Google LLC 3 * SPDX-License-Identifier: MIT 4 * 5 * based in part on anv and radv which are: 6 * Copyright © 2015 Intel Corporation 7 * Copyright © 2016 Red Hat. 8 * Copyright © 2016 Bas Nieuwenhuizen 9 */ 10 11 #ifndef VN_IMAGE_H 12 #define VN_IMAGE_H 13 14 #include "vn_common.h" 15 16 /* changing this to VK_IMAGE_LAYOUT_PRESENT_SRC_KHR disables ownership 17 * transfers and can be useful for debugging 18 */ 19 #define VN_PRESENT_SRC_INTERNAL_LAYOUT VK_IMAGE_LAYOUT_GENERAL 20 21 struct vn_image_memory_requirements { 22 VkMemoryRequirements2 memory; 23 VkMemoryDedicatedRequirements dedicated; 24 }; 25 26 struct vn_image_reqs_cache_entry { 27 struct vn_image_memory_requirements requirements[4]; 28 uint8_t plane_count; 29 uint8_t key[SHA1_DIGEST_LENGTH]; 30 struct list_head head; 31 }; 32 33 struct vn_image_reqs_cache { 34 struct hash_table *ht; 35 struct list_head lru; 36 simple_mtx_t mutex; 37 38 struct { 39 uint32_t cache_hit_count; 40 uint32_t cache_miss_count; 41 uint32_t cache_skip_count; 42 } debug; 43 }; 44 45 struct vn_image_create_deferred_info { 46 VkImageCreateInfo create; 47 VkImageFormatListCreateInfo list; 48 VkImageStencilUsageCreateInfo stencil; 49 50 /* True if VkImageCreateInfo::format is translated from a non-zero 51 * VkExternalFormatANDROID::externalFormat for the AHB image. 52 */ 53 bool from_external_format; 54 /* track whether vn_image_init_deferred succeeds */ 55 bool initialized; 56 }; 57 58 struct vn_image { 59 struct vn_image_base base; 60 61 VkSharingMode sharing_mode; 62 63 struct vn_image_memory_requirements requirements[4]; 64 65 /* For VK_ANDROID_external_memory_android_hardware_buffer, real image 66 * creation is deferred until bind image memory. 67 */ 68 struct vn_image_create_deferred_info *deferred_info; 69 70 struct { 71 /* True if this is a swapchain image and VK_IMAGE_LAYOUT_PRESENT_SRC_KHR 72 * is a valid layout. A swapchain image can be created internally 73 * (wsi_image_create_info) or externally (VkNativeBufferANDROID and 74 * VkImageSwapchainCreateInfoKHR). 75 */ 76 bool is_wsi; 77 bool is_prime_blit_src; 78 VkImageTiling tiling_override; 79 /* valid when tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT */ 80 uint64_t drm_format_modifier; 81 82 struct vn_device_memory *memory; 83 84 /* For VK_ANDROID_native_buffer, the WSI image owns the memory. */ 85 bool memory_owned; 86 } wsi; 87 }; 88 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_image, 89 base.base.base, 90 VkImage, 91 VK_OBJECT_TYPE_IMAGE) 92 93 struct vn_image_view { 94 struct vn_object_base base; 95 96 const struct vn_image *image; 97 }; 98 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_image_view, 99 base.base, 100 VkImageView, 101 VK_OBJECT_TYPE_IMAGE_VIEW) 102 103 struct vn_sampler { 104 struct vn_object_base base; 105 }; 106 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_sampler, 107 base.base, 108 VkSampler, 109 VK_OBJECT_TYPE_SAMPLER) 110 111 struct vn_sampler_ycbcr_conversion { 112 struct vn_object_base base; 113 }; 114 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_sampler_ycbcr_conversion, 115 base.base, 116 VkSamplerYcbcrConversion, 117 VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION) 118 119 VkResult 120 vn_image_create(struct vn_device *dev, 121 const VkImageCreateInfo *create_info, 122 const VkAllocationCallbacks *alloc, 123 struct vn_image **out_img); 124 125 VkResult 126 vn_image_init_deferred(struct vn_device *dev, 127 const VkImageCreateInfo *create_info, 128 struct vn_image *img); 129 130 void 131 vn_image_reqs_cache_init(struct vn_device *dev); 132 133 void 134 vn_image_reqs_cache_fini(struct vn_device *dev); 135 136 #endif /* VN_IMAGE_H */ 137