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