From d882198fc31742c96d1a4ada98fc256a35cae525 Mon Sep 17 00:00:00 2001 From: Valentine Burley Date: Thu, 20 Jun 2024 21:14:25 +0000 Subject: [PATCH] tu: Move buffer related code to tu_buffer.cc/h More code isolation. Match the structure of the common Vulkan runtime, NVK and RADV. Signed-off-by: Valentine Burley Part-of: --- src/freedreno/vulkan/meson.build | 1 + src/freedreno/vulkan/tu_buffer.cc | 173 ++++++++++++++++++++++ src/freedreno/vulkan/tu_buffer.h | 28 ++++ src/freedreno/vulkan/tu_clear_blit.cc | 1 + src/freedreno/vulkan/tu_cmd_buffer.cc | 1 + src/freedreno/vulkan/tu_descriptor_set.cc | 1 + src/freedreno/vulkan/tu_device.cc | 127 ---------------- src/freedreno/vulkan/tu_device.h | 11 -- src/freedreno/vulkan/tu_formats.cc | 33 ----- src/freedreno/vulkan/tu_image.cc | 1 + src/freedreno/vulkan/tu_perfetto.cc | 1 + src/freedreno/vulkan/tu_query.cc | 1 + src/freedreno/vulkan/tu_rmv.cc | 1 + 13 files changed, 209 insertions(+), 171 deletions(-) create mode 100644 src/freedreno/vulkan/tu_buffer.cc create mode 100644 src/freedreno/vulkan/tu_buffer.h diff --git a/src/freedreno/vulkan/meson.build b/src/freedreno/vulkan/meson.build index 647c01d849f..224755d36e2 100644 --- a/src/freedreno/vulkan/meson.build +++ b/src/freedreno/vulkan/meson.build @@ -21,6 +21,7 @@ tu_entrypoints = custom_target( libtu_files = files( 'layers/tu_rmv_layer.cc', 'tu_autotune.cc', + 'tu_buffer.cc', 'tu_clear_blit.cc', 'tu_cmd_buffer.cc', 'tu_cs_breadcrumbs.cc', diff --git a/src/freedreno/vulkan/tu_buffer.cc b/src/freedreno/vulkan/tu_buffer.cc new file mode 100644 index 00000000000..9b26e38863d --- /dev/null +++ b/src/freedreno/vulkan/tu_buffer.cc @@ -0,0 +1,173 @@ +/* + * Copyright © 2016 Red Hat. + * Copyright © 2016 Bas Nieuwenhuizen + * SPDX-License-Identifier: MIT + * + * based in part on anv driver which is: + * Copyright © 2015 Intel Corporation + */ + +#include "tu_buffer.h" + +#include "tu_device.h" +#include "tu_rmv.h" + +VKAPI_ATTR VkResult VKAPI_CALL +tu_CreateBuffer(VkDevice _device, + const VkBufferCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkBuffer *pBuffer) +{ + VK_FROM_HANDLE(tu_device, device, _device); + struct tu_buffer *buffer; + + buffer = (struct tu_buffer *) vk_buffer_create( + &device->vk, pCreateInfo, pAllocator, sizeof(*buffer)); + if (buffer == NULL) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + TU_RMV(buffer_create, device, buffer); + +#ifdef HAVE_PERFETTO + tu_perfetto_log_create_buffer(device, buffer); +#endif + + *pBuffer = tu_buffer_to_handle(buffer); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +tu_DestroyBuffer(VkDevice _device, + VkBuffer _buffer, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(tu_device, device, _device); + VK_FROM_HANDLE(tu_buffer, buffer, _buffer); + + if (!buffer) + return; + + TU_RMV(buffer_destroy, device, buffer); + +#ifdef HAVE_PERFETTO + tu_perfetto_log_destroy_buffer(device, buffer); +#endif + + vk_buffer_destroy(&device->vk, pAllocator, &buffer->vk); +} + +VKAPI_ATTR void VKAPI_CALL +tu_GetDeviceBufferMemoryRequirements( + VkDevice _device, + const VkDeviceBufferMemoryRequirements *pInfo, + VkMemoryRequirements2 *pMemoryRequirements) +{ + VK_FROM_HANDLE(tu_device, device, _device); + + uint64_t size = pInfo->pCreateInfo->size; + pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) { + .size = MAX2(align64(size, 64), size), + .alignment = 64, + .memoryTypeBits = (1 << device->physical_device->memory.type_count) - 1, + }; + + vk_foreach_struct(ext, pMemoryRequirements->pNext) { + switch (ext->sType) { + case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: { + VkMemoryDedicatedRequirements *req = + (VkMemoryDedicatedRequirements *) ext; + req->requiresDedicatedAllocation = false; + req->prefersDedicatedAllocation = req->requiresDedicatedAllocation; + break; + } + default: + break; + } + } +} + +VKAPI_ATTR void VKAPI_CALL +tu_GetPhysicalDeviceExternalBufferProperties( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo, + VkExternalBufferProperties *pExternalBufferProperties) +{ + BITMASK_ENUM(VkExternalMemoryFeatureFlagBits) flags = 0; + VkExternalMemoryHandleTypeFlags export_flags = 0; + VkExternalMemoryHandleTypeFlags compat_flags = 0; + switch (pExternalBufferInfo->handleType) { + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT: + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT: + flags = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT; + compat_flags = export_flags = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT | + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; + break; + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT: + flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT; + compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT; + break; + default: + break; + } + pExternalBufferProperties->externalMemoryProperties = + (VkExternalMemoryProperties) { + .externalMemoryFeatures = flags, + .exportFromImportedHandleTypes = export_flags, + .compatibleHandleTypes = compat_flags, + }; +} + +VKAPI_ATTR VkResult VKAPI_CALL +tu_BindBufferMemory2(VkDevice device, + uint32_t bindInfoCount, + const VkBindBufferMemoryInfo *pBindInfos) +{ + VK_FROM_HANDLE(tu_device, dev, device); + + for (uint32_t i = 0; i < bindInfoCount; ++i) { + VK_FROM_HANDLE(tu_device_memory, mem, pBindInfos[i].memory); + VK_FROM_HANDLE(tu_buffer, buffer, pBindInfos[i].buffer); + + const VkBindMemoryStatusKHR *status = + vk_find_struct_const(pBindInfos[i].pNext, BIND_MEMORY_STATUS_KHR); + if (status) + *status->pResult = VK_SUCCESS; + + if (mem) { + buffer->bo = mem->bo; + buffer->iova = mem->bo->iova + pBindInfos[i].memoryOffset; + if (buffer->vk.usage & + (VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT | + VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT)) + tu_bo_allow_dump(dev, mem->bo); +#ifdef HAVE_PERFETTO + tu_perfetto_log_bind_buffer(dev, buffer); +#endif + } else { + buffer->bo = NULL; + } + + TU_RMV(buffer_bind, dev, buffer); + } + return VK_SUCCESS; +} + +VkDeviceAddress +tu_GetBufferDeviceAddress(VkDevice _device, + const VkBufferDeviceAddressInfo* pInfo) +{ + VK_FROM_HANDLE(tu_buffer, buffer, pInfo->buffer); + + return buffer->iova; +} + +uint64_t tu_GetBufferOpaqueCaptureAddress( + VkDevice _device, + const VkBufferDeviceAddressInfo* pInfo) +{ + /* We care only about memory allocation opaque addresses */ + return 0; +} diff --git a/src/freedreno/vulkan/tu_buffer.h b/src/freedreno/vulkan/tu_buffer.h new file mode 100644 index 00000000000..149ec5e0eca --- /dev/null +++ b/src/freedreno/vulkan/tu_buffer.h @@ -0,0 +1,28 @@ +/* + * Copyright © 2016 Red Hat. + * Copyright © 2016 Bas Nieuwenhuizen + * SPDX-License-Identifier: MIT + * + * based in part on anv driver which is: + * Copyright © 2015 Intel Corporation + */ + +#ifndef TU_BUFFER_H +#define TU_BUFFER_H + +#include "tu_common.h" + +#include "vk_buffer.h" + +struct tu_buffer +{ + struct vk_buffer vk; + + struct tu_bo *bo; + uint64_t iova; +}; + +VK_DEFINE_NONDISP_HANDLE_CASTS(tu_buffer, vk.base, VkBuffer, + VK_OBJECT_TYPE_BUFFER) + +#endif /* TU_BUFFER_H */ diff --git a/src/freedreno/vulkan/tu_clear_blit.cc b/src/freedreno/vulkan/tu_clear_blit.cc index 6b7383f2409..7dc871a8015 100644 --- a/src/freedreno/vulkan/tu_clear_blit.cc +++ b/src/freedreno/vulkan/tu_clear_blit.cc @@ -16,6 +16,7 @@ #include "util/half_float.h" #include "compiler/nir/nir_builder.h" +#include "tu_buffer.h" #include "tu_cmd_buffer.h" #include "tu_cs.h" #include "tu_formats.h" diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index fc7edef546c..f6ef5a4a53e 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -13,6 +13,7 @@ #include "vk_render_pass.h" #include "vk_util.h" +#include "tu_buffer.h" #include "tu_clear_blit.h" #include "tu_cs.h" #include "tu_event.h" diff --git a/src/freedreno/vulkan/tu_descriptor_set.cc b/src/freedreno/vulkan/tu_descriptor_set.cc index 639f504ca01..0be23d5534b 100644 --- a/src/freedreno/vulkan/tu_descriptor_set.cc +++ b/src/freedreno/vulkan/tu_descriptor_set.cc @@ -27,6 +27,7 @@ #include "vk_descriptors.h" #include "vk_util.h" +#include "tu_buffer.h" #include "tu_device.h" #include "tu_image.h" #include "tu_formats.h" diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc index 5c3b6d7a47f..0818c3dca21 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc @@ -2948,36 +2948,6 @@ tu_UnmapMemory2KHR(VkDevice _device, const VkMemoryUnmapInfoKHR *pMemoryUnmapInf return tu_bo_unmap(device, mem->bo, pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT); } -VKAPI_ATTR void VKAPI_CALL -tu_GetDeviceBufferMemoryRequirements( - VkDevice _device, - const VkDeviceBufferMemoryRequirements *pInfo, - VkMemoryRequirements2 *pMemoryRequirements) -{ - VK_FROM_HANDLE(tu_device, device, _device); - - uint64_t size = pInfo->pCreateInfo->size; - pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) { - .size = MAX2(align64(size, 64), size), - .alignment = 64, - .memoryTypeBits = (1 << dev->physical_device->memory.type_count) - 1, - }; - - vk_foreach_struct(ext, pMemoryRequirements->pNext) { - switch (ext->sType) { - case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: { - VkMemoryDedicatedRequirements *req = - (VkMemoryDedicatedRequirements *) ext; - req->requiresDedicatedAllocation = false; - req->prefersDedicatedAllocation = req->requiresDedicatedAllocation; - break; - } - default: - break; - } - } -} - VKAPI_ATTR void VKAPI_CALL tu_GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, @@ -2986,41 +2956,6 @@ tu_GetDeviceMemoryCommitment(VkDevice device, *pCommittedMemoryInBytes = 0; } -VKAPI_ATTR VkResult VKAPI_CALL -tu_BindBufferMemory2(VkDevice device, - uint32_t bindInfoCount, - const VkBindBufferMemoryInfo *pBindInfos) -{ - VK_FROM_HANDLE(tu_device, dev, device); - - for (uint32_t i = 0; i < bindInfoCount; ++i) { - VK_FROM_HANDLE(tu_device_memory, mem, pBindInfos[i].memory); - VK_FROM_HANDLE(tu_buffer, buffer, pBindInfos[i].buffer); - - const VkBindMemoryStatusKHR *status = - vk_find_struct_const(pBindInfos[i].pNext, BIND_MEMORY_STATUS_KHR); - if (status) - *status->pResult = VK_SUCCESS; - - if (mem) { - buffer->bo = mem->bo; - buffer->iova = mem->bo->iova + pBindInfos[i].memoryOffset; - if (buffer->vk.usage & - (VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT | - VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT)) - tu_bo_allow_dump(dev, mem->bo); -#ifdef HAVE_PERFETTO - tu_perfetto_log_bind_buffer(dev, buffer); -#endif - } else { - buffer->bo = NULL; - } - - TU_RMV(buffer_bind, dev, buffer); - } - return VK_SUCCESS; -} - VKAPI_ATTR VkResult VKAPI_CALL tu_QueueBindSparse(VkQueue _queue, uint32_t bindInfoCount, @@ -3030,51 +2965,6 @@ tu_QueueBindSparse(VkQueue _queue, return VK_SUCCESS; } -VKAPI_ATTR VkResult VKAPI_CALL -tu_CreateBuffer(VkDevice _device, - const VkBufferCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkBuffer *pBuffer) -{ - VK_FROM_HANDLE(tu_device, device, _device); - struct tu_buffer *buffer; - - buffer = (struct tu_buffer *) vk_buffer_create( - &device->vk, pCreateInfo, pAllocator, sizeof(*buffer)); - if (buffer == NULL) - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - - TU_RMV(buffer_create, device, buffer); - -#ifdef HAVE_PERFETTO - tu_perfetto_log_create_buffer(device, buffer); -#endif - - *pBuffer = tu_buffer_to_handle(buffer); - - return VK_SUCCESS; -} - -VKAPI_ATTR void VKAPI_CALL -tu_DestroyBuffer(VkDevice _device, - VkBuffer _buffer, - const VkAllocationCallbacks *pAllocator) -{ - VK_FROM_HANDLE(tu_device, device, _device); - VK_FROM_HANDLE(tu_buffer, buffer, _buffer); - - if (!buffer) - return; - - TU_RMV(buffer_destroy, device, buffer); - -#ifdef HAVE_PERFETTO - tu_perfetto_log_destroy_buffer(device, buffer); -#endif - - vk_buffer_destroy(&device->vk, pAllocator, &buffer->vk); -} - VKAPI_ATTR VkResult VKAPI_CALL tu_CreateFramebuffer(VkDevice _device, const VkFramebufferCreateInfo *pCreateInfo, @@ -3229,23 +3119,6 @@ tu_GetPhysicalDeviceMultisamplePropertiesEXT( pMultisampleProperties->maxSampleLocationGridSize = (VkExtent2D){ 0, 0 }; } -VkDeviceAddress -tu_GetBufferDeviceAddress(VkDevice _device, - const VkBufferDeviceAddressInfo* pInfo) -{ - VK_FROM_HANDLE(tu_buffer, buffer, pInfo->buffer); - - return buffer->iova; -} - -uint64_t tu_GetBufferOpaqueCaptureAddress( - VkDevice device, - const VkBufferDeviceAddressInfo* pInfo) -{ - /* We care only about memory allocation opaque addresses */ - return 0; -} - uint64_t tu_GetDeviceMemoryOpaqueCaptureAddress( VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) diff --git a/src/freedreno/vulkan/tu_device.h b/src/freedreno/vulkan/tu_device.h index 656c6dd3134..dd8d97065ff 100644 --- a/src/freedreno/vulkan/tu_device.h +++ b/src/freedreno/vulkan/tu_device.h @@ -12,7 +12,6 @@ #include "tu_common.h" -#include "vk_buffer.h" #include "vk_device_memory.h" #include "tu_autotune.h" @@ -420,16 +419,6 @@ struct tu_device_memory VK_DEFINE_NONDISP_HANDLE_CASTS(tu_device_memory, vk.base, VkDeviceMemory, VK_OBJECT_TYPE_DEVICE_MEMORY) -struct tu_buffer -{ - struct vk_buffer vk; - - struct tu_bo *bo; - uint64_t iova; -}; -VK_DEFINE_NONDISP_HANDLE_CASTS(tu_buffer, vk.base, VkBuffer, - VK_OBJECT_TYPE_BUFFER) - struct tu_attachment_info { struct tu_image_view *attachment; diff --git a/src/freedreno/vulkan/tu_formats.cc b/src/freedreno/vulkan/tu_formats.cc index 9552a993ff3..42c135f6eef 100644 --- a/src/freedreno/vulkan/tu_formats.cc +++ b/src/freedreno/vulkan/tu_formats.cc @@ -872,36 +872,3 @@ tu_GetPhysicalDeviceSparseImageFormatProperties2( /* Sparse images are not yet supported. */ *pPropertyCount = 0; } - -VKAPI_ATTR void VKAPI_CALL -tu_GetPhysicalDeviceExternalBufferProperties( - VkPhysicalDevice physicalDevice, - const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo, - VkExternalBufferProperties *pExternalBufferProperties) -{ - BITMASK_ENUM(VkExternalMemoryFeatureFlagBits) flags = 0; - VkExternalMemoryHandleTypeFlags export_flags = 0; - VkExternalMemoryHandleTypeFlags compat_flags = 0; - switch (pExternalBufferInfo->handleType) { - case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT: - case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT: - flags = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | - VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT; - compat_flags = export_flags = - VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT | - VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; - break; - case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT: - flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT; - compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT; - break; - default: - break; - } - pExternalBufferProperties->externalMemoryProperties = - (VkExternalMemoryProperties) { - .externalMemoryFeatures = flags, - .exportFromImportedHandleTypes = export_flags, - .compatibleHandleTypes = compat_flags, - }; -} diff --git a/src/freedreno/vulkan/tu_image.cc b/src/freedreno/vulkan/tu_image.cc index f15d2e7e95f..0a2ad0219ff 100644 --- a/src/freedreno/vulkan/tu_image.cc +++ b/src/freedreno/vulkan/tu_image.cc @@ -19,6 +19,7 @@ #include "drm-uapi/drm_fourcc.h" #include "vulkan/vulkan_core.h" +#include "tu_buffer.h" #include "tu_cs.h" #include "tu_descriptor_set.h" #include "tu_device.h" diff --git a/src/freedreno/vulkan/tu_perfetto.cc b/src/freedreno/vulkan/tu_perfetto.cc index a75d171e420..9b3b248b7df 100644 --- a/src/freedreno/vulkan/tu_perfetto.cc +++ b/src/freedreno/vulkan/tu_perfetto.cc @@ -6,6 +6,7 @@ #include #include "tu_perfetto.h" +#include "tu_buffer.h" #include "tu_device.h" #include "tu_image.h" diff --git a/src/freedreno/vulkan/tu_query.cc b/src/freedreno/vulkan/tu_query.cc index 0042d30c863..f92e688207d 100644 --- a/src/freedreno/vulkan/tu_query.cc +++ b/src/freedreno/vulkan/tu_query.cc @@ -15,6 +15,7 @@ #include "vk_util.h" +#include "tu_buffer.h" #include "tu_cmd_buffer.h" #include "tu_cs.h" #include "tu_device.h" diff --git a/src/freedreno/vulkan/tu_rmv.cc b/src/freedreno/vulkan/tu_rmv.cc index 4f5fa848610..de54b14954e 100644 --- a/src/freedreno/vulkan/tu_rmv.cc +++ b/src/freedreno/vulkan/tu_rmv.cc @@ -5,6 +5,7 @@ #include "tu_rmv.h" +#include "tu_buffer.h" #include "tu_cmd_buffer.h" #include "tu_cs.h" #include "tu_device.h"