xref: /aosp_15_r20/external/mesa3d/src/asahi/vulkan/hk_image.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Valve Corporation
3*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Alyssa Rosenzweig
4*61046927SAndroid Build Coastguard Worker  * Copyright 2022-2023 Collabora Ltd. and Red Hat Inc.
5*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
6*61046927SAndroid Build Coastguard Worker  */
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #pragma once
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include "asahi/layout/layout.h"
11*61046927SAndroid Build Coastguard Worker #include "vulkan/vulkan_core.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #include "hk_private.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #include "vk_image.h"
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker /* Because small images can end up with an array_stride_B that is less than
18*61046927SAndroid Build Coastguard Worker  * the sparse block size (in bytes), we have to set SINGLE_MIPTAIL_BIT when
19*61046927SAndroid Build Coastguard Worker  * advertising sparse properties to the client.  This means that we get one
20*61046927SAndroid Build Coastguard Worker  * single memory range for the miptail of the image.  For large images with
21*61046927SAndroid Build Coastguard Worker  * mipTailStartLod > 0, we have to deal with the array stride ourselves.
22*61046927SAndroid Build Coastguard Worker  *
23*61046927SAndroid Build Coastguard Worker  * We do this by returning HK_MIP_TAIL_START_OFFSET as the image's
24*61046927SAndroid Build Coastguard Worker  * imageMipTailOffset.  We can then detect anything with that address as
25*61046927SAndroid Build Coastguard Worker  * being part of the miptail and re-map it accordingly.  The Vulkan spec
26*61046927SAndroid Build Coastguard Worker  * explicitly allows for this.
27*61046927SAndroid Build Coastguard Worker  *
28*61046927SAndroid Build Coastguard Worker  * From the Vulkan 1.3.279 spec:
29*61046927SAndroid Build Coastguard Worker  *
30*61046927SAndroid Build Coastguard Worker  *    "When VK_SPARSE_MEMORY_BIND_METADATA_BIT is present, the resourceOffset
31*61046927SAndroid Build Coastguard Worker  *    must have been derived explicitly from the imageMipTailOffset in the
32*61046927SAndroid Build Coastguard Worker  *    sparse resource properties returned for the metadata aspect. By
33*61046927SAndroid Build Coastguard Worker  *    manipulating the value returned for imageMipTailOffset, the
34*61046927SAndroid Build Coastguard Worker  *    resourceOffset does not have to correlate directly to a device virtual
35*61046927SAndroid Build Coastguard Worker  *    address offset, and may instead be whatever value makes it easiest for
36*61046927SAndroid Build Coastguard Worker  *    the implementation to derive the correct device virtual address."
37*61046927SAndroid Build Coastguard Worker  */
38*61046927SAndroid Build Coastguard Worker #define HK_MIP_TAIL_START_OFFSET 0x6d74000000000000UL
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker struct hk_device_memory;
41*61046927SAndroid Build Coastguard Worker struct hk_physical_device;
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker static VkFormatFeatureFlags2
44*61046927SAndroid Build Coastguard Worker hk_get_image_plane_format_features(struct hk_physical_device *pdev,
45*61046927SAndroid Build Coastguard Worker                                    VkFormat vk_format, VkImageTiling tiling);
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker VkFormatFeatureFlags2
48*61046927SAndroid Build Coastguard Worker hk_get_image_format_features(struct hk_physical_device *pdevice,
49*61046927SAndroid Build Coastguard Worker                              VkFormat format, VkImageTiling tiling);
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker struct hk_image_plane {
52*61046927SAndroid Build Coastguard Worker    struct ail_layout layout;
53*61046927SAndroid Build Coastguard Worker    uint64_t addr;
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker    /** Size of the reserved VMA range for sparse images, zero otherwise. */
56*61046927SAndroid Build Coastguard Worker    uint64_t vma_size_B;
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker    /* For host image copy */
59*61046927SAndroid Build Coastguard Worker    void *map;
60*61046927SAndroid Build Coastguard Worker    uint32_t rem;
61*61046927SAndroid Build Coastguard Worker };
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker struct hk_image {
64*61046927SAndroid Build Coastguard Worker    struct vk_image vk;
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    /** True if the planes are bound separately
67*61046927SAndroid Build Coastguard Worker     *
68*61046927SAndroid Build Coastguard Worker     * This is set based on VK_IMAGE_CREATE_DISJOINT_BIT
69*61046927SAndroid Build Coastguard Worker     */
70*61046927SAndroid Build Coastguard Worker    bool disjoint;
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker    uint8_t plane_count;
73*61046927SAndroid Build Coastguard Worker    struct hk_image_plane planes[3];
74*61046927SAndroid Build Coastguard Worker };
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(hk_image, vk.base, VkImage, VK_OBJECT_TYPE_IMAGE)
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker static inline uint64_t
hk_image_plane_base_address(const struct hk_image_plane * plane)79*61046927SAndroid Build Coastguard Worker hk_image_plane_base_address(const struct hk_image_plane *plane)
80*61046927SAndroid Build Coastguard Worker {
81*61046927SAndroid Build Coastguard Worker    return plane->addr;
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker static inline uint64_t
hk_image_base_address(const struct hk_image * image,uint8_t plane)85*61046927SAndroid Build Coastguard Worker hk_image_base_address(const struct hk_image *image, uint8_t plane)
86*61046927SAndroid Build Coastguard Worker {
87*61046927SAndroid Build Coastguard Worker    return hk_image_plane_base_address(&image->planes[plane]);
88*61046927SAndroid Build Coastguard Worker }
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker static inline uint8_t
hk_image_aspects_to_plane(const struct hk_image * image,VkImageAspectFlags aspectMask)91*61046927SAndroid Build Coastguard Worker hk_image_aspects_to_plane(const struct hk_image *image,
92*61046927SAndroid Build Coastguard Worker                           VkImageAspectFlags aspectMask)
93*61046927SAndroid Build Coastguard Worker {
94*61046927SAndroid Build Coastguard Worker    /* Must only be one aspect unless it's depth/stencil */
95*61046927SAndroid Build Coastguard Worker    assert(aspectMask ==
96*61046927SAndroid Build Coastguard Worker              (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT) ||
97*61046927SAndroid Build Coastguard Worker           util_bitcount(aspectMask) == 1);
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    switch (aspectMask) {
100*61046927SAndroid Build Coastguard Worker    default:
101*61046927SAndroid Build Coastguard Worker       assert(aspectMask != VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT);
102*61046927SAndroid Build Coastguard Worker       return 0;
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_STENCIL_BIT:
105*61046927SAndroid Build Coastguard Worker       return image->vk.format == VK_FORMAT_D32_SFLOAT_S8_UINT;
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_PLANE_1_BIT:
108*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT:
109*61046927SAndroid Build Coastguard Worker       return 1;
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_PLANE_2_BIT:
112*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT:
113*61046927SAndroid Build Coastguard Worker       return 2;
114*61046927SAndroid Build Coastguard Worker    }
115*61046927SAndroid Build Coastguard Worker }
116