xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/anv_buffer.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /* Copyright © 2024 Intel Corporation
2*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
3*61046927SAndroid Build Coastguard Worker  */
4*61046927SAndroid Build Coastguard Worker 
5*61046927SAndroid Build Coastguard Worker #include "anv_private.h"
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker static void
anv_bind_buffer_memory(struct anv_device * device,const VkBindBufferMemoryInfo * pBindInfo)8*61046927SAndroid Build Coastguard Worker anv_bind_buffer_memory(struct anv_device *device,
9*61046927SAndroid Build Coastguard Worker                        const VkBindBufferMemoryInfo *pBindInfo)
10*61046927SAndroid Build Coastguard Worker {
11*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device_memory, mem, pBindInfo->memory);
12*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_buffer, buffer, pBindInfo->buffer);
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker    assert(pBindInfo->sType == VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO);
15*61046927SAndroid Build Coastguard Worker    assert(!anv_buffer_is_sparse(buffer));
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker    const VkBindMemoryStatusKHR *bind_status =
18*61046927SAndroid Build Coastguard Worker       vk_find_struct_const(pBindInfo->pNext, BIND_MEMORY_STATUS_KHR);
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker    if (mem) {
21*61046927SAndroid Build Coastguard Worker       assert(pBindInfo->memoryOffset < mem->vk.size);
22*61046927SAndroid Build Coastguard Worker       assert(mem->vk.size - pBindInfo->memoryOffset >= buffer->vk.size);
23*61046927SAndroid Build Coastguard Worker       buffer->address = (struct anv_address) {
24*61046927SAndroid Build Coastguard Worker          .bo = mem->bo,
25*61046927SAndroid Build Coastguard Worker          .offset = pBindInfo->memoryOffset,
26*61046927SAndroid Build Coastguard Worker       };
27*61046927SAndroid Build Coastguard Worker    } else {
28*61046927SAndroid Build Coastguard Worker       buffer->address = ANV_NULL_ADDRESS;
29*61046927SAndroid Build Coastguard Worker    }
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker    ANV_RMV(buffer_bind, device, buffer);
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker    if (bind_status)
34*61046927SAndroid Build Coastguard Worker       *bind_status->pResult = VK_SUCCESS;
35*61046927SAndroid Build Coastguard Worker }
36*61046927SAndroid Build Coastguard Worker 
anv_BindBufferMemory2(VkDevice _device,uint32_t bindInfoCount,const VkBindBufferMemoryInfo * pBindInfos)37*61046927SAndroid Build Coastguard Worker VkResult anv_BindBufferMemory2(
38*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
39*61046927SAndroid Build Coastguard Worker     uint32_t                                    bindInfoCount,
40*61046927SAndroid Build Coastguard Worker     const VkBindBufferMemoryInfo*               pBindInfos)
41*61046927SAndroid Build Coastguard Worker {
42*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < bindInfoCount; i++)
45*61046927SAndroid Build Coastguard Worker       anv_bind_buffer_memory(device, &pBindInfos[i]);
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
48*61046927SAndroid Build Coastguard Worker }
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker // Buffer functions
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker static void
anv_get_buffer_memory_requirements(struct anv_device * device,VkBufferCreateFlags flags,VkDeviceSize size,VkBufferUsageFlags2KHR usage,bool is_sparse,VkMemoryRequirements2 * pMemoryRequirements)53*61046927SAndroid Build Coastguard Worker anv_get_buffer_memory_requirements(struct anv_device *device,
54*61046927SAndroid Build Coastguard Worker                                    VkBufferCreateFlags flags,
55*61046927SAndroid Build Coastguard Worker                                    VkDeviceSize size,
56*61046927SAndroid Build Coastguard Worker                                    VkBufferUsageFlags2KHR usage,
57*61046927SAndroid Build Coastguard Worker                                    bool is_sparse,
58*61046927SAndroid Build Coastguard Worker                                    VkMemoryRequirements2* pMemoryRequirements)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker    /* The Vulkan spec (git aaed022) says:
61*61046927SAndroid Build Coastguard Worker     *
62*61046927SAndroid Build Coastguard Worker     *    memoryTypeBits is a bitfield and contains one bit set for every
63*61046927SAndroid Build Coastguard Worker     *    supported memory type for the resource. The bit `1<<i` is set if and
64*61046927SAndroid Build Coastguard Worker     *    only if the memory type `i` in the VkPhysicalDeviceMemoryProperties
65*61046927SAndroid Build Coastguard Worker     *    structure for the physical device is supported.
66*61046927SAndroid Build Coastguard Worker     *
67*61046927SAndroid Build Coastguard Worker     * We have special memory types for descriptor buffers.
68*61046927SAndroid Build Coastguard Worker     */
69*61046927SAndroid Build Coastguard Worker    uint32_t memory_types;
70*61046927SAndroid Build Coastguard Worker    if (flags & VK_BUFFER_CREATE_PROTECTED_BIT)
71*61046927SAndroid Build Coastguard Worker       memory_types = device->physical->memory.protected_mem_types;
72*61046927SAndroid Build Coastguard Worker    else if (usage & (VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT |
73*61046927SAndroid Build Coastguard Worker                      VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT))
74*61046927SAndroid Build Coastguard Worker       memory_types = device->physical->memory.dynamic_visible_mem_types;
75*61046927SAndroid Build Coastguard Worker    else
76*61046927SAndroid Build Coastguard Worker       memory_types = device->physical->memory.default_buffer_mem_types;
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker    /* The GPU appears to write back to main memory in cachelines. Writes to a
79*61046927SAndroid Build Coastguard Worker     * buffers should not clobber with writes to another buffers so make sure
80*61046927SAndroid Build Coastguard Worker     * those are in different cachelines.
81*61046927SAndroid Build Coastguard Worker     */
82*61046927SAndroid Build Coastguard Worker    uint32_t alignment = 64;
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker    /* From the spec, section "Sparse Buffer and Fully-Resident Image Block
85*61046927SAndroid Build Coastguard Worker     * Size":
86*61046927SAndroid Build Coastguard Worker     *   "The sparse block size in bytes for sparse buffers and fully-resident
87*61046927SAndroid Build Coastguard Worker     *    images is reported as VkMemoryRequirements::alignment. alignment
88*61046927SAndroid Build Coastguard Worker     *    represents both the memory alignment requirement and the binding
89*61046927SAndroid Build Coastguard Worker     *    granularity (in bytes) for sparse resources."
90*61046927SAndroid Build Coastguard Worker     */
91*61046927SAndroid Build Coastguard Worker    if (is_sparse) {
92*61046927SAndroid Build Coastguard Worker       alignment = ANV_SPARSE_BLOCK_SIZE;
93*61046927SAndroid Build Coastguard Worker       size = align64(size, alignment);
94*61046927SAndroid Build Coastguard Worker    }
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker    pMemoryRequirements->memoryRequirements.size = size;
97*61046927SAndroid Build Coastguard Worker    pMemoryRequirements->memoryRequirements.alignment = alignment;
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    /* Storage and Uniform buffers should have their size aligned to
100*61046927SAndroid Build Coastguard Worker     * 32-bits to avoid boundary checks when last DWord is not complete.
101*61046927SAndroid Build Coastguard Worker     * This would ensure that not internal padding would be needed for
102*61046927SAndroid Build Coastguard Worker     * 16-bit types.
103*61046927SAndroid Build Coastguard Worker     */
104*61046927SAndroid Build Coastguard Worker    if (device->robust_buffer_access &&
105*61046927SAndroid Build Coastguard Worker        (usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT ||
106*61046927SAndroid Build Coastguard Worker         usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT))
107*61046927SAndroid Build Coastguard Worker       pMemoryRequirements->memoryRequirements.size = align64(size, 4);
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker    pMemoryRequirements->memoryRequirements.memoryTypeBits = memory_types;
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker    vk_foreach_struct(ext, pMemoryRequirements->pNext) {
112*61046927SAndroid Build Coastguard Worker       switch (ext->sType) {
113*61046927SAndroid Build Coastguard Worker       case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
114*61046927SAndroid Build Coastguard Worker          VkMemoryDedicatedRequirements *requirements = (void *)ext;
115*61046927SAndroid Build Coastguard Worker          requirements->prefersDedicatedAllocation = false;
116*61046927SAndroid Build Coastguard Worker          requirements->requiresDedicatedAllocation = false;
117*61046927SAndroid Build Coastguard Worker          break;
118*61046927SAndroid Build Coastguard Worker       }
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker       default:
121*61046927SAndroid Build Coastguard Worker          vk_debug_ignored_stype(ext->sType);
122*61046927SAndroid Build Coastguard Worker          break;
123*61046927SAndroid Build Coastguard Worker       }
124*61046927SAndroid Build Coastguard Worker    }
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker static VkBufferUsageFlags2KHR
get_buffer_usages(const VkBufferCreateInfo * create_info)128*61046927SAndroid Build Coastguard Worker get_buffer_usages(const VkBufferCreateInfo *create_info)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker    const VkBufferUsageFlags2CreateInfoKHR *usage2_info =
131*61046927SAndroid Build Coastguard Worker       vk_find_struct_const(create_info->pNext,
132*61046927SAndroid Build Coastguard Worker                            BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR);
133*61046927SAndroid Build Coastguard Worker    return usage2_info != NULL ? usage2_info->usage : create_info->usage;
134*61046927SAndroid Build Coastguard Worker }
135*61046927SAndroid Build Coastguard Worker 
anv_GetDeviceBufferMemoryRequirements(VkDevice _device,const VkDeviceBufferMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements)136*61046927SAndroid Build Coastguard Worker void anv_GetDeviceBufferMemoryRequirements(
137*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
138*61046927SAndroid Build Coastguard Worker     const VkDeviceBufferMemoryRequirements*     pInfo,
139*61046927SAndroid Build Coastguard Worker     VkMemoryRequirements2*                      pMemoryRequirements)
140*61046927SAndroid Build Coastguard Worker {
141*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
142*61046927SAndroid Build Coastguard Worker    const bool is_sparse =
143*61046927SAndroid Build Coastguard Worker       pInfo->pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
144*61046927SAndroid Build Coastguard Worker    VkBufferUsageFlags2KHR usages = get_buffer_usages(pInfo->pCreateInfo);
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker    if ((device->physical->sparse_type == ANV_SPARSE_TYPE_NOT_SUPPORTED) &&
147*61046927SAndroid Build Coastguard Worker        INTEL_DEBUG(DEBUG_SPARSE) &&
148*61046927SAndroid Build Coastguard Worker        pInfo->pCreateInfo->flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
149*61046927SAndroid Build Coastguard Worker                                     VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT |
150*61046927SAndroid Build Coastguard Worker                                     VK_BUFFER_CREATE_SPARSE_ALIASED_BIT))
151*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "=== %s %s:%d flags:0x%08x\n", __func__, __FILE__,
152*61046927SAndroid Build Coastguard Worker               __LINE__, pInfo->pCreateInfo->flags);
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker    anv_get_buffer_memory_requirements(device,
155*61046927SAndroid Build Coastguard Worker                                       pInfo->pCreateInfo->flags,
156*61046927SAndroid Build Coastguard Worker                                       pInfo->pCreateInfo->size,
157*61046927SAndroid Build Coastguard Worker                                       usages,
158*61046927SAndroid Build Coastguard Worker                                       is_sparse,
159*61046927SAndroid Build Coastguard Worker                                       pMemoryRequirements);
160*61046927SAndroid Build Coastguard Worker }
161*61046927SAndroid Build Coastguard Worker 
anv_CreateBuffer(VkDevice _device,const VkBufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBuffer * pBuffer)162*61046927SAndroid Build Coastguard Worker VkResult anv_CreateBuffer(
163*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
164*61046927SAndroid Build Coastguard Worker     const VkBufferCreateInfo*                   pCreateInfo,
165*61046927SAndroid Build Coastguard Worker     const VkAllocationCallbacks*                pAllocator,
166*61046927SAndroid Build Coastguard Worker     VkBuffer*                                   pBuffer)
167*61046927SAndroid Build Coastguard Worker {
168*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
169*61046927SAndroid Build Coastguard Worker    struct anv_buffer *buffer;
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker    if ((device->physical->sparse_type == ANV_SPARSE_TYPE_NOT_SUPPORTED) &&
172*61046927SAndroid Build Coastguard Worker        INTEL_DEBUG(DEBUG_SPARSE) &&
173*61046927SAndroid Build Coastguard Worker        pCreateInfo->flags & (VK_BUFFER_CREATE_SPARSE_BINDING_BIT |
174*61046927SAndroid Build Coastguard Worker                              VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT |
175*61046927SAndroid Build Coastguard Worker                              VK_BUFFER_CREATE_SPARSE_ALIASED_BIT))
176*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "=== %s %s:%d flags:0x%08x\n", __func__, __FILE__,
177*61046927SAndroid Build Coastguard Worker               __LINE__, pCreateInfo->flags);
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker    /* Don't allow creating buffers bigger than our address space.  The real
180*61046927SAndroid Build Coastguard Worker     * issue here is that we may align up the buffer size and we don't want
181*61046927SAndroid Build Coastguard Worker     * doing so to cause roll-over.  However, no one has any business
182*61046927SAndroid Build Coastguard Worker     * allocating a buffer larger than our GTT size.
183*61046927SAndroid Build Coastguard Worker     */
184*61046927SAndroid Build Coastguard Worker    if (pCreateInfo->size > device->physical->gtt_size)
185*61046927SAndroid Build Coastguard Worker       return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker    buffer = vk_buffer_create(&device->vk, pCreateInfo,
188*61046927SAndroid Build Coastguard Worker                              pAllocator, sizeof(*buffer));
189*61046927SAndroid Build Coastguard Worker    if (buffer == NULL)
190*61046927SAndroid Build Coastguard Worker       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker    buffer->address = ANV_NULL_ADDRESS;
193*61046927SAndroid Build Coastguard Worker    if (anv_buffer_is_sparse(buffer)) {
194*61046927SAndroid Build Coastguard Worker       enum anv_bo_alloc_flags alloc_flags = 0;
195*61046927SAndroid Build Coastguard Worker       uint64_t client_address = 0;
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker       if (buffer->vk.create_flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT) {
198*61046927SAndroid Build Coastguard Worker          alloc_flags = ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS;
199*61046927SAndroid Build Coastguard Worker          const VkBufferOpaqueCaptureAddressCreateInfo *opaque_addr_info =
200*61046927SAndroid Build Coastguard Worker             vk_find_struct_const(pCreateInfo->pNext,
201*61046927SAndroid Build Coastguard Worker                                  BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO);
202*61046927SAndroid Build Coastguard Worker          if (opaque_addr_info)
203*61046927SAndroid Build Coastguard Worker             client_address = opaque_addr_info->opaqueCaptureAddress;
204*61046927SAndroid Build Coastguard Worker       }
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker       if (buffer->vk.create_flags & VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT) {
207*61046927SAndroid Build Coastguard Worker          alloc_flags = ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS;
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker          const VkOpaqueCaptureDescriptorDataCreateInfoEXT *opaque_info =
210*61046927SAndroid Build Coastguard Worker             vk_find_struct_const(pCreateInfo->pNext,
211*61046927SAndroid Build Coastguard Worker                                  OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT);
212*61046927SAndroid Build Coastguard Worker          if (opaque_info)
213*61046927SAndroid Build Coastguard Worker             client_address = *((const uint64_t *)opaque_info->opaqueCaptureDescriptorData);
214*61046927SAndroid Build Coastguard Worker       }
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker       VkResult result = anv_init_sparse_bindings(device, buffer->vk.size,
217*61046927SAndroid Build Coastguard Worker                                                  &buffer->sparse_data,
218*61046927SAndroid Build Coastguard Worker                                                  alloc_flags, client_address,
219*61046927SAndroid Build Coastguard Worker                                                  &buffer->address);
220*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS) {
221*61046927SAndroid Build Coastguard Worker          vk_buffer_destroy(&device->vk, pAllocator, &buffer->vk);
222*61046927SAndroid Build Coastguard Worker          return result;
223*61046927SAndroid Build Coastguard Worker       }
224*61046927SAndroid Build Coastguard Worker    }
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    ANV_RMV(buffer_create, device, false, buffer);
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker    *pBuffer = anv_buffer_to_handle(buffer);
229*61046927SAndroid Build Coastguard Worker 
230*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
231*61046927SAndroid Build Coastguard Worker }
232*61046927SAndroid Build Coastguard Worker 
anv_DestroyBuffer(VkDevice _device,VkBuffer _buffer,const VkAllocationCallbacks * pAllocator)233*61046927SAndroid Build Coastguard Worker void anv_DestroyBuffer(
234*61046927SAndroid Build Coastguard Worker     VkDevice                                    _device,
235*61046927SAndroid Build Coastguard Worker     VkBuffer                                    _buffer,
236*61046927SAndroid Build Coastguard Worker     const VkAllocationCallbacks*                pAllocator)
237*61046927SAndroid Build Coastguard Worker {
238*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
239*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_buffer, buffer, _buffer);
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker    if (!buffer)
242*61046927SAndroid Build Coastguard Worker       return;
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker    ANV_RMV(buffer_destroy, device, buffer);
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker    if (anv_buffer_is_sparse(buffer)) {
247*61046927SAndroid Build Coastguard Worker       assert(buffer->address.offset == buffer->sparse_data.address);
248*61046927SAndroid Build Coastguard Worker       anv_free_sparse_bindings(device, &buffer->sparse_data);
249*61046927SAndroid Build Coastguard Worker    }
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker    vk_buffer_destroy(&device->vk, pAllocator, &buffer->vk);
252*61046927SAndroid Build Coastguard Worker }
253*61046927SAndroid Build Coastguard Worker 
anv_GetBufferDeviceAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo)254*61046927SAndroid Build Coastguard Worker VkDeviceAddress anv_GetBufferDeviceAddress(
255*61046927SAndroid Build Coastguard Worker     VkDevice                                    device,
256*61046927SAndroid Build Coastguard Worker     const VkBufferDeviceAddressInfo*            pInfo)
257*61046927SAndroid Build Coastguard Worker {
258*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_buffer, buffer, pInfo->buffer);
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker    assert(!anv_address_is_null(buffer->address));
261*61046927SAndroid Build Coastguard Worker 
262*61046927SAndroid Build Coastguard Worker    return anv_address_physical(buffer->address);
263*61046927SAndroid Build Coastguard Worker }
264*61046927SAndroid Build Coastguard Worker 
anv_GetBufferOpaqueCaptureAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo)265*61046927SAndroid Build Coastguard Worker uint64_t anv_GetBufferOpaqueCaptureAddress(
266*61046927SAndroid Build Coastguard Worker     VkDevice                                    device,
267*61046927SAndroid Build Coastguard Worker     const VkBufferDeviceAddressInfo*            pInfo)
268*61046927SAndroid Build Coastguard Worker {
269*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_buffer, buffer, pInfo->buffer);
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker    return anv_address_physical(buffer->address);
272*61046927SAndroid Build Coastguard Worker }
273*61046927SAndroid Build Coastguard Worker 
anv_GetBufferOpaqueCaptureDescriptorDataEXT(VkDevice device,const VkBufferCaptureDescriptorDataInfoEXT * pInfo,void * pData)274*61046927SAndroid Build Coastguard Worker VkResult anv_GetBufferOpaqueCaptureDescriptorDataEXT(
275*61046927SAndroid Build Coastguard Worker     VkDevice                                    device,
276*61046927SAndroid Build Coastguard Worker     const VkBufferCaptureDescriptorDataInfoEXT* pInfo,
277*61046927SAndroid Build Coastguard Worker     void*                                       pData)
278*61046927SAndroid Build Coastguard Worker {
279*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_buffer, buffer, pInfo->buffer);
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker    *((uint64_t *)pData) = anv_address_physical(buffer->address);
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
284*61046927SAndroid Build Coastguard Worker }
285*61046927SAndroid Build Coastguard Worker 
anv_GetDeviceMemoryOpaqueCaptureAddress(VkDevice device,const VkDeviceMemoryOpaqueCaptureAddressInfo * pInfo)286*61046927SAndroid Build Coastguard Worker uint64_t anv_GetDeviceMemoryOpaqueCaptureAddress(
287*61046927SAndroid Build Coastguard Worker     VkDevice                                    device,
288*61046927SAndroid Build Coastguard Worker     const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo)
289*61046927SAndroid Build Coastguard Worker {
290*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device_memory, memory, pInfo->memory);
291*61046927SAndroid Build Coastguard Worker 
292*61046927SAndroid Build Coastguard Worker    assert(memory->bo->alloc_flags & ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS);
293*61046927SAndroid Build Coastguard Worker 
294*61046927SAndroid Build Coastguard Worker    return intel_48b_address(memory->bo->offset);
295*61046927SAndroid Build Coastguard Worker }
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker void
anv_fill_buffer_surface_state(struct anv_device * device,void * surface_state_ptr,enum isl_format format,struct isl_swizzle swizzle,isl_surf_usage_flags_t usage,struct anv_address address,uint32_t range,uint32_t stride)298*61046927SAndroid Build Coastguard Worker anv_fill_buffer_surface_state(struct anv_device *device,
299*61046927SAndroid Build Coastguard Worker                               void *surface_state_ptr,
300*61046927SAndroid Build Coastguard Worker                               enum isl_format format,
301*61046927SAndroid Build Coastguard Worker                               struct isl_swizzle swizzle,
302*61046927SAndroid Build Coastguard Worker                               isl_surf_usage_flags_t usage,
303*61046927SAndroid Build Coastguard Worker                               struct anv_address address,
304*61046927SAndroid Build Coastguard Worker                               uint32_t range, uint32_t stride)
305*61046927SAndroid Build Coastguard Worker {
306*61046927SAndroid Build Coastguard Worker    if (address.bo && address.bo->alloc_flags & ANV_BO_ALLOC_PROTECTED)
307*61046927SAndroid Build Coastguard Worker       usage |= ISL_SURF_USAGE_PROTECTED_BIT;
308*61046927SAndroid Build Coastguard Worker    isl_buffer_fill_state(&device->isl_dev, surface_state_ptr,
309*61046927SAndroid Build Coastguard Worker                          .address = anv_address_physical(address),
310*61046927SAndroid Build Coastguard Worker                          .mocs = isl_mocs(&device->isl_dev, usage,
311*61046927SAndroid Build Coastguard Worker                                           address.bo && anv_bo_is_external(address.bo)),
312*61046927SAndroid Build Coastguard Worker                          .size_B = range,
313*61046927SAndroid Build Coastguard Worker                          .format = format,
314*61046927SAndroid Build Coastguard Worker                          .swizzle = swizzle,
315*61046927SAndroid Build Coastguard Worker                          .stride_B = stride);
316*61046927SAndroid Build Coastguard Worker }
317