xref: /aosp_15_r20/external/mesa3d/src/freedreno/vulkan/tu_event.cc (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Red Hat.
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Bas Nieuwenhuizen
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * based in part on anv driver which is:
7*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
8*61046927SAndroid Build Coastguard Worker  */
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include "tu_event.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include "tu_cmd_buffer.h"
13*61046927SAndroid Build Coastguard Worker #include "tu_rmv.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_CreateEvent(VkDevice _device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent)16*61046927SAndroid Build Coastguard Worker tu_CreateEvent(VkDevice _device,
17*61046927SAndroid Build Coastguard Worker                const VkEventCreateInfo *pCreateInfo,
18*61046927SAndroid Build Coastguard Worker                const VkAllocationCallbacks *pAllocator,
19*61046927SAndroid Build Coastguard Worker                VkEvent *pEvent)
20*61046927SAndroid Build Coastguard Worker {
21*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_device, device, _device);
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker    struct tu_event *event = (struct tu_event *)
24*61046927SAndroid Build Coastguard Worker          vk_object_alloc(&device->vk, pAllocator, sizeof(*event),
25*61046927SAndroid Build Coastguard Worker                          VK_OBJECT_TYPE_EVENT);
26*61046927SAndroid Build Coastguard Worker    if (!event)
27*61046927SAndroid Build Coastguard Worker       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker    VkResult result = tu_bo_init_new(device, &event->base, &event->bo, 0x1000,
30*61046927SAndroid Build Coastguard Worker                                     TU_BO_ALLOC_NO_FLAGS, "event");
31*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
32*61046927SAndroid Build Coastguard Worker       goto fail_alloc;
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker    result = tu_bo_map(device, event->bo, NULL);
35*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
36*61046927SAndroid Build Coastguard Worker       goto fail_map;
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker    TU_RMV(event_create, device, pCreateInfo, event);
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker    *pEvent = tu_event_to_handle(event);
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker fail_map:
45*61046927SAndroid Build Coastguard Worker    tu_bo_finish(device, event->bo);
46*61046927SAndroid Build Coastguard Worker fail_alloc:
47*61046927SAndroid Build Coastguard Worker    vk_object_free(&device->vk, pAllocator, event);
48*61046927SAndroid Build Coastguard Worker    return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_DestroyEvent(VkDevice _device,VkEvent _event,const VkAllocationCallbacks * pAllocator)52*61046927SAndroid Build Coastguard Worker tu_DestroyEvent(VkDevice _device,
53*61046927SAndroid Build Coastguard Worker                 VkEvent _event,
54*61046927SAndroid Build Coastguard Worker                 const VkAllocationCallbacks *pAllocator)
55*61046927SAndroid Build Coastguard Worker {
56*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_device, device, _device);
57*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_event, event, _event);
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker    if (!event)
60*61046927SAndroid Build Coastguard Worker       return;
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker    TU_RMV(resource_destroy, device, event);
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    tu_bo_finish(device, event->bo);
65*61046927SAndroid Build Coastguard Worker    vk_object_free(&device->vk, pAllocator, event);
66*61046927SAndroid Build Coastguard Worker }
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_GetEventStatus(VkDevice _device,VkEvent _event)69*61046927SAndroid Build Coastguard Worker tu_GetEventStatus(VkDevice _device, VkEvent _event)
70*61046927SAndroid Build Coastguard Worker {
71*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_device, device, _device);
72*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_event, event, _event);
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    if (vk_device_is_lost(&device->vk))
75*61046927SAndroid Build Coastguard Worker       return VK_ERROR_DEVICE_LOST;
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker    if (*(uint64_t*) event->bo->map == 1)
78*61046927SAndroid Build Coastguard Worker       return VK_EVENT_SET;
79*61046927SAndroid Build Coastguard Worker    return VK_EVENT_RESET;
80*61046927SAndroid Build Coastguard Worker }
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_SetEvent(VkDevice _device,VkEvent _event)83*61046927SAndroid Build Coastguard Worker tu_SetEvent(VkDevice _device, VkEvent _event)
84*61046927SAndroid Build Coastguard Worker {
85*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_event, event, _event);
86*61046927SAndroid Build Coastguard Worker    *(uint64_t*) event->bo->map = 1;
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
89*61046927SAndroid Build Coastguard Worker }
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
tu_ResetEvent(VkDevice _device,VkEvent _event)92*61046927SAndroid Build Coastguard Worker tu_ResetEvent(VkDevice _device, VkEvent _event)
93*61046927SAndroid Build Coastguard Worker {
94*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_event, event, _event);
95*61046927SAndroid Build Coastguard Worker    *(uint64_t*) event->bo->map = 0;
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
98*61046927SAndroid Build Coastguard Worker }
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker template <chip CHIP>
101*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_CmdSetEvent2(VkCommandBuffer commandBuffer,VkEvent _event,const VkDependencyInfo * pDependencyInfo)102*61046927SAndroid Build Coastguard Worker tu_CmdSetEvent2(VkCommandBuffer commandBuffer,
103*61046927SAndroid Build Coastguard Worker                 VkEvent _event,
104*61046927SAndroid Build Coastguard Worker                 const VkDependencyInfo *pDependencyInfo)
105*61046927SAndroid Build Coastguard Worker {
106*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
107*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_event, event, _event);
108*61046927SAndroid Build Coastguard Worker    VkPipelineStageFlags2 src_stage_mask = 0;
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pDependencyInfo->memoryBarrierCount; i++)
111*61046927SAndroid Build Coastguard Worker       src_stage_mask |= pDependencyInfo->pMemoryBarriers[i].srcStageMask;
112*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pDependencyInfo->bufferMemoryBarrierCount; i++)
113*61046927SAndroid Build Coastguard Worker       src_stage_mask |= pDependencyInfo->pBufferMemoryBarriers[i].srcStageMask;
114*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pDependencyInfo->imageMemoryBarrierCount; i++)
115*61046927SAndroid Build Coastguard Worker       src_stage_mask |= pDependencyInfo->pImageMemoryBarriers[i].srcStageMask;
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker    tu_write_event<CHIP>(cmd, event, src_stage_mask, 1);
118*61046927SAndroid Build Coastguard Worker }
119*61046927SAndroid Build Coastguard Worker TU_GENX(tu_CmdSetEvent2);
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker template <chip CHIP>
122*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_CmdResetEvent2(VkCommandBuffer commandBuffer,VkEvent _event,VkPipelineStageFlags2 stageMask)123*61046927SAndroid Build Coastguard Worker tu_CmdResetEvent2(VkCommandBuffer commandBuffer,
124*61046927SAndroid Build Coastguard Worker                   VkEvent _event,
125*61046927SAndroid Build Coastguard Worker                   VkPipelineStageFlags2 stageMask)
126*61046927SAndroid Build Coastguard Worker {
127*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
128*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_event, event, _event);
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker    tu_write_event<CHIP>(cmd, event, stageMask, 0);
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker TU_GENX(tu_CmdResetEvent2);
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
tu_CmdWaitEvents2(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,const VkDependencyInfo * pDependencyInfos)135*61046927SAndroid Build Coastguard Worker tu_CmdWaitEvents2(VkCommandBuffer commandBuffer,
136*61046927SAndroid Build Coastguard Worker                   uint32_t eventCount,
137*61046927SAndroid Build Coastguard Worker                   const VkEvent *pEvents,
138*61046927SAndroid Build Coastguard Worker                   const VkDependencyInfo* pDependencyInfos)
139*61046927SAndroid Build Coastguard Worker {
140*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
141*61046927SAndroid Build Coastguard Worker    struct tu_cs *cs = cmd->state.pass ? &cmd->draw_cs : &cmd->cs;
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < eventCount; i++) {
144*61046927SAndroid Build Coastguard Worker       VK_FROM_HANDLE(tu_event, event, pEvents[i]);
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker       tu_cs_emit_pkt7(cs, CP_WAIT_REG_MEM, 6);
147*61046927SAndroid Build Coastguard Worker       tu_cs_emit(cs, CP_WAIT_REG_MEM_0_FUNCTION(WRITE_EQ) |
148*61046927SAndroid Build Coastguard Worker                      CP_WAIT_REG_MEM_0_POLL(POLL_MEMORY));
149*61046927SAndroid Build Coastguard Worker       tu_cs_emit_qw(cs, event->bo->iova); /* POLL_ADDR_LO/HI */
150*61046927SAndroid Build Coastguard Worker       tu_cs_emit(cs, CP_WAIT_REG_MEM_3_REF(1));
151*61046927SAndroid Build Coastguard Worker       tu_cs_emit(cs, CP_WAIT_REG_MEM_4_MASK(~0u));
152*61046927SAndroid Build Coastguard Worker       tu_cs_emit(cs, CP_WAIT_REG_MEM_5_DELAY_LOOP_CYCLES(20));
153*61046927SAndroid Build Coastguard Worker    }
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker    tu_barrier(cmd, eventCount, pDependencyInfos);
156*61046927SAndroid Build Coastguard Worker }
157