1 /*
2 * Copyright © 2021 Collabora Ltd.
3 * SPDX-License-Identifier: MIT
4 */
5
6 #include "panvk_cmd_meta.h"
7 #include "panvk_entrypoints.h"
8
9 void
panvk_per_arch(cmd_meta_compute_start)10 panvk_per_arch(cmd_meta_compute_start)(
11 struct panvk_cmd_buffer *cmdbuf,
12 struct panvk_cmd_meta_compute_save_ctx *save_ctx)
13 {
14 const struct panvk_descriptor_set *set0 =
15 cmdbuf->state.compute.desc_state.sets[0];
16 struct panvk_descriptor_set *push_set0 =
17 cmdbuf->state.compute.desc_state.push_sets[0];
18
19 save_ctx->set0 = set0;
20 if (push_set0 && push_set0 == set0) {
21 save_ctx->push_set0.desc_count = push_set0->desc_count;
22 save_ctx->push_set0.descs_dev_addr = push_set0->descs.dev;
23 memcpy(save_ctx->push_set0.desc_storage, push_set0->descs.host,
24 push_set0->desc_count * PANVK_DESCRIPTOR_SIZE);
25 }
26
27 save_ctx->push_constants = cmdbuf->state.push_constants;
28 save_ctx->cs.shader = cmdbuf->state.compute.shader;
29 save_ctx->cs.desc = cmdbuf->state.compute.cs.desc;
30 }
31
32 void
panvk_per_arch(cmd_meta_compute_end)33 panvk_per_arch(cmd_meta_compute_end)(
34 struct panvk_cmd_buffer *cmdbuf,
35 const struct panvk_cmd_meta_compute_save_ctx *save_ctx)
36 {
37 struct panvk_descriptor_set *push_set0 =
38 cmdbuf->state.compute.desc_state.push_sets[0];
39
40 cmdbuf->state.compute.desc_state.sets[0] = save_ctx->set0;
41 if (save_ctx->push_set0.desc_count) {
42 memcpy(push_set0->descs.host, save_ctx->push_set0.desc_storage,
43 save_ctx->push_set0.desc_count * PANVK_DESCRIPTOR_SIZE);
44 push_set0->descs.dev = save_ctx->push_set0.descs_dev_addr;
45 push_set0->desc_count = save_ctx->push_set0.desc_count;
46 }
47
48 if (memcmp(cmdbuf->state.push_constants.data, save_ctx->push_constants.data,
49 sizeof(cmdbuf->state.push_constants.data))) {
50 cmdbuf->state.push_constants = save_ctx->push_constants;
51 cmdbuf->state.compute.push_uniforms = 0;
52 cmdbuf->state.gfx.push_uniforms = 0;
53 }
54
55 cmdbuf->state.compute.shader = save_ctx->cs.shader;
56 cmdbuf->state.compute.cs.desc = save_ctx->cs.desc;
57 }
58
59 void
panvk_per_arch(cmd_meta_gfx_start)60 panvk_per_arch(cmd_meta_gfx_start)(
61 struct panvk_cmd_buffer *cmdbuf,
62 struct panvk_cmd_meta_graphics_save_ctx *save_ctx)
63 {
64 const struct panvk_descriptor_set *set0 =
65 cmdbuf->state.gfx.desc_state.sets[0];
66 struct panvk_descriptor_set *push_set0 =
67 cmdbuf->state.gfx.desc_state.push_sets[0];
68
69 save_ctx->set0 = set0;
70 if (push_set0 && push_set0 == set0) {
71 save_ctx->push_set0.desc_count = push_set0->desc_count;
72 save_ctx->push_set0.descs_dev_addr = push_set0->descs.dev;
73 memcpy(save_ctx->push_set0.desc_storage, push_set0->descs.host,
74 push_set0->desc_count * PANVK_DESCRIPTOR_SIZE);
75 }
76
77 save_ctx->push_constants = cmdbuf->state.push_constants;
78 save_ctx->fs.shader = cmdbuf->state.gfx.fs.shader;
79 save_ctx->fs.desc = cmdbuf->state.gfx.fs.desc;
80 save_ctx->vs.shader = cmdbuf->state.gfx.vs.shader;
81 save_ctx->vs.desc = cmdbuf->state.gfx.vs.desc;
82 save_ctx->vb0 = cmdbuf->state.gfx.vb.bufs[0];
83
84 save_ctx->dyn_state.all = cmdbuf->vk.dynamic_graphics_state;
85 save_ctx->dyn_state.vi = cmdbuf->state.gfx.dynamic.vi;
86 save_ctx->dyn_state.sl = cmdbuf->state.gfx.dynamic.sl;
87 }
88
89 void
panvk_per_arch(cmd_meta_gfx_end)90 panvk_per_arch(cmd_meta_gfx_end)(
91 struct panvk_cmd_buffer *cmdbuf,
92 const struct panvk_cmd_meta_graphics_save_ctx *save_ctx)
93 {
94 struct panvk_descriptor_set *push_set0 =
95 cmdbuf->state.gfx.desc_state.push_sets[0];
96
97 cmdbuf->state.gfx.desc_state.sets[0] = save_ctx->set0;
98 if (save_ctx->push_set0.desc_count) {
99 memcpy(push_set0->descs.host, save_ctx->push_set0.desc_storage,
100 save_ctx->push_set0.desc_count * PANVK_DESCRIPTOR_SIZE);
101 push_set0->descs.dev = save_ctx->push_set0.descs_dev_addr;
102 push_set0->desc_count = save_ctx->push_set0.desc_count;
103 }
104
105 if (memcmp(cmdbuf->state.push_constants.data, save_ctx->push_constants.data,
106 sizeof(cmdbuf->state.push_constants.data))) {
107 cmdbuf->state.push_constants = save_ctx->push_constants;
108 cmdbuf->state.compute.push_uniforms = 0;
109 cmdbuf->state.gfx.push_uniforms = 0;
110 }
111
112 cmdbuf->state.gfx.fs.shader = save_ctx->fs.shader;
113 cmdbuf->state.gfx.fs.desc = save_ctx->fs.desc;
114 cmdbuf->state.gfx.vs.shader = save_ctx->vs.shader;
115 cmdbuf->state.gfx.vs.desc = save_ctx->vs.desc;
116 cmdbuf->state.gfx.vb.bufs[0] = save_ctx->vb0;
117
118 #if PAN_ARCH <= 7
119 cmdbuf->state.gfx.vs.attribs = 0;
120 cmdbuf->state.gfx.vs.attrib_bufs = 0;
121 cmdbuf->state.gfx.fs.rsd = 0;
122 #endif
123
124 cmdbuf->vk.dynamic_graphics_state = save_ctx->dyn_state.all;
125 cmdbuf->state.gfx.dynamic.vi = save_ctx->dyn_state.vi;
126 cmdbuf->state.gfx.dynamic.sl = save_ctx->dyn_state.sl;
127 memcpy(cmdbuf->vk.dynamic_graphics_state.dirty,
128 cmdbuf->vk.dynamic_graphics_state.set,
129 sizeof(cmdbuf->vk.dynamic_graphics_state.set));
130 }
131
132 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdBlitImage2)133 panvk_per_arch(CmdBlitImage2)(VkCommandBuffer commandBuffer,
134 const VkBlitImageInfo2 *pBlitImageInfo)
135 {
136 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
137 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
138 struct panvk_cmd_meta_graphics_save_ctx save = {0};
139
140 panvk_per_arch(cmd_meta_gfx_start)(cmdbuf, &save);
141 vk_meta_blit_image2(&cmdbuf->vk, &dev->meta, pBlitImageInfo);
142 panvk_per_arch(cmd_meta_gfx_end)(cmdbuf, &save);
143 }
144
145 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdResolveImage2)146 panvk_per_arch(CmdResolveImage2)(VkCommandBuffer commandBuffer,
147 const VkResolveImageInfo2 *pResolveImageInfo)
148 {
149 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
150 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
151 struct panvk_cmd_meta_graphics_save_ctx save = {0};
152
153 panvk_per_arch(cmd_meta_gfx_start)(cmdbuf, &save);
154 vk_meta_resolve_image2(&cmdbuf->vk, &dev->meta, pResolveImageInfo);
155 panvk_per_arch(cmd_meta_gfx_end)(cmdbuf, &save);
156 }
157
158 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdClearAttachments)159 panvk_per_arch(CmdClearAttachments)(VkCommandBuffer commandBuffer,
160 uint32_t attachmentCount,
161 const VkClearAttachment *pAttachments,
162 uint32_t rectCount,
163 const VkClearRect *pRects)
164 {
165 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
166 const struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info;
167 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
168 struct panvk_cmd_meta_graphics_save_ctx save = {0};
169 struct vk_meta_rendering_info render = {
170 .view_mask = 0,
171 .samples = fbinfo->nr_samples,
172 .color_attachment_count = fbinfo->rt_count,
173 };
174
175 for (uint32_t i = 0; i < fbinfo->rt_count; i++) {
176 if (fbinfo->rts[i].view) {
177 render.color_attachment_formats[i] =
178 cmdbuf->state.gfx.render.color_attachments.fmts[i];
179 render.color_attachment_write_masks[i] =
180 VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |
181 VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
182 }
183 }
184
185 if (fbinfo->zs.view.zs) {
186 render.depth_attachment_format =
187 vk_format_from_pipe_format(fbinfo->zs.view.zs->format);
188
189 if (vk_format_has_stencil(render.depth_attachment_format))
190 render.stencil_attachment_format = render.depth_attachment_format;
191 }
192
193 if (fbinfo->zs.view.s) {
194 render.stencil_attachment_format =
195 vk_format_from_pipe_format(fbinfo->zs.view.s->format);
196 }
197
198 panvk_per_arch(cmd_meta_gfx_start)(cmdbuf, &save);
199 vk_meta_clear_attachments(&cmdbuf->vk, &dev->meta, &render, attachmentCount,
200 pAttachments, rectCount, pRects);
201 panvk_per_arch(cmd_meta_gfx_end)(cmdbuf, &save);
202 }
203
204 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdClearDepthStencilImage)205 panvk_per_arch(CmdClearDepthStencilImage)(
206 VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
207 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
208 const VkImageSubresourceRange *pRanges)
209 {
210 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
211 VK_FROM_HANDLE(panvk_image, img, image);
212 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
213 struct panvk_cmd_meta_graphics_save_ctx save = {0};
214
215 panvk_per_arch(cmd_meta_gfx_start)(cmdbuf, &save);
216 vk_meta_clear_depth_stencil_image(&cmdbuf->vk, &dev->meta, &img->vk,
217 imageLayout, pDepthStencil, rangeCount,
218 pRanges);
219 panvk_per_arch(cmd_meta_gfx_end)(cmdbuf, &save);
220 }
221
222 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdClearColorImage)223 panvk_per_arch(CmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image,
224 VkImageLayout imageLayout,
225 const VkClearColorValue *pColor,
226 uint32_t rangeCount,
227 const VkImageSubresourceRange *pRanges)
228 {
229 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
230 VK_FROM_HANDLE(panvk_image, img, image);
231 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
232 struct panvk_cmd_meta_graphics_save_ctx save = {0};
233
234 panvk_per_arch(cmd_meta_gfx_start)(cmdbuf, &save);
235 vk_meta_clear_color_image(&cmdbuf->vk, &dev->meta, &img->vk, imageLayout,
236 img->vk.format, pColor, rangeCount, pRanges);
237 panvk_per_arch(cmd_meta_gfx_end)(cmdbuf, &save);
238 }
239
240 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdCopyBuffer2)241 panvk_per_arch(CmdCopyBuffer2)(VkCommandBuffer commandBuffer,
242 const VkCopyBufferInfo2 *pCopyBufferInfo)
243 {
244 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
245 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
246 struct panvk_cmd_meta_compute_save_ctx save = {0};
247
248 panvk_per_arch(cmd_meta_compute_start)(cmdbuf, &save);
249 vk_meta_copy_buffer(&cmdbuf->vk, &dev->meta, pCopyBufferInfo);
250 panvk_per_arch(cmd_meta_compute_end)(cmdbuf, &save);
251 }
252
253 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdCopyBufferToImage2)254 panvk_per_arch(CmdCopyBufferToImage2)(
255 VkCommandBuffer commandBuffer,
256 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo)
257 {
258 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
259 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
260 VK_FROM_HANDLE(panvk_image, img, pCopyBufferToImageInfo->dstImage);
261 struct vk_meta_copy_image_properties img_props =
262 panvk_meta_copy_get_image_properties(img);
263 bool use_gfx_pipeline = panvk_meta_copy_to_image_use_gfx_pipeline(img);
264
265 if (use_gfx_pipeline) {
266 struct panvk_cmd_meta_graphics_save_ctx save = {0};
267
268 panvk_per_arch(cmd_meta_gfx_start)(cmdbuf, &save);
269 vk_meta_copy_buffer_to_image(&cmdbuf->vk, &dev->meta,
270 pCopyBufferToImageInfo, &img_props,
271 VK_PIPELINE_BIND_POINT_GRAPHICS);
272 panvk_per_arch(cmd_meta_gfx_end)(cmdbuf, &save);
273 } else {
274 struct panvk_cmd_meta_compute_save_ctx save = {0};
275
276 panvk_per_arch(cmd_meta_compute_start)(cmdbuf, &save);
277 vk_meta_copy_buffer_to_image(&cmdbuf->vk, &dev->meta,
278 pCopyBufferToImageInfo, &img_props,
279 VK_PIPELINE_BIND_POINT_COMPUTE);
280 panvk_per_arch(cmd_meta_compute_end)(cmdbuf, &save);
281 }
282 }
283
284 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdCopyImageToBuffer2)285 panvk_per_arch(CmdCopyImageToBuffer2)(
286 VkCommandBuffer commandBuffer,
287 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo)
288 {
289 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
290 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
291 VK_FROM_HANDLE(panvk_image, img, pCopyImageToBufferInfo->srcImage);
292 struct vk_meta_copy_image_properties img_props =
293 panvk_meta_copy_get_image_properties(img);
294 struct panvk_cmd_meta_compute_save_ctx save = {0};
295
296 panvk_per_arch(cmd_meta_compute_start)(cmdbuf, &save);
297 vk_meta_copy_image_to_buffer(&cmdbuf->vk, &dev->meta, pCopyImageToBufferInfo,
298 &img_props);
299 panvk_per_arch(cmd_meta_compute_end)(cmdbuf, &save);
300 }
301
302 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdFillBuffer)303 panvk_per_arch(CmdFillBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
304 VkDeviceSize dstOffset, VkDeviceSize fillSize,
305 uint32_t data)
306 {
307 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
308 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
309 struct panvk_cmd_meta_compute_save_ctx save = {0};
310
311 panvk_per_arch(cmd_meta_compute_start)(cmdbuf, &save);
312 vk_meta_fill_buffer(&cmdbuf->vk, &dev->meta, dstBuffer, dstOffset, fillSize,
313 data);
314 panvk_per_arch(cmd_meta_compute_end)(cmdbuf, &save);
315 }
316
317 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdUpdateBuffer)318 panvk_per_arch(CmdUpdateBuffer)(VkCommandBuffer commandBuffer,
319 VkBuffer dstBuffer, VkDeviceSize dstOffset,
320 VkDeviceSize dataSize, const void *pData)
321 {
322 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
323 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
324 struct panvk_cmd_meta_compute_save_ctx save = {0};
325
326 panvk_per_arch(cmd_meta_compute_start)(cmdbuf, &save);
327 vk_meta_update_buffer(&cmdbuf->vk, &dev->meta, dstBuffer, dstOffset,
328 dataSize, pData);
329 panvk_per_arch(cmd_meta_compute_end)(cmdbuf, &save);
330 }
331
332 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdCopyImage2)333 panvk_per_arch(CmdCopyImage2)(VkCommandBuffer commandBuffer,
334 const VkCopyImageInfo2 *pCopyImageInfo)
335 {
336 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
337 struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
338 VK_FROM_HANDLE(panvk_image, src_img, pCopyImageInfo->srcImage);
339 VK_FROM_HANDLE(panvk_image, dst_img, pCopyImageInfo->dstImage);
340 struct vk_meta_copy_image_properties src_img_props =
341 panvk_meta_copy_get_image_properties(src_img);
342 struct vk_meta_copy_image_properties dst_img_props =
343 panvk_meta_copy_get_image_properties(dst_img);
344 bool use_gfx_pipeline = panvk_meta_copy_to_image_use_gfx_pipeline(dst_img);
345
346 if (use_gfx_pipeline) {
347 struct panvk_cmd_meta_graphics_save_ctx save = {0};
348
349 panvk_per_arch(cmd_meta_gfx_start)(cmdbuf, &save);
350 vk_meta_copy_image(&cmdbuf->vk, &dev->meta, pCopyImageInfo,
351 &src_img_props, &dst_img_props,
352 VK_PIPELINE_BIND_POINT_GRAPHICS);
353 panvk_per_arch(cmd_meta_gfx_end)(cmdbuf, &save);
354 } else {
355 struct panvk_cmd_meta_compute_save_ctx save = {0};
356
357 panvk_per_arch(cmd_meta_compute_start)(cmdbuf, &save);
358 vk_meta_copy_image(&cmdbuf->vk, &dev->meta, pCopyImageInfo,
359 &src_img_props, &dst_img_props,
360 VK_PIPELINE_BIND_POINT_COMPUTE);
361 panvk_per_arch(cmd_meta_compute_end)(cmdbuf, &save);
362 }
363 }
364