From 2ed52ca5786cdc19a1de9a311d2d3a40e35f5449 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 28 Jul 2023 09:17:14 +0200 Subject: [PATCH] radv: add support for VkBufferUsageFlags2CreateInfoKHR Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta_bufimage.c | 16 ++++++++------ src/amd/vulkan/radv_acceleration_structure.c | 6 +++++- src/amd/vulkan/radv_buffer.c | 22 ++++++++++++++------ src/amd/vulkan/radv_device.c | 6 +++++- src/amd/vulkan/radv_rra.c | 6 +++++- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta_bufimage.c b/src/amd/vulkan/meta/radv_meta_bufimage.c index b5fe7cb1761..fa395fba693 100644 --- a/src/amd/vulkan/meta/radv_meta_bufimage.c +++ b/src/amd/vulkan/meta/radv_meta_bufimage.c @@ -1099,7 +1099,7 @@ create_bview(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buffer, uns static void create_buffer_from_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *surf, - VkBufferUsageFlagBits usage, VkBuffer *buffer) + VkBufferUsageFlagBits2KHR usage, VkBuffer *buffer) { struct radv_device *device = cmd_buffer->device; struct radv_device_memory mem; @@ -1109,9 +1109,13 @@ create_buffer_from_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_bl radv_create_buffer(device, &(VkBufferCreateInfo){ .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .pNext = + &(VkBufferUsageFlags2CreateInfoKHR){ + .sType = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR, + .usage = usage, + }, .flags = 0, .size = surf->image->size, - .usage = usage, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, }, NULL, buffer, true); @@ -1357,7 +1361,7 @@ radv_meta_buffer_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struc * image as a buffer with the same underlying memory. The compute * shader will copy all components separately using a R32 format. */ - create_buffer_from_image(cmd_buffer, dst, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, &buffer); + create_buffer_from_image(cmd_buffer, dst, VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR, &buffer); create_bview(cmd_buffer, src->buffer, src->offset, src->format, &src_view); create_bview_for_r32g32b32(cmd_buffer, radv_buffer_from_handle(buffer), dst_offset, dst->format, &dst_view); @@ -1504,8 +1508,8 @@ radv_meta_image_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struct * image as a buffer with the same underlying memory. The compute * shader will copy all components separately using a R32 format. */ - create_buffer_from_image(cmd_buffer, src, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, &src_buffer); - create_buffer_from_image(cmd_buffer, dst, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, &dst_buffer); + create_buffer_from_image(cmd_buffer, src, VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR, &src_buffer); + create_buffer_from_image(cmd_buffer, dst, VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR, &dst_buffer); create_bview_for_r32g32b32(cmd_buffer, radv_buffer_from_handle(src_buffer), src_offset, src->format, &src_view); create_bview_for_r32g32b32(cmd_buffer, radv_buffer_from_handle(dst_buffer), dst_offset, dst->format, &dst_view); @@ -1647,7 +1651,7 @@ radv_meta_clear_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struct ra * image as a buffer with the same underlying memory. The compute * shader will clear all components separately using a R32 format. */ - create_buffer_from_image(cmd_buffer, dst, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, &buffer); + create_buffer_from_image(cmd_buffer, dst, VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR, &buffer); create_bview_for_r32g32b32(cmd_buffer, radv_buffer_from_handle(buffer), 0, dst->format, &dst_view); cleari_r32g32b32_bind_descriptors(cmd_buffer, &dst_view); diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c index 31f9619f626..ece47b1230c 100644 --- a/src/amd/vulkan/radv_acceleration_structure.c +++ b/src/amd/vulkan/radv_acceleration_structure.c @@ -412,8 +412,12 @@ radv_device_init_null_accel_struct(struct radv_device *device) VkBufferCreateInfo buffer_create_info = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .pNext = + &(VkBufferUsageFlags2CreateInfoKHR){ + .sType = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR, + .usage = VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR, + }, .size = size, - .usage = VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, }; diff --git a/src/amd/vulkan/radv_buffer.c b/src/amd/vulkan/radv_buffer.c index 601130e5f47..a42a61cac06 100644 --- a/src/amd/vulkan/radv_buffer.c +++ b/src/amd/vulkan/radv_buffer.c @@ -167,7 +167,7 @@ radv_BindBufferMemory2(VkDevice _device, uint32_t bindInfoCount, const VkBindBuf static void radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize size, VkBufferCreateFlags flags, - VkBufferUsageFlags usage, VkMemoryRequirements2 *pMemoryRequirements) + VkBufferUsageFlags2KHR usage, VkMemoryRequirements2 *pMemoryRequirements) { pMemoryRequirements->memoryRequirements.memoryTypeBits = ((1u << device->physical_device->memory_properties.memoryTypeCount) - 1u) & @@ -182,13 +182,14 @@ radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize siz * vkGetGeneratedCommandsMemoryRequirementsNV. (we have to make sure their * intersection is non-zero at least) */ - if ((usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) && device->uses_device_generated_commands) + if ((usage & VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT_KHR) && device->uses_device_generated_commands) pMemoryRequirements->memoryRequirements.memoryTypeBits |= device->physical_device->memory_types_32bit; /* Force 32-bit address-space for descriptor buffers usage because they are passed to shaders * through 32-bit pointers. */ - if (usage & (VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT | VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT)) + if (usage & + (VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT | VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT)) pMemoryRequirements->memoryRequirements.memoryTypeBits = device->physical_device->memory_types_32bit; if (flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) @@ -200,7 +201,7 @@ radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize siz * the root ids of instances. The hardware also needs bvh nodes to * be 64 byte aligned. */ - if (usage & VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR) + if (usage & VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR) pMemoryRequirements->memoryRequirements.alignment = MAX2(pMemoryRequirements->memoryRequirements.alignment, 64); pMemoryRequirements->memoryRequirements.size = align64(size, pMemoryRequirements->memoryRequirements.alignment); @@ -219,14 +220,23 @@ radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize siz } } +static const VkBufferUsageFlagBits2KHR +radv_get_buffer_usage_flags(const VkBufferCreateInfo *pCreateInfo) +{ + const VkBufferUsageFlags2CreateInfoKHR *flags2 = + vk_find_struct_const(pCreateInfo->pNext, BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR); + return flags2 ? flags2->usage : pCreateInfo->usage; +} + VKAPI_ATTR void VKAPI_CALL radv_GetDeviceBufferMemoryRequirements(VkDevice _device, const VkDeviceBufferMemoryRequirements *pInfo, VkMemoryRequirements2 *pMemoryRequirements) { RADV_FROM_HANDLE(radv_device, device, _device); + const VkBufferUsageFlagBits2KHR usage_flags = radv_get_buffer_usage_flags(pInfo->pCreateInfo); - radv_get_buffer_memory_requirements(device, pInfo->pCreateInfo->size, pInfo->pCreateInfo->flags, - pInfo->pCreateInfo->usage, pMemoryRequirements); + radv_get_buffer_memory_requirements(device, pInfo->pCreateInfo->size, pInfo->pCreateInfo->flags, usage_flags, + pMemoryRequirements); } VKAPI_ATTR VkDeviceAddress VKAPI_CALL diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index a32269aceb9..56a539fd3c1 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -325,8 +325,12 @@ radv_device_init_vrs_state(struct radv_device *device) VkBufferCreateInfo buffer_create_info = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .pNext = + &(VkBufferUsageFlags2CreateInfoKHR){ + .sType = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR, + .usage = VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR, + }, .size = radv_image_from_handle(image)->planes[0].surface.meta_size, - .usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, }; diff --git a/src/amd/vulkan/radv_rra.c b/src/amd/vulkan/radv_rra.c index 9c195784c82..670a4a3fdf7 100644 --- a/src/amd/vulkan/radv_rra.c +++ b/src/amd/vulkan/radv_rra.c @@ -968,8 +968,12 @@ rra_copy_context_init(struct rra_copy_context *ctx) VkBufferCreateInfo buffer_create_info = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .pNext = + &(VkBufferUsageFlags2CreateInfoKHR){ + .sType = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR, + .usage = VK_BUFFER_USAGE_2_TRANSFER_DST_BIT_KHR, + }, .size = max_size, - .usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT, }; result = radv_CreateBuffer(ctx->device, &buffer_create_info, NULL, &ctx->buffer);