xref: /aosp_15_r20/external/mesa3d/src/panfrost/vulkan/panvk_meta.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2021 Collabora Ltd.
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #ifndef PANVK_META_H
7 #define PANVK_META_H
8 
9 #include "panvk_image.h"
10 #include "panvk_mempool.h"
11 
12 #include "vk_format.h"
13 #include "vk_meta.h"
14 
15 static inline bool
panvk_meta_copy_to_image_use_gfx_pipeline(struct panvk_image * dst_img)16 panvk_meta_copy_to_image_use_gfx_pipeline(struct panvk_image *dst_img)
17 {
18    /* Writes to AFBC images must go through the graphics pipeline. */
19    if (drm_is_afbc(dst_img->pimage.layout.modifier))
20       return true;
21 
22    return false;
23 }
24 
25 static inline VkFormat
panvk_meta_get_uint_format_for_blk_size(unsigned blk_sz)26 panvk_meta_get_uint_format_for_blk_size(unsigned blk_sz)
27 {
28    switch (blk_sz) {
29    case 1:
30       return VK_FORMAT_R8_UINT;
31    case 2:
32       return VK_FORMAT_R16_UINT;
33    case 3:
34       return VK_FORMAT_R8G8B8_UINT;
35    case 4:
36       return VK_FORMAT_R32_UINT;
37    case 6:
38       return VK_FORMAT_R16G16B16_UINT;
39    case 8:
40       return VK_FORMAT_R32G32_UINT;
41    case 12:
42       return VK_FORMAT_R32G32B32_UINT;
43    case 16:
44       return VK_FORMAT_R32G32B32A32_UINT;
45    default:
46       return VK_FORMAT_UNDEFINED;
47    }
48 }
49 
50 static inline struct vk_meta_copy_image_properties
panvk_meta_copy_get_image_properties(struct panvk_image * img)51 panvk_meta_copy_get_image_properties(struct panvk_image *img)
52 {
53    uint64_t mod = img->pimage.layout.modifier;
54    enum pipe_format pfmt = vk_format_to_pipe_format(img->vk.format);
55    unsigned blk_sz = util_format_get_blocksize(pfmt);
56    struct vk_meta_copy_image_properties props = {0};
57 
58    if (drm_is_afbc(mod)) {
59       if (!vk_format_is_depth_or_stencil(img->vk.format)) {
60          props.color.view_format = img->vk.format;
61       } else {
62          switch (img->vk.format) {
63          case VK_FORMAT_D24_UNORM_S8_UINT:
64             props.depth.view_format = VK_FORMAT_R8G8B8A8_UNORM;
65             props.depth.component_mask = BITFIELD_MASK(3);
66             props.stencil.view_format = VK_FORMAT_R8G8B8A8_UNORM;
67             props.stencil.component_mask = BITFIELD_BIT(3);
68             break;
69          case VK_FORMAT_X8_D24_UNORM_PACK32:
70             props.depth.view_format = VK_FORMAT_R8G8B8A8_UNORM;
71             props.depth.component_mask = BITFIELD_MASK(3);
72             break;
73          case VK_FORMAT_D16_UNORM:
74             props.depth.view_format = VK_FORMAT_R8G8_UNORM;
75             props.depth.component_mask = BITFIELD_MASK(2);
76             break;
77          default:
78             assert(!"Invalid ZS format");
79             break;
80          }
81       }
82    } else if (vk_format_is_depth_or_stencil(img->vk.format)) {
83       switch (img->vk.format) {
84       case VK_FORMAT_S8_UINT:
85          props.stencil.view_format = VK_FORMAT_R8_UINT;
86          props.stencil.component_mask = BITFIELD_MASK(1);
87          break;
88       case VK_FORMAT_D24_UNORM_S8_UINT:
89          props.depth.view_format = VK_FORMAT_R8G8B8A8_UINT;
90          props.depth.component_mask = BITFIELD_MASK(3);
91          props.stencil.view_format = VK_FORMAT_R8G8B8A8_UINT;
92          props.stencil.component_mask = BITFIELD_BIT(3);
93          break;
94       case VK_FORMAT_X8_D24_UNORM_PACK32:
95          props.depth.view_format = VK_FORMAT_R8G8B8A8_UINT;
96          props.depth.component_mask = BITFIELD_MASK(3);
97          break;
98       case VK_FORMAT_D32_SFLOAT_S8_UINT:
99          props.depth.view_format = VK_FORMAT_R32G32_UINT;
100          props.depth.component_mask = BITFIELD_BIT(0);
101          props.stencil.view_format = VK_FORMAT_R32G32_UINT;
102          props.stencil.component_mask = BITFIELD_BIT(1);
103          break;
104       case VK_FORMAT_D16_UNORM:
105          props.depth.view_format = VK_FORMAT_R16_UINT;
106          props.depth.component_mask = BITFIELD_BIT(0);
107          break;
108       case VK_FORMAT_D32_SFLOAT:
109          props.depth.view_format = VK_FORMAT_R32_UINT;
110          props.depth.component_mask = BITFIELD_BIT(0);
111          break;
112       default:
113          assert(!"Invalid ZS format");
114          break;
115       }
116    } else {
117       props.color.view_format = panvk_meta_get_uint_format_for_blk_size(blk_sz);
118    }
119 
120    if (mod == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED ||
121        drm_is_afbc(mod)) {
122       props.tile_size.width = 16;
123       props.tile_size.height = 16;
124       props.tile_size.depth = 1;
125    } else {
126       /* When linear, pretend we have a 1D-tile so we end up with a <64,1,1>
127        * workgroup. */
128       props.tile_size.width = 64;
129       props.tile_size.height = 1;
130       props.tile_size.depth = 1;
131    }
132 
133    return props;
134 }
135 
136 #if defined(PAN_ARCH) && PAN_ARCH <= 7
137 void panvk_per_arch(meta_desc_copy_init)(struct panvk_device *dev);
138 
139 void panvk_per_arch(meta_desc_copy_cleanup)(struct panvk_device *dev);
140 
141 struct panvk_cmd_buffer;
142 struct panvk_descriptor_state;
143 struct panvk_device;
144 struct panvk_shader;
145 struct panvk_shader_desc_state;
146 
147 VkResult panvk_per_arch(meta_get_copy_desc_job)(
148    struct panvk_cmd_buffer *cmdbuf, const struct panvk_shader *shader,
149    const struct panvk_descriptor_state *desc_state,
150    const struct panvk_shader_desc_state *shader_desc_state,
151    uint32_t attrib_buf_idx_offset, struct panfrost_ptr *job_desc);
152 #endif
153 
154 #endif
155