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