xref: /aosp_15_r20/external/mesa3d/src/virtio/vulkan/vn_image.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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