diff options
-rw-r--r-- | src/intel/vulkan/anv_device.c | 59 | ||||
-rw-r--r-- | src/intel/vulkan/anv_extensions.py | 1 |
2 files changed, 53 insertions, 7 deletions
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 41e9e16cb88..9db62ef919e 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -998,6 +998,15 @@ void anv_GetPhysicalDeviceFeatures2( break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR: { + VkPhysicalDeviceBufferDeviceAddressFeaturesKHR *features = (void *)ext; + features->bufferDeviceAddress = pdevice->has_a64_buffer_access; + features->bufferDeviceAddressCaptureReplay = + pdevice->has_a64_buffer_access; + features->bufferDeviceAddressMultiDevice = false; + break; + } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: { VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *features = (VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *)ext; @@ -3092,6 +3101,8 @@ VkResult anv_AllocateMemory( const VkImportMemoryFdInfoKHR *fd_info = NULL; const VkImportMemoryHostPointerInfoEXT *host_ptr_info = NULL; const VkMemoryDedicatedAllocateInfo *dedicated_info = NULL; + VkMemoryAllocateFlags vk_flags = 0; + uint64_t client_address = 0; vk_foreach_struct_const(ext, pAllocateInfo->pNext) { switch (ext->sType) { @@ -3111,10 +3122,23 @@ VkResult anv_AllocateMemory( host_ptr_info = (void *)ext; break; + case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: { + const VkMemoryAllocateFlagsInfo *flags_info = (void *)ext; + vk_flags = flags_info->flags; + break; + } + case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: dedicated_info = (void *)ext; break; + case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR: { + const VkMemoryOpaqueCaptureAddressAllocateInfoKHR *addr_info = + (const VkMemoryOpaqueCaptureAddressAllocateInfoKHR *)ext; + client_address = addr_info->opaqueCaptureAddress; + break; + } + case VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA: { const struct wsi_memory_allocate_info *wsi_info = (void *)ext; if (wsi_info->implicit_sync) { @@ -3134,6 +3158,9 @@ VkResult anv_AllocateMemory( } } + if (vk_flags & VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR) + alloc_flags |= ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS; + /* Check if we need to support Android HW buffer export. If so, * create AHardwareBuffer and import memory from it. */ @@ -3174,7 +3201,7 @@ VkResult anv_AllocateMemory( VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT); result = anv_device_import_bo(device, fd_info->fd, alloc_flags, - 0 /* client_address */, &mem->bo); + client_address, &mem->bo); if (result != VK_SUCCESS) goto fail; @@ -3227,9 +3254,8 @@ VkResult anv_AllocateMemory( host_ptr_info->pHostPointer, pAllocateInfo->allocationSize, alloc_flags, - 0 /* client_address */, + client_address, &mem->bo); - if (result != VK_SUCCESS) goto fail; @@ -3243,8 +3269,7 @@ VkResult anv_AllocateMemory( alloc_flags |= ANV_BO_ALLOC_EXTERNAL; result = anv_device_alloc_bo(device, pAllocateInfo->allocationSize, - alloc_flags, 0 /* explicit_address */, - &mem->bo); + alloc_flags, client_address, &mem->bo); if (result != VK_SUCCESS) goto fail; @@ -3932,17 +3957,37 @@ void anv_DestroyBuffer( vk_free2(&device->alloc, pAllocator, buffer); } -VkDeviceAddress anv_GetBufferDeviceAddressEXT( +VkDeviceAddress anv_GetBufferDeviceAddressKHR( VkDevice device, - const VkBufferDeviceAddressInfoEXT* pInfo) + const VkBufferDeviceAddressInfoKHR* pInfo) { ANV_FROM_HANDLE(anv_buffer, buffer, pInfo->buffer); + assert(!anv_address_is_null(buffer->address)); assert(buffer->address.bo->flags & EXEC_OBJECT_PINNED); return anv_address_physical(buffer->address); } +uint64_t anv_GetBufferOpaqueCaptureAddressKHR( + VkDevice device, + const VkBufferDeviceAddressInfoKHR* pInfo) +{ + return 0; +} + +uint64_t anv_GetDeviceMemoryOpaqueCaptureAddressKHR( + VkDevice device, + const VkDeviceMemoryOpaqueCaptureAddressInfoKHR* pInfo) +{ + ANV_FROM_HANDLE(anv_device_memory, memory, pInfo->memory); + + assert(memory->bo->flags & EXEC_OBJECT_PINNED); + assert(memory->bo->has_client_visible_address); + + return gen_48b_address(memory->bo->offset); +} + void anv_fill_buffer_surface_state(struct anv_device *device, struct anv_state state, enum isl_format format, diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_extensions.py index 2be33d4b694..66752535cf5 100644 --- a/src/intel/vulkan/anv_extensions.py +++ b/src/intel/vulkan/anv_extensions.py @@ -70,6 +70,7 @@ EXTENSIONS = [ Extension('VK_KHR_8bit_storage', 1, 'device->info.gen >= 8'), Extension('VK_KHR_16bit_storage', 1, 'device->info.gen >= 8'), Extension('VK_KHR_bind_memory2', 1, True), + Extension('VK_KHR_buffer_device_address', 1, True), Extension('VK_KHR_create_renderpass2', 1, True), Extension('VK_KHR_dedicated_allocation', 1, True), Extension('VK_KHR_depth_stencil_resolve', 1, True), |