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