xref: /aosp_15_r20/external/mesa3d/src/freedreno/vulkan/tu_buffer.cc (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2016 Red Hat.
3  * Copyright © 2016 Bas Nieuwenhuizen
4  * SPDX-License-Identifier: MIT
5  *
6  * based in part on anv driver which is:
7  * Copyright © 2015 Intel Corporation
8  */
9 
10 #include "tu_buffer.h"
11 
12 #include "vk_debug_utils.h"
13 
14 #include "tu_device.h"
15 #include "tu_rmv.h"
16 
17 VKAPI_ATTR VkResult VKAPI_CALL
tu_CreateBuffer(VkDevice _device,const VkBufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBuffer * pBuffer)18 tu_CreateBuffer(VkDevice _device,
19                 const VkBufferCreateInfo *pCreateInfo,
20                 const VkAllocationCallbacks *pAllocator,
21                 VkBuffer *pBuffer)
22 {
23    VK_FROM_HANDLE(tu_device, device, _device);
24    struct tu_buffer *buffer;
25 
26    buffer = (struct tu_buffer *) vk_buffer_create(
27       &device->vk, pCreateInfo, pAllocator, sizeof(*buffer));
28    if (buffer == NULL)
29       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
30 
31    TU_RMV(buffer_create, device, buffer);
32 
33 #ifdef HAVE_PERFETTO
34    tu_perfetto_log_create_buffer(device, buffer);
35 #endif
36 
37    *pBuffer = tu_buffer_to_handle(buffer);
38 
39    return VK_SUCCESS;
40 }
41 
42 VKAPI_ATTR void VKAPI_CALL
tu_DestroyBuffer(VkDevice _device,VkBuffer _buffer,const VkAllocationCallbacks * pAllocator)43 tu_DestroyBuffer(VkDevice _device,
44                  VkBuffer _buffer,
45                  const VkAllocationCallbacks *pAllocator)
46 {
47    VK_FROM_HANDLE(tu_device, device, _device);
48    VK_FROM_HANDLE(tu_buffer, buffer, _buffer);
49    struct tu_instance *instance = device->physical_device->instance;
50 
51    if (!buffer)
52       return;
53 
54    TU_RMV(buffer_destroy, device, buffer);
55 
56 #ifdef HAVE_PERFETTO
57    tu_perfetto_log_destroy_buffer(device, buffer);
58 #endif
59 
60    if (buffer->iova)
61       vk_address_binding_report(&instance->vk, &buffer->vk.base,
62                                 buffer->iova, buffer->bo_size,
63                                 VK_DEVICE_ADDRESS_BINDING_TYPE_UNBIND_EXT);
64 
65 
66    vk_buffer_destroy(&device->vk, pAllocator, &buffer->vk);
67 }
68 
69 VKAPI_ATTR void VKAPI_CALL
tu_GetDeviceBufferMemoryRequirements(VkDevice _device,const VkDeviceBufferMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements)70 tu_GetDeviceBufferMemoryRequirements(
71    VkDevice _device,
72    const VkDeviceBufferMemoryRequirements *pInfo,
73    VkMemoryRequirements2 *pMemoryRequirements)
74 {
75    VK_FROM_HANDLE(tu_device, device, _device);
76 
77    uint64_t size = pInfo->pCreateInfo->size;
78    pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) {
79       .size = MAX2(align64(size, 64), size),
80       .alignment = 64,
81       .memoryTypeBits = (1 << device->physical_device->memory.type_count) - 1,
82    };
83 
84    vk_foreach_struct(ext, pMemoryRequirements->pNext) {
85       switch (ext->sType) {
86       case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
87          VkMemoryDedicatedRequirements *req =
88             (VkMemoryDedicatedRequirements *) ext;
89          req->requiresDedicatedAllocation = false;
90          req->prefersDedicatedAllocation = req->requiresDedicatedAllocation;
91          break;
92       }
93       default:
94          break;
95       }
96    }
97 }
98 
99 VKAPI_ATTR void VKAPI_CALL
tu_GetPhysicalDeviceExternalBufferProperties(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalBufferInfo * pExternalBufferInfo,VkExternalBufferProperties * pExternalBufferProperties)100 tu_GetPhysicalDeviceExternalBufferProperties(
101    VkPhysicalDevice physicalDevice,
102    const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo,
103    VkExternalBufferProperties *pExternalBufferProperties)
104 {
105    BITMASK_ENUM(VkExternalMemoryFeatureFlagBits) flags = 0;
106    VkExternalMemoryHandleTypeFlags export_flags = 0;
107    VkExternalMemoryHandleTypeFlags compat_flags = 0;
108    switch (pExternalBufferInfo->handleType) {
109    case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
110    case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
111       flags = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT |
112               VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
113       compat_flags = export_flags =
114          VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT |
115          VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
116       break;
117    case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
118       flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
119       compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
120       break;
121    default:
122       break;
123    }
124    pExternalBufferProperties->externalMemoryProperties =
125       (VkExternalMemoryProperties) {
126          .externalMemoryFeatures = flags,
127          .exportFromImportedHandleTypes = export_flags,
128          .compatibleHandleTypes = compat_flags,
129       };
130 }
131 
132 VKAPI_ATTR VkResult VKAPI_CALL
tu_BindBufferMemory2(VkDevice device,uint32_t bindInfoCount,const VkBindBufferMemoryInfo * pBindInfos)133 tu_BindBufferMemory2(VkDevice device,
134                      uint32_t bindInfoCount,
135                      const VkBindBufferMemoryInfo *pBindInfos)
136 {
137    VK_FROM_HANDLE(tu_device, dev, device);
138    struct tu_instance *instance = dev->physical_device->instance;
139 
140    for (uint32_t i = 0; i < bindInfoCount; ++i) {
141       VK_FROM_HANDLE(tu_device_memory, mem, pBindInfos[i].memory);
142       VK_FROM_HANDLE(tu_buffer, buffer, pBindInfos[i].buffer);
143 
144       const VkBindMemoryStatusKHR *status =
145          vk_find_struct_const(pBindInfos[i].pNext, BIND_MEMORY_STATUS_KHR);
146       if (status)
147          *status->pResult = VK_SUCCESS;
148 
149       if (mem) {
150          buffer->bo = mem->bo;
151          buffer->iova = mem->bo->iova + pBindInfos[i].memoryOffset;
152          if (buffer->vk.usage &
153              (VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT |
154               VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT))
155             tu_bo_allow_dump(dev, mem->bo);
156 #ifdef HAVE_PERFETTO
157          tu_perfetto_log_bind_buffer(dev, buffer);
158 #endif
159          buffer->bo_size = mem->bo->size;
160       } else {
161          buffer->bo = NULL;
162       }
163 
164       TU_RMV(buffer_bind, dev, buffer);
165 
166       vk_address_binding_report(&instance->vk, &buffer->vk.base,
167                                 buffer->bo->iova, buffer->bo->size,
168                                 VK_DEVICE_ADDRESS_BINDING_TYPE_BIND_EXT);
169    }
170    return VK_SUCCESS;
171 }
172 
173 VkDeviceAddress
tu_GetBufferDeviceAddress(VkDevice _device,const VkBufferDeviceAddressInfo * pInfo)174 tu_GetBufferDeviceAddress(VkDevice _device,
175                           const VkBufferDeviceAddressInfo* pInfo)
176 {
177    VK_FROM_HANDLE(tu_buffer, buffer, pInfo->buffer);
178 
179    return buffer->iova;
180 }
181 
tu_GetBufferOpaqueCaptureAddress(VkDevice _device,const VkBufferDeviceAddressInfo * pInfo)182 uint64_t tu_GetBufferOpaqueCaptureAddress(
183    VkDevice _device,
184    const VkBufferDeviceAddressInfo* pInfo)
185 {
186    /* We care only about memory allocation opaque addresses */
187    return 0;
188 }
189