1 /*
2 * Copyright © 2024 Collabora Ltd.
3 * SPDX-License-Identifier: MIT
4 */
5
6 #include "panvk_cmd_alloc.h"
7 #include "panvk_cmd_buffer.h"
8 #include "panvk_entrypoints.h"
9
10 mali_ptr
panvk_per_arch(cmd_prepare_push_uniforms)11 panvk_per_arch(cmd_prepare_push_uniforms)(struct panvk_cmd_buffer *cmdbuf,
12 void *sysvals, unsigned sysvals_sz)
13 {
14 struct panfrost_ptr push_uniforms =
15 panvk_cmd_alloc_dev_mem(cmdbuf, desc, 512, 16);
16
17 if (push_uniforms.gpu) {
18 /* The first half is used for push constants. */
19 memcpy(push_uniforms.cpu, cmdbuf->state.push_constants.data,
20 sizeof(cmdbuf->state.push_constants.data));
21
22 /* The second half is used for sysvals. */
23 memcpy((uint8_t *)push_uniforms.cpu + 256, sysvals, sysvals_sz);
24 }
25
26 return push_uniforms.gpu;
27 }
28
29 VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdPushConstants2KHR)30 panvk_per_arch(CmdPushConstants2KHR)(
31 VkCommandBuffer commandBuffer,
32 const VkPushConstantsInfoKHR *pPushConstantsInfo)
33 {
34 VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
35
36 if (pPushConstantsInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS)
37 cmdbuf->state.gfx.push_uniforms = 0;
38
39 if (pPushConstantsInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT)
40 cmdbuf->state.compute.push_uniforms = 0;
41
42 memcpy(cmdbuf->state.push_constants.data + pPushConstantsInfo->offset,
43 pPushConstantsInfo->pValues, pPushConstantsInfo->size);
44 }
45