mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 04:58:05 +02:00
radv: add support for VkBufferUsageFlags2CreateInfoKHR
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24392>
This commit is contained in:
parent
9089b091b2
commit
2ed52ca578
5 changed files with 41 additions and 15 deletions
|
|
@ -1099,7 +1099,7 @@ create_bview(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buffer, uns
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_buffer_from_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *surf,
|
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 *device = cmd_buffer->device;
|
||||||
struct radv_device_memory mem;
|
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,
|
radv_create_buffer(device,
|
||||||
&(VkBufferCreateInfo){
|
&(VkBufferCreateInfo){
|
||||||
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
||||||
|
.pNext =
|
||||||
|
&(VkBufferUsageFlags2CreateInfoKHR){
|
||||||
|
.sType = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR,
|
||||||
|
.usage = usage,
|
||||||
|
},
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.size = surf->image->size,
|
.size = surf->image->size,
|
||||||
.usage = usage,
|
|
||||||
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
||||||
},
|
},
|
||||||
NULL, buffer, true);
|
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
|
* image as a buffer with the same underlying memory. The compute
|
||||||
* shader will copy all components separately using a R32 format.
|
* 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(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);
|
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
|
* image as a buffer with the same underlying memory. The compute
|
||||||
* shader will copy all components separately using a R32 format.
|
* 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, src, VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR, &src_buffer);
|
||||||
create_buffer_from_image(cmd_buffer, dst, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, &dst_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(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);
|
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
|
* image as a buffer with the same underlying memory. The compute
|
||||||
* shader will clear all components separately using a R32 format.
|
* 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);
|
create_bview_for_r32g32b32(cmd_buffer, radv_buffer_from_handle(buffer), 0, dst->format, &dst_view);
|
||||||
cleari_r32g32b32_bind_descriptors(cmd_buffer, &dst_view);
|
cleari_r32g32b32_bind_descriptors(cmd_buffer, &dst_view);
|
||||||
|
|
|
||||||
|
|
@ -412,8 +412,12 @@ radv_device_init_null_accel_struct(struct radv_device *device)
|
||||||
|
|
||||||
VkBufferCreateInfo buffer_create_info = {
|
VkBufferCreateInfo buffer_create_info = {
|
||||||
.sType = VK_STRUCTURE_TYPE_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,
|
.size = size,
|
||||||
.usage = VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR,
|
|
||||||
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -167,7 +167,7 @@ radv_BindBufferMemory2(VkDevice _device, uint32_t bindInfoCount, const VkBindBuf
|
||||||
|
|
||||||
static void
|
static void
|
||||||
radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize size, VkBufferCreateFlags flags,
|
radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize size, VkBufferCreateFlags flags,
|
||||||
VkBufferUsageFlags usage, VkMemoryRequirements2 *pMemoryRequirements)
|
VkBufferUsageFlags2KHR usage, VkMemoryRequirements2 *pMemoryRequirements)
|
||||||
{
|
{
|
||||||
pMemoryRequirements->memoryRequirements.memoryTypeBits =
|
pMemoryRequirements->memoryRequirements.memoryTypeBits =
|
||||||
((1u << device->physical_device->memory_properties.memoryTypeCount) - 1u) &
|
((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
|
* vkGetGeneratedCommandsMemoryRequirementsNV. (we have to make sure their
|
||||||
* intersection is non-zero at least)
|
* 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;
|
pMemoryRequirements->memoryRequirements.memoryTypeBits |= device->physical_device->memory_types_32bit;
|
||||||
|
|
||||||
/* Force 32-bit address-space for descriptor buffers usage because they are passed to shaders
|
/* Force 32-bit address-space for descriptor buffers usage because they are passed to shaders
|
||||||
* through 32-bit pointers.
|
* 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;
|
pMemoryRequirements->memoryRequirements.memoryTypeBits = device->physical_device->memory_types_32bit;
|
||||||
|
|
||||||
if (flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
|
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
|
* the root ids of instances. The hardware also needs bvh nodes to
|
||||||
* be 64 byte aligned.
|
* 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.alignment = MAX2(pMemoryRequirements->memoryRequirements.alignment, 64);
|
||||||
|
|
||||||
pMemoryRequirements->memoryRequirements.size = align64(size, pMemoryRequirements->memoryRequirements.alignment);
|
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
|
VKAPI_ATTR void VKAPI_CALL
|
||||||
radv_GetDeviceBufferMemoryRequirements(VkDevice _device, const VkDeviceBufferMemoryRequirements *pInfo,
|
radv_GetDeviceBufferMemoryRequirements(VkDevice _device, const VkDeviceBufferMemoryRequirements *pInfo,
|
||||||
VkMemoryRequirements2 *pMemoryRequirements)
|
VkMemoryRequirements2 *pMemoryRequirements)
|
||||||
{
|
{
|
||||||
RADV_FROM_HANDLE(radv_device, device, _device);
|
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,
|
radv_get_buffer_memory_requirements(device, pInfo->pCreateInfo->size, pInfo->pCreateInfo->flags, usage_flags,
|
||||||
pInfo->pCreateInfo->usage, pMemoryRequirements);
|
pMemoryRequirements);
|
||||||
}
|
}
|
||||||
|
|
||||||
VKAPI_ATTR VkDeviceAddress VKAPI_CALL
|
VKAPI_ATTR VkDeviceAddress VKAPI_CALL
|
||||||
|
|
|
||||||
|
|
@ -325,8 +325,12 @@ radv_device_init_vrs_state(struct radv_device *device)
|
||||||
|
|
||||||
VkBufferCreateInfo buffer_create_info = {
|
VkBufferCreateInfo buffer_create_info = {
|
||||||
.sType = VK_STRUCTURE_TYPE_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,
|
.size = radv_image_from_handle(image)->planes[0].surface.meta_size,
|
||||||
.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
|
||||||
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -968,8 +968,12 @@ rra_copy_context_init(struct rra_copy_context *ctx)
|
||||||
|
|
||||||
VkBufferCreateInfo buffer_create_info = {
|
VkBufferCreateInfo buffer_create_info = {
|
||||||
.sType = VK_STRUCTURE_TYPE_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,
|
.size = max_size,
|
||||||
.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
result = radv_CreateBuffer(ctx->device, &buffer_create_info, NULL, &ctx->buffer);
|
result = radv_CreateBuffer(ctx->device, &buffer_create_info, NULL, &ctx->buffer);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue