1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2024 Valve Corporation
3*61046927SAndroid Build Coastguard Worker * Copyright 2024 Alyssa Rosenzweig
4*61046927SAndroid Build Coastguard Worker * Copyright 2022-2023 Collabora Ltd. and Red Hat Inc.
5*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
6*61046927SAndroid Build Coastguard Worker */
7*61046927SAndroid Build Coastguard Worker #include "hk_buffer.h"
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker #include "agx_bo.h"
10*61046927SAndroid Build Coastguard Worker #include "agx_device.h"
11*61046927SAndroid Build Coastguard Worker #include "hk_device.h"
12*61046927SAndroid Build Coastguard Worker #include "hk_device_memory.h"
13*61046927SAndroid Build Coastguard Worker #include "hk_entrypoints.h"
14*61046927SAndroid Build Coastguard Worker #include "hk_physical_device.h"
15*61046927SAndroid Build Coastguard Worker
16*61046927SAndroid Build Coastguard Worker static uint32_t
hk_get_buffer_alignment(const struct hk_physical_device * pdev,VkBufferUsageFlags2KHR usage_flags,VkBufferCreateFlags create_flags)17*61046927SAndroid Build Coastguard Worker hk_get_buffer_alignment(const struct hk_physical_device *pdev,
18*61046927SAndroid Build Coastguard Worker VkBufferUsageFlags2KHR usage_flags,
19*61046927SAndroid Build Coastguard Worker VkBufferCreateFlags create_flags)
20*61046927SAndroid Build Coastguard Worker {
21*61046927SAndroid Build Coastguard Worker uint32_t alignment = 16;
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Worker if (usage_flags & VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT_KHR)
24*61046927SAndroid Build Coastguard Worker alignment = MAX2(alignment, HK_MIN_UBO_ALIGNMENT);
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker if (usage_flags & VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR)
27*61046927SAndroid Build Coastguard Worker alignment = MAX2(alignment, HK_MIN_SSBO_ALIGNMENT);
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker if (usage_flags & (VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR |
30*61046927SAndroid Build Coastguard Worker VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR))
31*61046927SAndroid Build Coastguard Worker alignment = MAX2(alignment, HK_MIN_TEXEL_BUFFER_ALIGNMENT);
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker if (create_flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
34*61046927SAndroid Build Coastguard Worker VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT))
35*61046927SAndroid Build Coastguard Worker alignment = MAX2(alignment, 16384);
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker return alignment;
38*61046927SAndroid Build Coastguard Worker }
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker static uint64_t
hk_get_bda_replay_addr(const VkBufferCreateInfo * pCreateInfo)41*61046927SAndroid Build Coastguard Worker hk_get_bda_replay_addr(const VkBufferCreateInfo *pCreateInfo)
42*61046927SAndroid Build Coastguard Worker {
43*61046927SAndroid Build Coastguard Worker uint64_t addr = 0;
44*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const(ext, pCreateInfo->pNext) {
45*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
46*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO: {
47*61046927SAndroid Build Coastguard Worker const VkBufferOpaqueCaptureAddressCreateInfo *bda = (void *)ext;
48*61046927SAndroid Build Coastguard Worker if (bda->opaqueCaptureAddress != 0) {
49*61046927SAndroid Build Coastguard Worker #ifdef NDEBUG
50*61046927SAndroid Build Coastguard Worker return bda->opaqueCaptureAddress;
51*61046927SAndroid Build Coastguard Worker #else
52*61046927SAndroid Build Coastguard Worker assert(addr == 0 || bda->opaqueCaptureAddress == addr);
53*61046927SAndroid Build Coastguard Worker addr = bda->opaqueCaptureAddress;
54*61046927SAndroid Build Coastguard Worker #endif
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker break;
57*61046927SAndroid Build Coastguard Worker }
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT: {
60*61046927SAndroid Build Coastguard Worker const VkBufferDeviceAddressCreateInfoEXT *bda = (void *)ext;
61*61046927SAndroid Build Coastguard Worker if (bda->deviceAddress != 0) {
62*61046927SAndroid Build Coastguard Worker #ifdef NDEBUG
63*61046927SAndroid Build Coastguard Worker return bda->deviceAddress;
64*61046927SAndroid Build Coastguard Worker #else
65*61046927SAndroid Build Coastguard Worker assert(addr == 0 || bda->deviceAddress == addr);
66*61046927SAndroid Build Coastguard Worker addr = bda->deviceAddress;
67*61046927SAndroid Build Coastguard Worker #endif
68*61046927SAndroid Build Coastguard Worker }
69*61046927SAndroid Build Coastguard Worker break;
70*61046927SAndroid Build Coastguard Worker }
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker default:
73*61046927SAndroid Build Coastguard Worker break;
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker }
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker return addr;
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
hk_CreateBuffer(VkDevice device,const VkBufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBuffer * pBuffer)81*61046927SAndroid Build Coastguard Worker hk_CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
82*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(hk_device, dev, device);
85*61046927SAndroid Build Coastguard Worker struct hk_buffer *buffer;
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker if (pCreateInfo->size > HK_MAX_BUFFER_SIZE)
88*61046927SAndroid Build Coastguard Worker return vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY);
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Worker buffer =
91*61046927SAndroid Build Coastguard Worker vk_buffer_create(&dev->vk, pCreateInfo, pAllocator, sizeof(*buffer));
92*61046927SAndroid Build Coastguard Worker if (!buffer)
93*61046927SAndroid Build Coastguard Worker return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker if (buffer->vk.size > 0 &&
96*61046927SAndroid Build Coastguard Worker (buffer->vk.create_flags &
97*61046927SAndroid Build Coastguard Worker (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
98*61046927SAndroid Build Coastguard Worker VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT))) {
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker const uint32_t alignment = hk_get_buffer_alignment(
101*61046927SAndroid Build Coastguard Worker hk_device_physical(dev), buffer->vk.usage, buffer->vk.create_flags);
102*61046927SAndroid Build Coastguard Worker assert(alignment >= 16384);
103*61046927SAndroid Build Coastguard Worker uint64_t vma_size_B = align64(buffer->vk.size, alignment);
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker const bool bda_capture_replay =
106*61046927SAndroid Build Coastguard Worker buffer->vk.create_flags &
107*61046927SAndroid Build Coastguard Worker VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT;
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker enum agx_va_flags flags = 0;
110*61046927SAndroid Build Coastguard Worker uint64_t bda_fixed_addr = 0;
111*61046927SAndroid Build Coastguard Worker if (bda_capture_replay) {
112*61046927SAndroid Build Coastguard Worker bda_fixed_addr = hk_get_bda_replay_addr(pCreateInfo);
113*61046927SAndroid Build Coastguard Worker if (bda_fixed_addr != 0)
114*61046927SAndroid Build Coastguard Worker flags |= AGX_VA_FIXED;
115*61046927SAndroid Build Coastguard Worker }
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker buffer->va =
118*61046927SAndroid Build Coastguard Worker agx_va_alloc(&dev->dev, vma_size_B, alignment, flags, bda_fixed_addr);
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker if (!buffer->va) {
121*61046927SAndroid Build Coastguard Worker vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);
122*61046927SAndroid Build Coastguard Worker return vk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY,
123*61046927SAndroid Build Coastguard Worker "Sparse VMA allocation failed");
124*61046927SAndroid Build Coastguard Worker }
125*61046927SAndroid Build Coastguard Worker buffer->addr = buffer->va->addr;
126*61046927SAndroid Build Coastguard Worker }
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker *pBuffer = hk_buffer_to_handle(buffer);
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
hk_DestroyBuffer(VkDevice device,VkBuffer _buffer,const VkAllocationCallbacks * pAllocator)134*61046927SAndroid Build Coastguard Worker hk_DestroyBuffer(VkDevice device, VkBuffer _buffer,
135*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
136*61046927SAndroid Build Coastguard Worker {
137*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(hk_device, dev, device);
138*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(hk_buffer, buffer, _buffer);
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker if (!buffer)
141*61046927SAndroid Build Coastguard Worker return;
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker if (buffer->va) {
144*61046927SAndroid Build Coastguard Worker // TODO
145*61046927SAndroid Build Coastguard Worker // agx_bo_unbind_vma(dev->ws_dev, buffer->addr, buffer->vma_size_B);
146*61046927SAndroid Build Coastguard Worker agx_va_free(&dev->dev, buffer->va);
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);
150*61046927SAndroid Build Coastguard Worker }
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
hk_GetDeviceBufferMemoryRequirements(VkDevice device,const VkDeviceBufferMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements)153*61046927SAndroid Build Coastguard Worker hk_GetDeviceBufferMemoryRequirements(
154*61046927SAndroid Build Coastguard Worker VkDevice device, const VkDeviceBufferMemoryRequirements *pInfo,
155*61046927SAndroid Build Coastguard Worker VkMemoryRequirements2 *pMemoryRequirements)
156*61046927SAndroid Build Coastguard Worker {
157*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(hk_device, dev, device);
158*61046927SAndroid Build Coastguard Worker struct hk_physical_device *pdev = hk_device_physical(dev);
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker const uint32_t alignment = hk_get_buffer_alignment(
161*61046927SAndroid Build Coastguard Worker hk_device_physical(dev), pInfo->pCreateInfo->usage,
162*61046927SAndroid Build Coastguard Worker pInfo->pCreateInfo->flags);
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker pMemoryRequirements->memoryRequirements = (VkMemoryRequirements){
165*61046927SAndroid Build Coastguard Worker .size = align64(pInfo->pCreateInfo->size, alignment),
166*61046927SAndroid Build Coastguard Worker .alignment = alignment,
167*61046927SAndroid Build Coastguard Worker .memoryTypeBits = BITFIELD_MASK(pdev->mem_type_count),
168*61046927SAndroid Build Coastguard Worker };
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const(ext, pMemoryRequirements->pNext) {
171*61046927SAndroid Build Coastguard Worker switch (ext->sType) {
172*61046927SAndroid Build Coastguard Worker case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
173*61046927SAndroid Build Coastguard Worker VkMemoryDedicatedRequirements *dedicated = (void *)ext;
174*61046927SAndroid Build Coastguard Worker dedicated->prefersDedicatedAllocation = false;
175*61046927SAndroid Build Coastguard Worker dedicated->requiresDedicatedAllocation = false;
176*61046927SAndroid Build Coastguard Worker break;
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker default:
179*61046927SAndroid Build Coastguard Worker vk_debug_ignored_stype(ext->sType);
180*61046927SAndroid Build Coastguard Worker break;
181*61046927SAndroid Build Coastguard Worker }
182*61046927SAndroid Build Coastguard Worker }
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
hk_GetPhysicalDeviceExternalBufferProperties(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalBufferInfo * pExternalBufferInfo,VkExternalBufferProperties * pExternalBufferProperties)186*61046927SAndroid Build Coastguard Worker hk_GetPhysicalDeviceExternalBufferProperties(
187*61046927SAndroid Build Coastguard Worker VkPhysicalDevice physicalDevice,
188*61046927SAndroid Build Coastguard Worker const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo,
189*61046927SAndroid Build Coastguard Worker VkExternalBufferProperties *pExternalBufferProperties)
190*61046927SAndroid Build Coastguard Worker {
191*61046927SAndroid Build Coastguard Worker /* The Vulkan 1.3.256 spec says:
192*61046927SAndroid Build Coastguard Worker *
193*61046927SAndroid Build Coastguard Worker * VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter
194*61046927SAndroid Build Coastguard Worker *
195*61046927SAndroid Build Coastguard Worker * "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value"
196*61046927SAndroid Build Coastguard Worker *
197*61046927SAndroid Build Coastguard Worker * This differs from VkPhysicalDeviceExternalImageFormatInfo, which
198*61046927SAndroid Build Coastguard Worker * surprisingly permits handleType == 0.
199*61046927SAndroid Build Coastguard Worker */
200*61046927SAndroid Build Coastguard Worker assert(pExternalBufferInfo->handleType != 0);
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker /* All of the current flags are for sparse which we don't support yet.
203*61046927SAndroid Build Coastguard Worker * Even when we do support it, doing sparse on external memory sounds
204*61046927SAndroid Build Coastguard Worker * sketchy. Also, just disallowing flags is the safe option.
205*61046927SAndroid Build Coastguard Worker */
206*61046927SAndroid Build Coastguard Worker if (pExternalBufferInfo->flags)
207*61046927SAndroid Build Coastguard Worker goto unsupported;
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker switch (pExternalBufferInfo->handleType) {
210*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
211*61046927SAndroid Build Coastguard Worker case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
212*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties =
213*61046927SAndroid Build Coastguard Worker hk_dma_buf_mem_props;
214*61046927SAndroid Build Coastguard Worker return;
215*61046927SAndroid Build Coastguard Worker default:
216*61046927SAndroid Build Coastguard Worker goto unsupported;
217*61046927SAndroid Build Coastguard Worker }
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker unsupported:
220*61046927SAndroid Build Coastguard Worker /* From the Vulkan 1.3.256 spec:
221*61046927SAndroid Build Coastguard Worker *
222*61046927SAndroid Build Coastguard Worker * compatibleHandleTypes must include at least handleType.
223*61046927SAndroid Build Coastguard Worker */
224*61046927SAndroid Build Coastguard Worker pExternalBufferProperties->externalMemoryProperties =
225*61046927SAndroid Build Coastguard Worker (VkExternalMemoryProperties){
226*61046927SAndroid Build Coastguard Worker .compatibleHandleTypes = pExternalBufferInfo->handleType,
227*61046927SAndroid Build Coastguard Worker };
228*61046927SAndroid Build Coastguard Worker }
229*61046927SAndroid Build Coastguard Worker
230*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
hk_BindBufferMemory2(VkDevice device,uint32_t bindInfoCount,const VkBindBufferMemoryInfo * pBindInfos)231*61046927SAndroid Build Coastguard Worker hk_BindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
232*61046927SAndroid Build Coastguard Worker const VkBindBufferMemoryInfo *pBindInfos)
233*61046927SAndroid Build Coastguard Worker {
234*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < bindInfoCount; ++i) {
235*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(hk_device_memory, mem, pBindInfos[i].memory);
236*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(hk_buffer, buffer, pBindInfos[i].buffer);
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker if (buffer->va) {
239*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(hk_device, dev, device);
240*61046927SAndroid Build Coastguard Worker dev->dev.ops.bo_bind(&dev->dev, mem->bo, buffer->addr,
241*61046927SAndroid Build Coastguard Worker buffer->va->size_B, pBindInfos[i].memoryOffset,
242*61046927SAndroid Build Coastguard Worker ASAHI_BIND_READ | ASAHI_BIND_WRITE, false);
243*61046927SAndroid Build Coastguard Worker } else {
244*61046927SAndroid Build Coastguard Worker buffer->addr = mem->bo->va->addr + pBindInfos[i].memoryOffset;
245*61046927SAndroid Build Coastguard Worker }
246*61046927SAndroid Build Coastguard Worker
247*61046927SAndroid Build Coastguard Worker const VkBindMemoryStatusKHR *status =
248*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pBindInfos[i].pNext, BIND_MEMORY_STATUS_KHR);
249*61046927SAndroid Build Coastguard Worker if (status != NULL && status->pResult != NULL)
250*61046927SAndroid Build Coastguard Worker *status->pResult = VK_SUCCESS;
251*61046927SAndroid Build Coastguard Worker }
252*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
253*61046927SAndroid Build Coastguard Worker }
254*61046927SAndroid Build Coastguard Worker
255*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkDeviceAddress VKAPI_CALL
hk_GetBufferDeviceAddress(UNUSED VkDevice device,const VkBufferDeviceAddressInfo * pInfo)256*61046927SAndroid Build Coastguard Worker hk_GetBufferDeviceAddress(UNUSED VkDevice device,
257*61046927SAndroid Build Coastguard Worker const VkBufferDeviceAddressInfo *pInfo)
258*61046927SAndroid Build Coastguard Worker {
259*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(hk_buffer, buffer, pInfo->buffer);
260*61046927SAndroid Build Coastguard Worker
261*61046927SAndroid Build Coastguard Worker return hk_buffer_address(buffer, 0);
262*61046927SAndroid Build Coastguard Worker }
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Worker VKAPI_ATTR uint64_t VKAPI_CALL
hk_GetBufferOpaqueCaptureAddress(UNUSED VkDevice device,const VkBufferDeviceAddressInfo * pInfo)265*61046927SAndroid Build Coastguard Worker hk_GetBufferOpaqueCaptureAddress(UNUSED VkDevice device,
266*61046927SAndroid Build Coastguard Worker const VkBufferDeviceAddressInfo *pInfo)
267*61046927SAndroid Build Coastguard Worker {
268*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(hk_buffer, buffer, pInfo->buffer);
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker return hk_buffer_address(buffer, 0);
271*61046927SAndroid Build Coastguard Worker }
272