xref: /aosp_15_r20/external/mesa3d/src/panfrost/vulkan/panvk_vX_cmd_meta.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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