1 /*
2 * Copyright © 2022 Collabora Ltd
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23 #ifndef VK_META_H
24 #define VK_META_H
25
26 #include "vk_limits.h"
27 #include "vk_object.h"
28
29 #include "util/simple_mtx.h"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 struct hash_table;
36 struct vk_command_buffer;
37 struct vk_device;
38 struct vk_image;
39
40 struct vk_meta_rect {
41 uint32_t x0, y0, x1, y1;
42 float z;
43 uint32_t layer;
44 };
45
46 #define VK_PRIMITIVE_TOPOLOGY_META_RECT_LIST_MESA (VkPrimitiveTopology)11
47
48 struct vk_meta_device {
49 struct hash_table *cache;
50 simple_mtx_t cache_mtx;
51
52 uint32_t max_bind_map_buffer_size_B;
53 bool use_layered_rendering;
54 bool use_gs_for_layer;
55 bool use_stencil_export;
56
57 VkResult (*cmd_bind_map_buffer)(struct vk_command_buffer *cmd,
58 struct vk_meta_device *meta,
59 VkBuffer buffer,
60 void **map_out);
61
62 void (*cmd_draw_rects)(struct vk_command_buffer *cmd,
63 struct vk_meta_device *meta,
64 uint32_t rect_count,
65 const struct vk_meta_rect *rects);
66
67 void (*cmd_draw_volume)(struct vk_command_buffer *cmd,
68 struct vk_meta_device *meta,
69 const struct vk_meta_rect *rect,
70 uint32_t layer_count);
71 };
72
73 VkResult vk_meta_device_init(struct vk_device *device,
74 struct vk_meta_device *meta);
75 void vk_meta_device_finish(struct vk_device *device,
76 struct vk_meta_device *meta);
77
78 /** Keys should start with one of these to ensure uniqueness */
79 enum vk_meta_object_key_type {
80 VK_META_OBJECT_KEY_TYPE_INVALD = 0,
81 VK_META_OBJECT_KEY_CLEAR_PIPELINE,
82 VK_META_OBJECT_KEY_BLIT_PIPELINE,
83 VK_META_OBJECT_KEY_BLIT_SAMPLER,
84 };
85
86 uint64_t vk_meta_lookup_object(struct vk_meta_device *meta,
87 VkObjectType obj_type,
88 const void *key_data, size_t key_size);
89
90 uint64_t vk_meta_cache_object(struct vk_device *device,
91 struct vk_meta_device *meta,
92 const void *key_data, size_t key_size,
93 VkObjectType obj_type,
94 uint64_t handle);
95
96 static inline VkDescriptorSetLayout
vk_meta_lookup_descriptor_set_layout(struct vk_meta_device * meta,const void * key_data,size_t key_size)97 vk_meta_lookup_descriptor_set_layout(struct vk_meta_device *meta,
98 const void *key_data, size_t key_size)
99 {
100 return (VkDescriptorSetLayout)
101 vk_meta_lookup_object(meta, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT,
102 key_data, key_size);
103 }
104
105 static inline VkPipelineLayout
vk_meta_lookup_pipeline_layout(struct vk_meta_device * meta,const void * key_data,size_t key_size)106 vk_meta_lookup_pipeline_layout(struct vk_meta_device *meta,
107 const void *key_data, size_t key_size)
108 {
109 return (VkPipelineLayout)
110 vk_meta_lookup_object(meta, VK_OBJECT_TYPE_PIPELINE_LAYOUT,
111 key_data, key_size);
112 }
113
114 static inline VkPipeline
vk_meta_lookup_pipeline(struct vk_meta_device * meta,const void * key_data,size_t key_size)115 vk_meta_lookup_pipeline(struct vk_meta_device *meta,
116 const void *key_data, size_t key_size)
117 {
118 return (VkPipeline)vk_meta_lookup_object(meta, VK_OBJECT_TYPE_PIPELINE,
119 key_data, key_size);
120 }
121
122 static inline VkSampler
vk_meta_lookup_sampler(struct vk_meta_device * meta,const void * key_data,size_t key_size)123 vk_meta_lookup_sampler(struct vk_meta_device *meta,
124 const void *key_data, size_t key_size)
125 {
126 return (VkSampler)vk_meta_lookup_object(meta, VK_OBJECT_TYPE_SAMPLER,
127 key_data, key_size);
128 }
129
130 struct vk_meta_rendering_info {
131 uint32_t view_mask;
132 uint32_t samples;
133 uint32_t color_attachment_count;
134 VkFormat color_attachment_formats[MESA_VK_MAX_COLOR_ATTACHMENTS];
135 VkFormat depth_attachment_format;
136 VkFormat stencil_attachment_format;
137 };
138
139 VkResult
140 vk_meta_create_descriptor_set_layout(struct vk_device *device,
141 struct vk_meta_device *meta,
142 const VkDescriptorSetLayoutCreateInfo *info,
143 const void *key_data, size_t key_size,
144 VkDescriptorSetLayout *layout_out);
145
146 VkResult
147 vk_meta_create_pipeline_layout(struct vk_device *device,
148 struct vk_meta_device *meta,
149 const VkPipelineLayoutCreateInfo *info,
150 const void *key_data, size_t key_size,
151 VkPipelineLayout *layout_out);
152
153 VkResult
154 vk_meta_get_pipeline_layout(struct vk_device *device,
155 struct vk_meta_device *meta,
156 const VkDescriptorSetLayoutCreateInfo *desc_info,
157 const VkPushConstantRange *push_range,
158 const void *key_data, size_t key_size,
159 VkPipelineLayout *layout_out);
160
161 VkResult
162 vk_meta_create_graphics_pipeline(struct vk_device *device,
163 struct vk_meta_device *meta,
164 const VkGraphicsPipelineCreateInfo *info,
165 const struct vk_meta_rendering_info *render,
166 const void *key_data, size_t key_size,
167 VkPipeline *pipeline_out);
168
169 VkResult
170 vk_meta_create_compute_pipeline(struct vk_device *device,
171 struct vk_meta_device *meta,
172 const VkComputePipelineCreateInfo *info,
173 const void *key_data, size_t key_size,
174 VkPipeline *pipeline_out);
175
176 VkResult
177 vk_meta_create_sampler(struct vk_device *device,
178 struct vk_meta_device *meta,
179 const VkSamplerCreateInfo *info,
180 const void *key_data, size_t key_size,
181 VkSampler *sampler_out);
182
183 VkResult vk_meta_create_buffer(struct vk_command_buffer *cmd,
184 struct vk_meta_device *meta,
185 const VkBufferCreateInfo *info,
186 VkBuffer *buffer_out);
187 VkResult vk_meta_create_image_view(struct vk_command_buffer *cmd,
188 struct vk_meta_device *meta,
189 const VkImageViewCreateInfo *info,
190 VkImageView *image_view_out);
191
192 void vk_meta_draw_rects(struct vk_command_buffer *cmd,
193 struct vk_meta_device *meta,
194 uint32_t rect_count,
195 const struct vk_meta_rect *rects);
196
197 void vk_meta_draw_volume(struct vk_command_buffer *cmd,
198 struct vk_meta_device *meta,
199 const struct vk_meta_rect *rect,
200 uint32_t layer_count);
201
202 void vk_meta_clear_attachments(struct vk_command_buffer *cmd,
203 struct vk_meta_device *meta,
204 const struct vk_meta_rendering_info *render,
205 uint32_t attachment_count,
206 const VkClearAttachment *attachments,
207 uint32_t rect_count,
208 const VkClearRect *rects);
209
210 void vk_meta_clear_rendering(struct vk_meta_device *meta,
211 struct vk_command_buffer *cmd,
212 const VkRenderingInfo *pRenderingInfo);
213
214 void vk_meta_clear_color_image(struct vk_command_buffer *cmd,
215 struct vk_meta_device *meta,
216 struct vk_image *image,
217 VkImageLayout image_layout,
218 VkFormat format,
219 const VkClearColorValue *color,
220 uint32_t range_count,
221 const VkImageSubresourceRange *ranges);
222
223 void vk_meta_clear_depth_stencil_image(struct vk_command_buffer *cmd,
224 struct vk_meta_device *meta,
225 struct vk_image *image,
226 VkImageLayout image_layout,
227 const VkClearDepthStencilValue *depth_stencil,
228 uint32_t range_count,
229 const VkImageSubresourceRange *ranges);
230
231 void vk_meta_blit_image(struct vk_command_buffer *cmd,
232 struct vk_meta_device *meta,
233 struct vk_image *src_image,
234 VkFormat src_format,
235 VkImageLayout src_image_layout,
236 struct vk_image *dst_image,
237 VkFormat dst_format,
238 VkImageLayout dst_image_layout,
239 uint32_t region_count,
240 const VkImageBlit2 *regions,
241 VkFilter filter);
242
243 void vk_meta_blit_image2(struct vk_command_buffer *cmd,
244 struct vk_meta_device *meta,
245 const VkBlitImageInfo2 *blit);
246
247 void vk_meta_resolve_image(struct vk_command_buffer *cmd,
248 struct vk_meta_device *meta,
249 struct vk_image *src_image,
250 VkFormat src_format,
251 VkImageLayout src_image_layout,
252 struct vk_image *dst_image,
253 VkFormat dst_format,
254 VkImageLayout dst_image_layout,
255 uint32_t region_count,
256 const VkImageResolve2 *regions,
257 VkResolveModeFlagBits resolve_mode,
258 VkResolveModeFlagBits stencil_resolve_mode);
259
260 void vk_meta_resolve_image2(struct vk_command_buffer *cmd,
261 struct vk_meta_device *meta,
262 const VkResolveImageInfo2 *resolve);
263
264 void vk_meta_resolve_rendering(struct vk_command_buffer *cmd,
265 struct vk_meta_device *meta,
266 const VkRenderingInfo *pRenderingInfo);
267
268 #ifdef __cplusplus
269 }
270 #endif
271
272 #endif /* VK_META_H */
273