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