xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_synchronization.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2021 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include "vk_synchronization.h"
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #include "vk_alloc.h"
27*61046927SAndroid Build Coastguard Worker #include "vk_command_buffer.h"
28*61046927SAndroid Build Coastguard Worker #include "vk_common_entrypoints.h"
29*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
30*61046927SAndroid Build Coastguard Worker #include "vk_queue.h"
31*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
32*61046927SAndroid Build Coastguard Worker #include "../wsi/wsi_common.h"
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker VkAccessFlags2
vk_expand_src_access_flags2(VkPipelineStageFlags2 stages,VkAccessFlags2 access)35*61046927SAndroid Build Coastguard Worker vk_expand_src_access_flags2(VkPipelineStageFlags2 stages,
36*61046927SAndroid Build Coastguard Worker                             VkAccessFlags2 access)
37*61046927SAndroid Build Coastguard Worker {
38*61046927SAndroid Build Coastguard Worker    if (access & VK_ACCESS_2_MEMORY_WRITE_BIT)
39*61046927SAndroid Build Coastguard Worker       access |= vk_write_access2_for_pipeline_stage_flags2(stages);;
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker    if (access & VK_ACCESS_2_SHADER_WRITE_BIT)
42*61046927SAndroid Build Coastguard Worker       access |= VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT;
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker    return access;
45*61046927SAndroid Build Coastguard Worker }
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker VkAccessFlags2
vk_expand_dst_access_flags2(VkPipelineStageFlags2 stages,VkAccessFlags2 access)48*61046927SAndroid Build Coastguard Worker vk_expand_dst_access_flags2(VkPipelineStageFlags2 stages,
49*61046927SAndroid Build Coastguard Worker                             VkAccessFlags2 access)
50*61046927SAndroid Build Coastguard Worker {
51*61046927SAndroid Build Coastguard Worker    if (access & VK_ACCESS_2_MEMORY_READ_BIT)
52*61046927SAndroid Build Coastguard Worker       access |= vk_read_access2_for_pipeline_stage_flags2(stages);
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker    if (access & VK_ACCESS_2_SHADER_READ_BIT)
55*61046927SAndroid Build Coastguard Worker       access |= VK_ACCESS_2_SHADER_SAMPLED_READ_BIT |
56*61046927SAndroid Build Coastguard Worker                 VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
57*61046927SAndroid Build Coastguard Worker                 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR;
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker    return access;
60*61046927SAndroid Build Coastguard Worker }
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker VkAccessFlags2
vk_filter_src_access_flags2(VkPipelineStageFlags2 stages,VkAccessFlags2 access)63*61046927SAndroid Build Coastguard Worker vk_filter_src_access_flags2(VkPipelineStageFlags2 stages,
64*61046927SAndroid Build Coastguard Worker                             VkAccessFlags2 access)
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker    const VkAccessFlags2 all_write_access =
67*61046927SAndroid Build Coastguard Worker       vk_write_access2_for_pipeline_stage_flags2(stages);
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    /* We only care about write access in src flags */
70*61046927SAndroid Build Coastguard Worker    return vk_expand_src_access_flags2(stages, access) & all_write_access;
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker VkAccessFlags2
vk_filter_dst_access_flags2(VkPipelineStageFlags2 stages,VkAccessFlags2 access)74*61046927SAndroid Build Coastguard Worker vk_filter_dst_access_flags2(VkPipelineStageFlags2 stages,
75*61046927SAndroid Build Coastguard Worker                             VkAccessFlags2 access)
76*61046927SAndroid Build Coastguard Worker {
77*61046927SAndroid Build Coastguard Worker    const VkAccessFlags2 all_read_access =
78*61046927SAndroid Build Coastguard Worker       vk_read_access2_for_pipeline_stage_flags2(stages);
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    /* We only care about read access in dst flags */
81*61046927SAndroid Build Coastguard Worker    return vk_expand_dst_access_flags2(stages, access) & all_read_access;
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
vk_common_CmdWriteTimestamp(VkCommandBuffer commandBuffer,VkPipelineStageFlagBits pipelineStage,VkQueryPool queryPool,uint32_t query)85*61046927SAndroid Build Coastguard Worker vk_common_CmdWriteTimestamp(
86*61046927SAndroid Build Coastguard Worker    VkCommandBuffer                             commandBuffer,
87*61046927SAndroid Build Coastguard Worker    VkPipelineStageFlagBits                     pipelineStage,
88*61046927SAndroid Build Coastguard Worker    VkQueryPool                                 queryPool,
89*61046927SAndroid Build Coastguard Worker    uint32_t                                    query)
90*61046927SAndroid Build Coastguard Worker {
91*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, commandBuffer);
92*61046927SAndroid Build Coastguard Worker    struct vk_device *device = cmd_buffer->base.device;
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker    device->dispatch_table.CmdWriteTimestamp2(commandBuffer,
95*61046927SAndroid Build Coastguard Worker                                              (VkPipelineStageFlags2) pipelineStage,
96*61046927SAndroid Build Coastguard Worker                                              queryPool,
97*61046927SAndroid Build Coastguard Worker                                              query);
98*61046927SAndroid Build Coastguard Worker }
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker static VkMemoryBarrier2
upgrade_memory_barrier(const VkMemoryBarrier * barrier,VkPipelineStageFlags2 src_stage_mask2,VkPipelineStageFlags2 dst_stage_mask2)101*61046927SAndroid Build Coastguard Worker upgrade_memory_barrier(const VkMemoryBarrier *barrier,
102*61046927SAndroid Build Coastguard Worker                        VkPipelineStageFlags2 src_stage_mask2,
103*61046927SAndroid Build Coastguard Worker                        VkPipelineStageFlags2 dst_stage_mask2)
104*61046927SAndroid Build Coastguard Worker {
105*61046927SAndroid Build Coastguard Worker    return (VkMemoryBarrier2) {
106*61046927SAndroid Build Coastguard Worker       .sType         = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,
107*61046927SAndroid Build Coastguard Worker       .pNext         = barrier->pNext,
108*61046927SAndroid Build Coastguard Worker       .srcStageMask  = src_stage_mask2,
109*61046927SAndroid Build Coastguard Worker       .srcAccessMask = (VkAccessFlags2) barrier->srcAccessMask,
110*61046927SAndroid Build Coastguard Worker       .dstStageMask  = dst_stage_mask2,
111*61046927SAndroid Build Coastguard Worker       .dstAccessMask = (VkAccessFlags2) barrier->dstAccessMask,
112*61046927SAndroid Build Coastguard Worker    };
113*61046927SAndroid Build Coastguard Worker }
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker static VkBufferMemoryBarrier2
upgrade_buffer_memory_barrier(const VkBufferMemoryBarrier * barrier,VkPipelineStageFlags2 src_stage_mask2,VkPipelineStageFlags2 dst_stage_mask2)116*61046927SAndroid Build Coastguard Worker upgrade_buffer_memory_barrier(const VkBufferMemoryBarrier *barrier,
117*61046927SAndroid Build Coastguard Worker                               VkPipelineStageFlags2 src_stage_mask2,
118*61046927SAndroid Build Coastguard Worker                               VkPipelineStageFlags2 dst_stage_mask2)
119*61046927SAndroid Build Coastguard Worker {
120*61046927SAndroid Build Coastguard Worker    return (VkBufferMemoryBarrier2) {
121*61046927SAndroid Build Coastguard Worker       .sType                = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2,
122*61046927SAndroid Build Coastguard Worker       .pNext                = barrier->pNext,
123*61046927SAndroid Build Coastguard Worker       .srcStageMask         = src_stage_mask2,
124*61046927SAndroid Build Coastguard Worker       .srcAccessMask        = (VkAccessFlags2) barrier->srcAccessMask,
125*61046927SAndroid Build Coastguard Worker       .dstStageMask         = dst_stage_mask2,
126*61046927SAndroid Build Coastguard Worker       .dstAccessMask        = (VkAccessFlags2) barrier->dstAccessMask,
127*61046927SAndroid Build Coastguard Worker       .srcQueueFamilyIndex  = barrier->srcQueueFamilyIndex,
128*61046927SAndroid Build Coastguard Worker       .dstQueueFamilyIndex  = barrier->dstQueueFamilyIndex,
129*61046927SAndroid Build Coastguard Worker       .buffer               = barrier->buffer,
130*61046927SAndroid Build Coastguard Worker       .offset               = barrier->offset,
131*61046927SAndroid Build Coastguard Worker       .size                 = barrier->size,
132*61046927SAndroid Build Coastguard Worker    };
133*61046927SAndroid Build Coastguard Worker }
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker static VkImageMemoryBarrier2
upgrade_image_memory_barrier(const VkImageMemoryBarrier * barrier,VkPipelineStageFlags2 src_stage_mask2,VkPipelineStageFlags2 dst_stage_mask2)136*61046927SAndroid Build Coastguard Worker upgrade_image_memory_barrier(const VkImageMemoryBarrier *barrier,
137*61046927SAndroid Build Coastguard Worker                              VkPipelineStageFlags2 src_stage_mask2,
138*61046927SAndroid Build Coastguard Worker                              VkPipelineStageFlags2 dst_stage_mask2)
139*61046927SAndroid Build Coastguard Worker {
140*61046927SAndroid Build Coastguard Worker    return (VkImageMemoryBarrier2) {
141*61046927SAndroid Build Coastguard Worker       .sType                = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
142*61046927SAndroid Build Coastguard Worker       .pNext                = barrier->pNext,
143*61046927SAndroid Build Coastguard Worker       .srcStageMask         = src_stage_mask2,
144*61046927SAndroid Build Coastguard Worker       .srcAccessMask        = (VkAccessFlags2) barrier->srcAccessMask,
145*61046927SAndroid Build Coastguard Worker       .dstStageMask         = dst_stage_mask2,
146*61046927SAndroid Build Coastguard Worker       .dstAccessMask        = (VkAccessFlags2) barrier->dstAccessMask,
147*61046927SAndroid Build Coastguard Worker       .oldLayout            = barrier->oldLayout,
148*61046927SAndroid Build Coastguard Worker       .newLayout            = barrier->newLayout,
149*61046927SAndroid Build Coastguard Worker       .srcQueueFamilyIndex  = barrier->srcQueueFamilyIndex,
150*61046927SAndroid Build Coastguard Worker       .dstQueueFamilyIndex  = barrier->dstQueueFamilyIndex,
151*61046927SAndroid Build Coastguard Worker       .image                = barrier->image,
152*61046927SAndroid Build Coastguard Worker       .subresourceRange     = barrier->subresourceRange,
153*61046927SAndroid Build Coastguard Worker    };
154*61046927SAndroid Build Coastguard Worker }
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
vk_common_CmdPipelineBarrier(VkCommandBuffer commandBuffer,VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,VkDependencyFlags dependencyFlags,uint32_t memoryBarrierCount,const VkMemoryBarrier * pMemoryBarriers,uint32_t bufferMemoryBarrierCount,const VkBufferMemoryBarrier * pBufferMemoryBarriers,uint32_t imageMemoryBarrierCount,const VkImageMemoryBarrier * pImageMemoryBarriers)157*61046927SAndroid Build Coastguard Worker vk_common_CmdPipelineBarrier(
158*61046927SAndroid Build Coastguard Worker     VkCommandBuffer                             commandBuffer,
159*61046927SAndroid Build Coastguard Worker     VkPipelineStageFlags                        srcStageMask,
160*61046927SAndroid Build Coastguard Worker     VkPipelineStageFlags                        dstStageMask,
161*61046927SAndroid Build Coastguard Worker     VkDependencyFlags                           dependencyFlags,
162*61046927SAndroid Build Coastguard Worker     uint32_t                                    memoryBarrierCount,
163*61046927SAndroid Build Coastguard Worker     const VkMemoryBarrier*                      pMemoryBarriers,
164*61046927SAndroid Build Coastguard Worker     uint32_t                                    bufferMemoryBarrierCount,
165*61046927SAndroid Build Coastguard Worker     const VkBufferMemoryBarrier*                pBufferMemoryBarriers,
166*61046927SAndroid Build Coastguard Worker     uint32_t                                    imageMemoryBarrierCount,
167*61046927SAndroid Build Coastguard Worker     const VkImageMemoryBarrier*                 pImageMemoryBarriers)
168*61046927SAndroid Build Coastguard Worker {
169*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, commandBuffer);
170*61046927SAndroid Build Coastguard Worker    struct vk_device *device = cmd_buffer->base.device;
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkMemoryBarrier2, memory_barriers, memoryBarrierCount);
173*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkBufferMemoryBarrier2, buffer_barriers, bufferMemoryBarrierCount);
174*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkImageMemoryBarrier2, image_barriers, imageMemoryBarrierCount);
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker    VkPipelineStageFlags2 src_stage_mask2 = (VkPipelineStageFlags2) srcStageMask;
177*61046927SAndroid Build Coastguard Worker    VkPipelineStageFlags2 dst_stage_mask2 = (VkPipelineStageFlags2) dstStageMask;
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < memoryBarrierCount; i++) {
180*61046927SAndroid Build Coastguard Worker       memory_barriers[i] = upgrade_memory_barrier(&pMemoryBarriers[i],
181*61046927SAndroid Build Coastguard Worker                                                   src_stage_mask2,
182*61046927SAndroid Build Coastguard Worker                                                   dst_stage_mask2);
183*61046927SAndroid Build Coastguard Worker    }
184*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < bufferMemoryBarrierCount; i++) {
185*61046927SAndroid Build Coastguard Worker       buffer_barriers[i] = upgrade_buffer_memory_barrier(&pBufferMemoryBarriers[i],
186*61046927SAndroid Build Coastguard Worker                                                          src_stage_mask2,
187*61046927SAndroid Build Coastguard Worker                                                          dst_stage_mask2);
188*61046927SAndroid Build Coastguard Worker    }
189*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < imageMemoryBarrierCount; i++) {
190*61046927SAndroid Build Coastguard Worker       image_barriers[i] = upgrade_image_memory_barrier(&pImageMemoryBarriers[i],
191*61046927SAndroid Build Coastguard Worker                                                        src_stage_mask2,
192*61046927SAndroid Build Coastguard Worker                                                        dst_stage_mask2);
193*61046927SAndroid Build Coastguard Worker    }
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker    VkDependencyInfo dep_info = {
196*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
197*61046927SAndroid Build Coastguard Worker       .memoryBarrierCount = memoryBarrierCount,
198*61046927SAndroid Build Coastguard Worker       .pMemoryBarriers = memory_barriers,
199*61046927SAndroid Build Coastguard Worker       .bufferMemoryBarrierCount = bufferMemoryBarrierCount,
200*61046927SAndroid Build Coastguard Worker       .pBufferMemoryBarriers = buffer_barriers,
201*61046927SAndroid Build Coastguard Worker       .imageMemoryBarrierCount = imageMemoryBarrierCount,
202*61046927SAndroid Build Coastguard Worker       .pImageMemoryBarriers = image_barriers,
203*61046927SAndroid Build Coastguard Worker    };
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker    device->dispatch_table.CmdPipelineBarrier2(commandBuffer, &dep_info);
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(memory_barriers);
208*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(buffer_barriers);
209*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(image_barriers);
210*61046927SAndroid Build Coastguard Worker }
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
vk_common_CmdSetEvent(VkCommandBuffer commandBuffer,VkEvent event,VkPipelineStageFlags stageMask)213*61046927SAndroid Build Coastguard Worker vk_common_CmdSetEvent(
214*61046927SAndroid Build Coastguard Worker     VkCommandBuffer                             commandBuffer,
215*61046927SAndroid Build Coastguard Worker     VkEvent                                     event,
216*61046927SAndroid Build Coastguard Worker     VkPipelineStageFlags                        stageMask)
217*61046927SAndroid Build Coastguard Worker {
218*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, commandBuffer);
219*61046927SAndroid Build Coastguard Worker    struct vk_device *device = cmd_buffer->base.device;
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker    VkMemoryBarrier2 mem_barrier = {
222*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,
223*61046927SAndroid Build Coastguard Worker       .srcStageMask = (VkPipelineStageFlags2) stageMask,
224*61046927SAndroid Build Coastguard Worker       .dstStageMask = (VkPipelineStageFlags2) stageMask,
225*61046927SAndroid Build Coastguard Worker    };
226*61046927SAndroid Build Coastguard Worker    VkDependencyInfo dep_info = {
227*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
228*61046927SAndroid Build Coastguard Worker       .memoryBarrierCount = 1,
229*61046927SAndroid Build Coastguard Worker       .pMemoryBarriers = &mem_barrier,
230*61046927SAndroid Build Coastguard Worker    };
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker    device->dispatch_table.CmdSetEvent2(commandBuffer, event, &dep_info);
233*61046927SAndroid Build Coastguard Worker }
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
vk_common_CmdResetEvent(VkCommandBuffer commandBuffer,VkEvent event,VkPipelineStageFlags stageMask)236*61046927SAndroid Build Coastguard Worker vk_common_CmdResetEvent(
237*61046927SAndroid Build Coastguard Worker     VkCommandBuffer                             commandBuffer,
238*61046927SAndroid Build Coastguard Worker     VkEvent                                     event,
239*61046927SAndroid Build Coastguard Worker     VkPipelineStageFlags                        stageMask)
240*61046927SAndroid Build Coastguard Worker {
241*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, commandBuffer);
242*61046927SAndroid Build Coastguard Worker    struct vk_device *device = cmd_buffer->base.device;
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker    device->dispatch_table.CmdResetEvent2(commandBuffer,
245*61046927SAndroid Build Coastguard Worker                                          event,
246*61046927SAndroid Build Coastguard Worker                                          (VkPipelineStageFlags2) stageMask);
247*61046927SAndroid Build Coastguard Worker }
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
vk_common_CmdWaitEvents(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,VkPipelineStageFlags srcStageMask,VkPipelineStageFlags destStageMask,uint32_t memoryBarrierCount,const VkMemoryBarrier * pMemoryBarriers,uint32_t bufferMemoryBarrierCount,const VkBufferMemoryBarrier * pBufferMemoryBarriers,uint32_t imageMemoryBarrierCount,const VkImageMemoryBarrier * pImageMemoryBarriers)250*61046927SAndroid Build Coastguard Worker vk_common_CmdWaitEvents(
251*61046927SAndroid Build Coastguard Worker     VkCommandBuffer                             commandBuffer,
252*61046927SAndroid Build Coastguard Worker     uint32_t                                    eventCount,
253*61046927SAndroid Build Coastguard Worker     const VkEvent*                              pEvents,
254*61046927SAndroid Build Coastguard Worker     VkPipelineStageFlags                        srcStageMask,
255*61046927SAndroid Build Coastguard Worker     VkPipelineStageFlags                        destStageMask,
256*61046927SAndroid Build Coastguard Worker     uint32_t                                    memoryBarrierCount,
257*61046927SAndroid Build Coastguard Worker     const VkMemoryBarrier*                      pMemoryBarriers,
258*61046927SAndroid Build Coastguard Worker     uint32_t                                    bufferMemoryBarrierCount,
259*61046927SAndroid Build Coastguard Worker     const VkBufferMemoryBarrier*                pBufferMemoryBarriers,
260*61046927SAndroid Build Coastguard Worker     uint32_t                                    imageMemoryBarrierCount,
261*61046927SAndroid Build Coastguard Worker     const VkImageMemoryBarrier*                 pImageMemoryBarriers)
262*61046927SAndroid Build Coastguard Worker {
263*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, commandBuffer);
264*61046927SAndroid Build Coastguard Worker    struct vk_device *device = cmd_buffer->base.device;
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker    if (eventCount == 0)
267*61046927SAndroid Build Coastguard Worker       return;
268*61046927SAndroid Build Coastguard Worker 
269*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkDependencyInfo, deps, eventCount);
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker    /* Note that dstStageMask and srcStageMask in the CmdWaitEvent2() call
272*61046927SAndroid Build Coastguard Worker     * are the same.  This is to match the CmdSetEvent2() call from
273*61046927SAndroid Build Coastguard Worker     * vk_common_CmdSetEvent().  The actual src->dst stage barrier will
274*61046927SAndroid Build Coastguard Worker     * happen as part of the CmdPipelineBarrier() call below.
275*61046927SAndroid Build Coastguard Worker     */
276*61046927SAndroid Build Coastguard Worker    VkMemoryBarrier2 stage_barrier = {
277*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,
278*61046927SAndroid Build Coastguard Worker       .srcStageMask = srcStageMask,
279*61046927SAndroid Build Coastguard Worker       .dstStageMask = srcStageMask,
280*61046927SAndroid Build Coastguard Worker    };
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < eventCount; i++) {
283*61046927SAndroid Build Coastguard Worker       deps[i] = (VkDependencyInfo) {
284*61046927SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
285*61046927SAndroid Build Coastguard Worker          .memoryBarrierCount = 1,
286*61046927SAndroid Build Coastguard Worker          .pMemoryBarriers = &stage_barrier,
287*61046927SAndroid Build Coastguard Worker       };
288*61046927SAndroid Build Coastguard Worker    }
289*61046927SAndroid Build Coastguard Worker    device->dispatch_table.CmdWaitEvents2(commandBuffer, eventCount, pEvents, deps);
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(deps);
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker    /* Setting dependency to 0 because :
294*61046927SAndroid Build Coastguard Worker     *
295*61046927SAndroid Build Coastguard Worker     *    - For BY_REGION_BIT and VIEW_LOCAL_BIT, events are not allowed inside a
296*61046927SAndroid Build Coastguard Worker     *      render pass so these don't apply.
297*61046927SAndroid Build Coastguard Worker     *
298*61046927SAndroid Build Coastguard Worker     *    - For DEVICE_GROUP_BIT, we have the following bit of spec text:
299*61046927SAndroid Build Coastguard Worker     *
300*61046927SAndroid Build Coastguard Worker     *        "Semaphore and event dependencies are device-local and only
301*61046927SAndroid Build Coastguard Worker     *         execute on the one physical device that performs the
302*61046927SAndroid Build Coastguard Worker     *         dependency."
303*61046927SAndroid Build Coastguard Worker     */
304*61046927SAndroid Build Coastguard Worker    const VkDependencyFlags dep_flags = 0;
305*61046927SAndroid Build Coastguard Worker 
306*61046927SAndroid Build Coastguard Worker    device->dispatch_table.CmdPipelineBarrier(commandBuffer,
307*61046927SAndroid Build Coastguard Worker                                              srcStageMask, destStageMask,
308*61046927SAndroid Build Coastguard Worker                                              dep_flags,
309*61046927SAndroid Build Coastguard Worker                                              memoryBarrierCount, pMemoryBarriers,
310*61046927SAndroid Build Coastguard Worker                                              bufferMemoryBarrierCount, pBufferMemoryBarriers,
311*61046927SAndroid Build Coastguard Worker                                              imageMemoryBarrierCount, pImageMemoryBarriers);
312*61046927SAndroid Build Coastguard Worker }
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
vk_common_CmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer,VkPipelineStageFlagBits pipelineStage,VkBuffer dstBuffer,VkDeviceSize dstOffset,uint32_t marker)315*61046927SAndroid Build Coastguard Worker vk_common_CmdWriteBufferMarkerAMD(
316*61046927SAndroid Build Coastguard Worker     VkCommandBuffer                             commandBuffer,
317*61046927SAndroid Build Coastguard Worker     VkPipelineStageFlagBits                     pipelineStage,
318*61046927SAndroid Build Coastguard Worker     VkBuffer                                    dstBuffer,
319*61046927SAndroid Build Coastguard Worker     VkDeviceSize                                dstOffset,
320*61046927SAndroid Build Coastguard Worker     uint32_t                                    marker)
321*61046927SAndroid Build Coastguard Worker {
322*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, commandBuffer);
323*61046927SAndroid Build Coastguard Worker    struct vk_device *device = cmd_buffer->base.device;
324*61046927SAndroid Build Coastguard Worker 
325*61046927SAndroid Build Coastguard Worker    device->dispatch_table.CmdWriteBufferMarker2AMD(commandBuffer,
326*61046927SAndroid Build Coastguard Worker                                                    (VkPipelineStageFlags2) pipelineStage,
327*61046927SAndroid Build Coastguard Worker                                                    dstBuffer,
328*61046927SAndroid Build Coastguard Worker                                                    dstOffset,
329*61046927SAndroid Build Coastguard Worker                                                    marker);
330*61046927SAndroid Build Coastguard Worker }
331*61046927SAndroid Build Coastguard Worker 
332*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
vk_common_GetQueueCheckpointDataNV(VkQueue queue,uint32_t * pCheckpointDataCount,VkCheckpointDataNV * pCheckpointData)333*61046927SAndroid Build Coastguard Worker vk_common_GetQueueCheckpointDataNV(
334*61046927SAndroid Build Coastguard Worker     VkQueue                                     queue,
335*61046927SAndroid Build Coastguard Worker     uint32_t*                                   pCheckpointDataCount,
336*61046927SAndroid Build Coastguard Worker     VkCheckpointDataNV*                         pCheckpointData)
337*61046927SAndroid Build Coastguard Worker {
338*61046927SAndroid Build Coastguard Worker    unreachable("Entrypoint not implemented");
339*61046927SAndroid Build Coastguard Worker }
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
vk_common_QueueSubmit(VkQueue _queue,uint32_t submitCount,const VkSubmitInfo * pSubmits,VkFence fence)342*61046927SAndroid Build Coastguard Worker vk_common_QueueSubmit(
343*61046927SAndroid Build Coastguard Worker     VkQueue                                     _queue,
344*61046927SAndroid Build Coastguard Worker     uint32_t                                    submitCount,
345*61046927SAndroid Build Coastguard Worker     const VkSubmitInfo*                         pSubmits,
346*61046927SAndroid Build Coastguard Worker     VkFence                                     fence)
347*61046927SAndroid Build Coastguard Worker {
348*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_queue, queue, _queue);
349*61046927SAndroid Build Coastguard Worker    struct vk_device *device = queue->base.device;
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkSubmitInfo2, submit_info_2, submitCount);
352*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkPerformanceQuerySubmitInfoKHR, perf_query_submit_info, submitCount);
353*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(struct wsi_memory_signal_submit_info, wsi_mem_submit_info, submitCount);
354*61046927SAndroid Build Coastguard Worker 
355*61046927SAndroid Build Coastguard Worker    uint32_t n_wait_semaphores = 0;
356*61046927SAndroid Build Coastguard Worker    uint32_t n_command_buffers = 0;
357*61046927SAndroid Build Coastguard Worker    uint32_t n_signal_semaphores = 0;
358*61046927SAndroid Build Coastguard Worker    for (uint32_t s = 0; s < submitCount; s++) {
359*61046927SAndroid Build Coastguard Worker       n_wait_semaphores += pSubmits[s].waitSemaphoreCount;
360*61046927SAndroid Build Coastguard Worker       n_command_buffers += pSubmits[s].commandBufferCount;
361*61046927SAndroid Build Coastguard Worker       n_signal_semaphores += pSubmits[s].signalSemaphoreCount;
362*61046927SAndroid Build Coastguard Worker    }
363*61046927SAndroid Build Coastguard Worker 
364*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkSemaphoreSubmitInfo, wait_semaphores, n_wait_semaphores);
365*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkCommandBufferSubmitInfo, command_buffers, n_command_buffers);
366*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkSemaphoreSubmitInfo, signal_semaphores, n_signal_semaphores);
367*61046927SAndroid Build Coastguard Worker 
368*61046927SAndroid Build Coastguard Worker    n_wait_semaphores = 0;
369*61046927SAndroid Build Coastguard Worker    n_command_buffers = 0;
370*61046927SAndroid Build Coastguard Worker    n_signal_semaphores = 0;
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker    for (uint32_t s = 0; s < submitCount; s++) {
373*61046927SAndroid Build Coastguard Worker       const VkTimelineSemaphoreSubmitInfo *timeline_info =
374*61046927SAndroid Build Coastguard Worker          vk_find_struct_const(pSubmits[s].pNext,
375*61046927SAndroid Build Coastguard Worker                               TIMELINE_SEMAPHORE_SUBMIT_INFO);
376*61046927SAndroid Build Coastguard Worker       const uint64_t *wait_values = NULL;
377*61046927SAndroid Build Coastguard Worker       const uint64_t *signal_values = NULL;
378*61046927SAndroid Build Coastguard Worker 
379*61046927SAndroid Build Coastguard Worker       if (timeline_info && timeline_info->waitSemaphoreValueCount) {
380*61046927SAndroid Build Coastguard Worker          /* From the Vulkan 1.3.204 spec:
381*61046927SAndroid Build Coastguard Worker           *
382*61046927SAndroid Build Coastguard Worker           *    VUID-VkSubmitInfo-pNext-03240
383*61046927SAndroid Build Coastguard Worker           *
384*61046927SAndroid Build Coastguard Worker           *    "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure
385*61046927SAndroid Build Coastguard Worker           *    and any element of pSignalSemaphores was created with a VkSemaphoreType of
386*61046927SAndroid Build Coastguard Worker           *    VK_SEMAPHORE_TYPE_TIMELINE, then its signalSemaphoreValueCount member must equal
387*61046927SAndroid Build Coastguard Worker           *    signalSemaphoreCount"
388*61046927SAndroid Build Coastguard Worker           */
389*61046927SAndroid Build Coastguard Worker          assert(timeline_info->waitSemaphoreValueCount == pSubmits[s].waitSemaphoreCount);
390*61046927SAndroid Build Coastguard Worker          wait_values = timeline_info->pWaitSemaphoreValues;
391*61046927SAndroid Build Coastguard Worker       }
392*61046927SAndroid Build Coastguard Worker 
393*61046927SAndroid Build Coastguard Worker       if (timeline_info && timeline_info->signalSemaphoreValueCount) {
394*61046927SAndroid Build Coastguard Worker          /* From the Vulkan 1.3.204 spec:
395*61046927SAndroid Build Coastguard Worker           *
396*61046927SAndroid Build Coastguard Worker           *    VUID-VkSubmitInfo-pNext-03241
397*61046927SAndroid Build Coastguard Worker           *
398*61046927SAndroid Build Coastguard Worker           *    "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure
399*61046927SAndroid Build Coastguard Worker           *    and any element of pWaitSemaphores was created with a VkSemaphoreType of
400*61046927SAndroid Build Coastguard Worker           *    VK_SEMAPHORE_TYPE_TIMELINE, then its waitSemaphoreValueCount member must equal
401*61046927SAndroid Build Coastguard Worker           *    waitSemaphoreCount"
402*61046927SAndroid Build Coastguard Worker           */
403*61046927SAndroid Build Coastguard Worker          assert(timeline_info->signalSemaphoreValueCount == pSubmits[s].signalSemaphoreCount);
404*61046927SAndroid Build Coastguard Worker          signal_values = timeline_info->pSignalSemaphoreValues;
405*61046927SAndroid Build Coastguard Worker       }
406*61046927SAndroid Build Coastguard Worker 
407*61046927SAndroid Build Coastguard Worker       const VkDeviceGroupSubmitInfo *group_info =
408*61046927SAndroid Build Coastguard Worker          vk_find_struct_const(pSubmits[s].pNext, DEVICE_GROUP_SUBMIT_INFO);
409*61046927SAndroid Build Coastguard Worker 
410*61046927SAndroid Build Coastguard Worker       for (uint32_t i = 0; i < pSubmits[s].waitSemaphoreCount; i++) {
411*61046927SAndroid Build Coastguard Worker          wait_semaphores[n_wait_semaphores + i] = (VkSemaphoreSubmitInfo) {
412*61046927SAndroid Build Coastguard Worker             .sType       = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
413*61046927SAndroid Build Coastguard Worker             .semaphore   = pSubmits[s].pWaitSemaphores[i],
414*61046927SAndroid Build Coastguard Worker             .value       = wait_values ? wait_values[i] : 0,
415*61046927SAndroid Build Coastguard Worker             .stageMask   = pSubmits[s].pWaitDstStageMask[i],
416*61046927SAndroid Build Coastguard Worker             .deviceIndex = group_info ? group_info->pWaitSemaphoreDeviceIndices[i] : 0,
417*61046927SAndroid Build Coastguard Worker          };
418*61046927SAndroid Build Coastguard Worker       }
419*61046927SAndroid Build Coastguard Worker       for (uint32_t i = 0; i < pSubmits[s].commandBufferCount; i++) {
420*61046927SAndroid Build Coastguard Worker          command_buffers[n_command_buffers + i] = (VkCommandBufferSubmitInfo) {
421*61046927SAndroid Build Coastguard Worker             .sType         = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
422*61046927SAndroid Build Coastguard Worker             .commandBuffer = pSubmits[s].pCommandBuffers[i],
423*61046927SAndroid Build Coastguard Worker             .deviceMask    = group_info ? group_info->pCommandBufferDeviceMasks[i] : 0,
424*61046927SAndroid Build Coastguard Worker          };
425*61046927SAndroid Build Coastguard Worker       }
426*61046927SAndroid Build Coastguard Worker       for (uint32_t i = 0; i < pSubmits[s].signalSemaphoreCount; i++) {
427*61046927SAndroid Build Coastguard Worker          signal_semaphores[n_signal_semaphores + i] = (VkSemaphoreSubmitInfo) {
428*61046927SAndroid Build Coastguard Worker             .sType     = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
429*61046927SAndroid Build Coastguard Worker             .semaphore = pSubmits[s].pSignalSemaphores[i],
430*61046927SAndroid Build Coastguard Worker             .value     = signal_values ? signal_values[i] : 0,
431*61046927SAndroid Build Coastguard Worker             .stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
432*61046927SAndroid Build Coastguard Worker             .deviceIndex = group_info ? group_info->pSignalSemaphoreDeviceIndices[i] : 0,
433*61046927SAndroid Build Coastguard Worker          };
434*61046927SAndroid Build Coastguard Worker       }
435*61046927SAndroid Build Coastguard Worker 
436*61046927SAndroid Build Coastguard Worker       const VkProtectedSubmitInfo *protected_info =
437*61046927SAndroid Build Coastguard Worker          vk_find_struct_const(pSubmits[s].pNext, PROTECTED_SUBMIT_INFO);
438*61046927SAndroid Build Coastguard Worker 
439*61046927SAndroid Build Coastguard Worker       submit_info_2[s] = (VkSubmitInfo2) {
440*61046927SAndroid Build Coastguard Worker          .sType                    = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
441*61046927SAndroid Build Coastguard Worker          .flags                    = ((protected_info && protected_info->protectedSubmit) ?
442*61046927SAndroid Build Coastguard Worker                                       VK_SUBMIT_PROTECTED_BIT : 0),
443*61046927SAndroid Build Coastguard Worker          .waitSemaphoreInfoCount   = pSubmits[s].waitSemaphoreCount,
444*61046927SAndroid Build Coastguard Worker          .pWaitSemaphoreInfos      = &wait_semaphores[n_wait_semaphores],
445*61046927SAndroid Build Coastguard Worker          .commandBufferInfoCount   = pSubmits[s].commandBufferCount,
446*61046927SAndroid Build Coastguard Worker          .pCommandBufferInfos      = &command_buffers[n_command_buffers],
447*61046927SAndroid Build Coastguard Worker          .signalSemaphoreInfoCount = pSubmits[s].signalSemaphoreCount,
448*61046927SAndroid Build Coastguard Worker          .pSignalSemaphoreInfos    = &signal_semaphores[n_signal_semaphores],
449*61046927SAndroid Build Coastguard Worker       };
450*61046927SAndroid Build Coastguard Worker 
451*61046927SAndroid Build Coastguard Worker       const VkPerformanceQuerySubmitInfoKHR *query_info =
452*61046927SAndroid Build Coastguard Worker          vk_find_struct_const(pSubmits[s].pNext,
453*61046927SAndroid Build Coastguard Worker                               PERFORMANCE_QUERY_SUBMIT_INFO_KHR);
454*61046927SAndroid Build Coastguard Worker       if (query_info) {
455*61046927SAndroid Build Coastguard Worker          perf_query_submit_info[s] = *query_info;
456*61046927SAndroid Build Coastguard Worker          perf_query_submit_info[s].pNext = NULL;
457*61046927SAndroid Build Coastguard Worker          __vk_append_struct(&submit_info_2[s], &perf_query_submit_info[s]);
458*61046927SAndroid Build Coastguard Worker       }
459*61046927SAndroid Build Coastguard Worker 
460*61046927SAndroid Build Coastguard Worker       const struct wsi_memory_signal_submit_info *mem_signal_info =
461*61046927SAndroid Build Coastguard Worker          vk_find_struct_const(pSubmits[s].pNext,
462*61046927SAndroid Build Coastguard Worker                               WSI_MEMORY_SIGNAL_SUBMIT_INFO_MESA);
463*61046927SAndroid Build Coastguard Worker       if (mem_signal_info) {
464*61046927SAndroid Build Coastguard Worker          wsi_mem_submit_info[s] = *mem_signal_info;
465*61046927SAndroid Build Coastguard Worker          wsi_mem_submit_info[s].pNext = NULL;
466*61046927SAndroid Build Coastguard Worker          __vk_append_struct(&submit_info_2[s], &wsi_mem_submit_info[s]);
467*61046927SAndroid Build Coastguard Worker       }
468*61046927SAndroid Build Coastguard Worker 
469*61046927SAndroid Build Coastguard Worker       n_wait_semaphores += pSubmits[s].waitSemaphoreCount;
470*61046927SAndroid Build Coastguard Worker       n_command_buffers += pSubmits[s].commandBufferCount;
471*61046927SAndroid Build Coastguard Worker       n_signal_semaphores += pSubmits[s].signalSemaphoreCount;
472*61046927SAndroid Build Coastguard Worker    }
473*61046927SAndroid Build Coastguard Worker 
474*61046927SAndroid Build Coastguard Worker    VkResult result = device->dispatch_table.QueueSubmit2(_queue,
475*61046927SAndroid Build Coastguard Worker                                                          submitCount,
476*61046927SAndroid Build Coastguard Worker                                                          submit_info_2,
477*61046927SAndroid Build Coastguard Worker                                                          fence);
478*61046927SAndroid Build Coastguard Worker 
479*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(wait_semaphores);
480*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(command_buffers);
481*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(signal_semaphores);
482*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(submit_info_2);
483*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(perf_query_submit_info);
484*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(wsi_mem_submit_info);
485*61046927SAndroid Build Coastguard Worker 
486*61046927SAndroid Build Coastguard Worker    return result;
487*61046927SAndroid Build Coastguard Worker }
488