• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 enum panvk_meta_object_key_type {
16    PANVK_META_OBJECT_KEY_BLEND_SHADER = VK_META_OBJECT_KEY_DRIVER_OFFSET,
17    PANVK_META_OBJECT_KEY_COPY_DESC_SHADER,
18    PANVK_META_OBJECT_KEY_FB_PRELOAD_SHADER,
19    PANVK_META_OBJECT_KEY_CLEAR_QUERY_POOL_PIPELINE,
20    PANVK_META_OBJECT_KEY_COPY_QUERY_POOL_RESULTS_OQ_PIPELINE,
21 };
22 
23 static inline VkFormat
panvk_meta_get_uint_format_for_blk_size(unsigned blk_sz)24 panvk_meta_get_uint_format_for_blk_size(unsigned blk_sz)
25 {
26    switch (blk_sz) {
27    case 1:
28       return VK_FORMAT_R8_UINT;
29    case 2:
30       return VK_FORMAT_R16_UINT;
31    case 3:
32       return VK_FORMAT_R8G8B8_UINT;
33    case 4:
34       return VK_FORMAT_R32_UINT;
35    case 6:
36       return VK_FORMAT_R16G16B16_UINT;
37    case 8:
38       return VK_FORMAT_R32G32_UINT;
39    case 12:
40       return VK_FORMAT_R32G32B32_UINT;
41    case 16:
42       return VK_FORMAT_R32G32B32A32_UINT;
43    default:
44       return VK_FORMAT_UNDEFINED;
45    }
46 }
47 
48 static inline struct vk_meta_copy_image_properties
panvk_meta_copy_get_image_properties(struct panvk_image * img)49 panvk_meta_copy_get_image_properties(struct panvk_image *img)
50 {
51    uint64_t mod = img->vk.drm_format_mod;
52    enum pipe_format pfmt = vk_format_to_pipe_format(img->vk.format);
53    unsigned blk_sz = util_format_get_blocksize(pfmt);
54    struct vk_meta_copy_image_properties props;
55    memset(&props, 0, sizeof(props));
56 
57    if (drm_is_afbc(mod)) {
58       if (!vk_format_is_depth_or_stencil(img->vk.format)) {
59          props.color.view_format = img->vk.format;
60       } else {
61          switch (img->vk.format) {
62          case VK_FORMAT_D24_UNORM_S8_UINT:
63             props.depth.view_format = VK_FORMAT_R8G8B8A8_UNORM;
64             props.depth.component_mask = BITFIELD_MASK(3);
65             props.stencil.view_format = VK_FORMAT_R8G8B8A8_UNORM;
66             props.stencil.component_mask = BITFIELD_BIT(3);
67             break;
68          case VK_FORMAT_X8_D24_UNORM_PACK32:
69             props.depth.view_format = VK_FORMAT_R8G8B8A8_UNORM;
70             props.depth.component_mask = BITFIELD_MASK(3);
71             break;
72          case VK_FORMAT_D16_UNORM:
73             props.depth.view_format = VK_FORMAT_R8G8_UNORM;
74             props.depth.component_mask = BITFIELD_MASK(2);
75             break;
76          default:
77             assert(!"Invalid ZS format");
78             break;
79          }
80       }
81    } else if (vk_format_is_depth_or_stencil(img->vk.format)) {
82       switch (img->vk.format) {
83       case VK_FORMAT_S8_UINT:
84          props.stencil.view_format = VK_FORMAT_R8_UINT;
85          props.stencil.component_mask = BITFIELD_MASK(1);
86          break;
87       case VK_FORMAT_D24_UNORM_S8_UINT:
88          props.depth.view_format = VK_FORMAT_R8G8B8A8_UINT;
89          props.depth.component_mask = BITFIELD_MASK(3);
90          props.stencil.view_format = VK_FORMAT_R8G8B8A8_UINT;
91          props.stencil.component_mask = BITFIELD_BIT(3);
92          break;
93       case VK_FORMAT_X8_D24_UNORM_PACK32:
94          props.depth.view_format = VK_FORMAT_R8G8B8A8_UINT;
95          props.depth.component_mask = BITFIELD_MASK(3);
96          break;
97       case VK_FORMAT_D32_SFLOAT_S8_UINT:
98          props.depth.view_format = VK_FORMAT_R32_UINT;
99          props.depth.component_mask = BITFIELD_BIT(0);
100          props.stencil.view_format = VK_FORMAT_R8_UINT;
101          props.stencil.component_mask = BITFIELD_BIT(0);
102          break;
103       case VK_FORMAT_D16_UNORM:
104          props.depth.view_format = VK_FORMAT_R16_UINT;
105          props.depth.component_mask = BITFIELD_BIT(0);
106          break;
107       case VK_FORMAT_D32_SFLOAT:
108          props.depth.view_format = VK_FORMAT_R32_UINT;
109          props.depth.component_mask = BITFIELD_BIT(0);
110          break;
111       default:
112          assert(!"Invalid ZS format");
113          break;
114       }
115    } else {
116       props.color.view_format = panvk_meta_get_uint_format_for_blk_size(blk_sz);
117    }
118 
119    if (mod == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED ||
120        drm_is_afbc(mod)) {
121       props.tile_size.width = 16;
122       props.tile_size.height = 16;
123       props.tile_size.depth = 1;
124    } else {
125       /* When linear, pretend we have a 1D-tile so we end up with a <64,1,1>
126        * workgroup. */
127       props.tile_size.width = 64;
128       props.tile_size.height = 1;
129       props.tile_size.depth = 1;
130    }
131 
132    return props;
133 }
134 
135 #if defined(PAN_ARCH) && PAN_ARCH <= 7
136 struct panvk_cmd_buffer;
137 struct panvk_descriptor_state;
138 struct panvk_device;
139 struct panvk_shader;
140 struct panvk_shader_desc_state;
141 
142 VkResult panvk_per_arch(meta_get_copy_desc_job)(
143    struct panvk_cmd_buffer *cmdbuf, const struct panvk_shader *shader,
144    const struct panvk_descriptor_state *desc_state,
145    const struct panvk_shader_desc_state *shader_desc_state,
146    uint32_t attrib_buf_idx_offset, struct panfrost_ptr *job_desc);
147 #endif
148 
149 #endif
150