• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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