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