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