xref: /aosp_15_r20/external/mesa3d/src/nouveau/vulkan/nvk_event.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Collabora Ltd. and Red Hat Inc.
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker #include "nvk_event.h"
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #include "nvk_cmd_buffer.h"
8*61046927SAndroid Build Coastguard Worker #include "nvk_device.h"
9*61046927SAndroid Build Coastguard Worker #include "nvk_entrypoints.h"
10*61046927SAndroid Build Coastguard Worker #include "nvk_mme.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include "nv_push_cl906f.h"
13*61046927SAndroid Build Coastguard Worker #include "nv_push_cl9097.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #define NVK_EVENT_MEM_SIZE sizeof(VkResult)
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
nvk_CreateEvent(VkDevice device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent)18*61046927SAndroid Build Coastguard Worker nvk_CreateEvent(VkDevice device,
19*61046927SAndroid Build Coastguard Worker                 const VkEventCreateInfo *pCreateInfo,
20*61046927SAndroid Build Coastguard Worker                 const VkAllocationCallbacks *pAllocator,
21*61046927SAndroid Build Coastguard Worker                 VkEvent *pEvent)
22*61046927SAndroid Build Coastguard Worker {
23*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_device, dev, device);
24*61046927SAndroid Build Coastguard Worker    struct nvk_event *event;
25*61046927SAndroid Build Coastguard Worker    VkResult result;
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker    event = vk_object_zalloc(&dev->vk, pAllocator, sizeof(*event),
28*61046927SAndroid Build Coastguard Worker                             VK_OBJECT_TYPE_EVENT);
29*61046927SAndroid Build Coastguard Worker    if (!event)
30*61046927SAndroid Build Coastguard Worker       return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker    result = nvk_heap_alloc(dev, &dev->event_heap,
33*61046927SAndroid Build Coastguard Worker                            NVK_EVENT_MEM_SIZE, NVK_EVENT_MEM_SIZE,
34*61046927SAndroid Build Coastguard Worker                            &event->addr, (void **)&event->status);
35*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS) {
36*61046927SAndroid Build Coastguard Worker       vk_object_free(&dev->vk, pAllocator, event);
37*61046927SAndroid Build Coastguard Worker       return result;
38*61046927SAndroid Build Coastguard Worker    }
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker    *event->status = VK_EVENT_RESET;
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker    *pEvent = nvk_event_to_handle(event);
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
45*61046927SAndroid Build Coastguard Worker }
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
nvk_DestroyEvent(VkDevice device,VkEvent _event,const VkAllocationCallbacks * pAllocator)48*61046927SAndroid Build Coastguard Worker nvk_DestroyEvent(VkDevice device,
49*61046927SAndroid Build Coastguard Worker                  VkEvent _event,
50*61046927SAndroid Build Coastguard Worker                  const VkAllocationCallbacks *pAllocator)
51*61046927SAndroid Build Coastguard Worker {
52*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_device, dev, device);
53*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_event, event, _event);
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker    if (!event)
56*61046927SAndroid Build Coastguard Worker       return;
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker    nvk_heap_free(dev, &dev->event_heap, event->addr, NVK_EVENT_MEM_SIZE);
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    vk_object_free(&dev->vk, pAllocator, event);
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
nvk_GetEventStatus(VkDevice device,VkEvent _event)64*61046927SAndroid Build Coastguard Worker nvk_GetEventStatus(VkDevice device,
65*61046927SAndroid Build Coastguard Worker                    VkEvent _event)
66*61046927SAndroid Build Coastguard Worker {
67*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_event, event, _event);
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    return *event->status;
70*61046927SAndroid Build Coastguard Worker }
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
nvk_SetEvent(VkDevice device,VkEvent _event)73*61046927SAndroid Build Coastguard Worker nvk_SetEvent(VkDevice device,
74*61046927SAndroid Build Coastguard Worker              VkEvent _event)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_event, event, _event);
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker    *event->status = VK_EVENT_SET;
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
nvk_ResetEvent(VkDevice device,VkEvent _event)84*61046927SAndroid Build Coastguard Worker nvk_ResetEvent(VkDevice device,
85*61046927SAndroid Build Coastguard Worker                VkEvent _event)
86*61046927SAndroid Build Coastguard Worker {
87*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_event, event, _event);
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    *event->status = VK_EVENT_RESET;
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
92*61046927SAndroid Build Coastguard Worker }
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker static bool
clear_bits64(uint64_t * bitfield,uint64_t bits)95*61046927SAndroid Build Coastguard Worker clear_bits64(uint64_t *bitfield, uint64_t bits)
96*61046927SAndroid Build Coastguard Worker {
97*61046927SAndroid Build Coastguard Worker    bool has_bits = (*bitfield & bits) != 0;
98*61046927SAndroid Build Coastguard Worker    *bitfield &= ~bits;
99*61046927SAndroid Build Coastguard Worker    return has_bits;
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker uint32_t
vk_stage_flags_to_nv9097_pipeline_location(VkPipelineStageFlags2 flags)103*61046927SAndroid Build Coastguard Worker vk_stage_flags_to_nv9097_pipeline_location(VkPipelineStageFlags2 flags)
104*61046927SAndroid Build Coastguard Worker {
105*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT |
106*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT |
107*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT |
108*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT |
109*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT|
110*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_COPY_BIT|
111*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_RESOLVE_BIT|
112*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_BLIT_BIT|
113*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_CLEAR_BIT))
114*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_ALL;
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT))
117*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_DEPTH_TEST;
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT))
120*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_PIXEL_SHADER;
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT))
123*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_ZCULL;
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT))
126*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_STREAMING_OUTPUT;
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT |
129*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT))
130*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_GEOMETRY_SHADER;
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT))
133*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_TESSELATION_SHADER;
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT))
136*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_TESSELATION_INIT_SHADER;
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT))
139*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_VERTEX_SHADER;
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    if (clear_bits64(&flags, VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT |
142*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT |
143*61046927SAndroid Build Coastguard Worker                             VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT))
144*61046927SAndroid Build Coastguard Worker       return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_DATA_ASSEMBLER;
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker    clear_bits64(&flags, VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT |
147*61046927SAndroid Build Coastguard Worker                         VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT |
148*61046927SAndroid Build Coastguard Worker                         VK_PIPELINE_STAGE_2_HOST_BIT |
149*61046927SAndroid Build Coastguard Worker                         VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT);
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker    /* TODO: Doing this on 3D will likely cause a WFI which is probably ok but,
152*61046927SAndroid Build Coastguard Worker     * if we tracked which subchannel we've used most recently, we can probably
153*61046927SAndroid Build Coastguard Worker     * do better than that.
154*61046927SAndroid Build Coastguard Worker     */
155*61046927SAndroid Build Coastguard Worker    clear_bits64(&flags, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT);
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker    assert(flags == 0);
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    return NV9097_SET_REPORT_SEMAPHORE_D_PIPELINE_LOCATION_NONE;
160*61046927SAndroid Build Coastguard Worker }
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
nvk_CmdSetEvent2(VkCommandBuffer commandBuffer,VkEvent _event,const VkDependencyInfo * pDependencyInfo)163*61046927SAndroid Build Coastguard Worker nvk_CmdSetEvent2(VkCommandBuffer commandBuffer,
164*61046927SAndroid Build Coastguard Worker                  VkEvent _event,
165*61046927SAndroid Build Coastguard Worker                  const VkDependencyInfo *pDependencyInfo)
166*61046927SAndroid Build Coastguard Worker {
167*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
168*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_event, event, _event);
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker    nvk_cmd_flush_wait_dep(cmd, pDependencyInfo, false);
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker    VkPipelineStageFlags2 stages = 0;
173*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pDependencyInfo->memoryBarrierCount; i++)
174*61046927SAndroid Build Coastguard Worker       stages |= pDependencyInfo->pMemoryBarriers[i].srcStageMask;
175*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pDependencyInfo->bufferMemoryBarrierCount; i++)
176*61046927SAndroid Build Coastguard Worker       stages |= pDependencyInfo->pBufferMemoryBarriers[i].srcStageMask;
177*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < pDependencyInfo->imageMemoryBarrierCount; i++)
178*61046927SAndroid Build Coastguard Worker       stages |= pDependencyInfo->pImageMemoryBarriers[i].srcStageMask;
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker    struct nv_push *p = nvk_cmd_buffer_push(cmd, 5);
181*61046927SAndroid Build Coastguard Worker    P_MTHD(p, NV9097, SET_REPORT_SEMAPHORE_A);
182*61046927SAndroid Build Coastguard Worker    P_NV9097_SET_REPORT_SEMAPHORE_A(p, event->addr >> 32);
183*61046927SAndroid Build Coastguard Worker    P_NV9097_SET_REPORT_SEMAPHORE_B(p, event->addr);
184*61046927SAndroid Build Coastguard Worker    P_NV9097_SET_REPORT_SEMAPHORE_C(p, VK_EVENT_SET);
185*61046927SAndroid Build Coastguard Worker    P_NV9097_SET_REPORT_SEMAPHORE_D(p, {
186*61046927SAndroid Build Coastguard Worker       .operation = OPERATION_RELEASE,
187*61046927SAndroid Build Coastguard Worker       .release = RELEASE_AFTER_ALL_PRECEEDING_WRITES_COMPLETE,
188*61046927SAndroid Build Coastguard Worker       .pipeline_location = vk_stage_flags_to_nv9097_pipeline_location(stages),
189*61046927SAndroid Build Coastguard Worker       .structure_size = STRUCTURE_SIZE_ONE_WORD,
190*61046927SAndroid Build Coastguard Worker    });
191*61046927SAndroid Build Coastguard Worker }
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
nvk_CmdResetEvent2(VkCommandBuffer commandBuffer,VkEvent _event,VkPipelineStageFlags2 stageMask)194*61046927SAndroid Build Coastguard Worker nvk_CmdResetEvent2(VkCommandBuffer commandBuffer,
195*61046927SAndroid Build Coastguard Worker                    VkEvent _event,
196*61046927SAndroid Build Coastguard Worker                    VkPipelineStageFlags2 stageMask)
197*61046927SAndroid Build Coastguard Worker {
198*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
199*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_event, event, _event);
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker    struct nv_push *p = nvk_cmd_buffer_push(cmd, 5);
202*61046927SAndroid Build Coastguard Worker    P_MTHD(p, NV9097, SET_REPORT_SEMAPHORE_A);
203*61046927SAndroid Build Coastguard Worker    P_NV9097_SET_REPORT_SEMAPHORE_A(p, event->addr >> 32);
204*61046927SAndroid Build Coastguard Worker    P_NV9097_SET_REPORT_SEMAPHORE_B(p, event->addr);
205*61046927SAndroid Build Coastguard Worker    P_NV9097_SET_REPORT_SEMAPHORE_C(p, VK_EVENT_RESET);
206*61046927SAndroid Build Coastguard Worker    P_NV9097_SET_REPORT_SEMAPHORE_D(p, {
207*61046927SAndroid Build Coastguard Worker       .operation = OPERATION_RELEASE,
208*61046927SAndroid Build Coastguard Worker       .release = RELEASE_AFTER_ALL_PRECEEDING_WRITES_COMPLETE,
209*61046927SAndroid Build Coastguard Worker       .pipeline_location =
210*61046927SAndroid Build Coastguard Worker          vk_stage_flags_to_nv9097_pipeline_location(stageMask),
211*61046927SAndroid Build Coastguard Worker       .structure_size = STRUCTURE_SIZE_ONE_WORD,
212*61046927SAndroid Build Coastguard Worker    });
213*61046927SAndroid Build Coastguard Worker }
214*61046927SAndroid Build Coastguard Worker 
215*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
nvk_CmdWaitEvents2(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,const VkDependencyInfo * pDependencyInfos)216*61046927SAndroid Build Coastguard Worker nvk_CmdWaitEvents2(VkCommandBuffer commandBuffer,
217*61046927SAndroid Build Coastguard Worker                    uint32_t eventCount,
218*61046927SAndroid Build Coastguard Worker                    const VkEvent *pEvents,
219*61046927SAndroid Build Coastguard Worker                    const VkDependencyInfo *pDependencyInfos)
220*61046927SAndroid Build Coastguard Worker {
221*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < eventCount; i++) {
224*61046927SAndroid Build Coastguard Worker       VK_FROM_HANDLE(nvk_event, event, pEvents[i]);
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker       struct nv_push *p = nvk_cmd_buffer_push(cmd, 5);
227*61046927SAndroid Build Coastguard Worker       __push_mthd(p, SUBC_NV9097, NV906F_SEMAPHOREA);
228*61046927SAndroid Build Coastguard Worker       P_NV906F_SEMAPHOREA(p, event->addr >> 32);
229*61046927SAndroid Build Coastguard Worker       P_NV906F_SEMAPHOREB(p, (event->addr & UINT32_MAX) >> 2);
230*61046927SAndroid Build Coastguard Worker       P_NV906F_SEMAPHOREC(p, VK_EVENT_SET);
231*61046927SAndroid Build Coastguard Worker       P_NV906F_SEMAPHORED(p, {
232*61046927SAndroid Build Coastguard Worker          .operation = OPERATION_ACQUIRE,
233*61046927SAndroid Build Coastguard Worker          .acquire_switch = ACQUIRE_SWITCH_ENABLED,
234*61046927SAndroid Build Coastguard Worker          .release_size = RELEASE_SIZE_4BYTE,
235*61046927SAndroid Build Coastguard Worker       });
236*61046927SAndroid Build Coastguard Worker    }
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker    nvk_cmd_invalidate_deps(cmd, eventCount, pDependencyInfos);
239*61046927SAndroid Build Coastguard Worker }
240