nvk: Implement VK_EXT/KHR_buffer_device_address

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
Faith Ekstrand 2023-01-30 20:12:02 -06:00 committed by Marge Bot
parent 07f48c925b
commit ed6d5c33c6
4 changed files with 44 additions and 0 deletions

View file

@ -79,3 +79,21 @@ nvk_BindBufferMemory2(VkDevice _device,
} }
return VK_SUCCESS; return VK_SUCCESS;
} }
VKAPI_ATTR VkDeviceAddress VKAPI_CALL
nvk_GetBufferDeviceAddress(UNUSED VkDevice device,
const VkBufferDeviceAddressInfo *pInfo)
{
VK_FROM_HANDLE(nvk_buffer, buffer, pInfo->buffer);
return nvk_buffer_address(buffer, 0);
}
VKAPI_ATTR uint64_t VKAPI_CALL
nvk_GetBufferOpaqueCaptureAddress(UNUSED VkDevice device,
const VkBufferDeviceAddressInfo *pInfo)
{
VK_FROM_HANDLE(nvk_buffer, buffer, pInfo->buffer);
return nvk_buffer_address(buffer, 0);
}

View file

@ -301,3 +301,13 @@ nvk_GetMemoryFdKHR(VkDevice _device,
return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT); return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT);
} }
} }
VKAPI_ATTR uint64_t VKAPI_CALL
nvk_GetDeviceMemoryOpaqueCaptureAddress(
UNUSED VkDevice device,
const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo)
{
VK_FROM_HANDLE(nvk_device_memory, mem, pInfo->memory);
return mem->bo->offset;
}

View file

@ -78,6 +78,9 @@ nvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
.imagelessFramebuffer = true, .imagelessFramebuffer = true,
.separateDepthStencilLayouts = true, .separateDepthStencilLayouts = true,
.hostQueryReset = true, .hostQueryReset = true,
.bufferDeviceAddress = true,
.bufferDeviceAddressCaptureReplay = false,
.bufferDeviceAddressMultiDevice = false,
}; };
VkPhysicalDeviceVulkan13Features core_1_3 = { VkPhysicalDeviceVulkan13Features core_1_3 = {
@ -109,6 +112,13 @@ nvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
f->borderColorSwizzleFromImage = false; f->borderColorSwizzleFromImage = false;
break; break;
} }
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
VkPhysicalDeviceBufferDeviceAddressFeaturesEXT *f = (void *)ext;
f->bufferDeviceAddress = true;
f->bufferDeviceAddressCaptureReplay = false;
f->bufferDeviceAddressMultiDevice = false;
break;
}
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: { case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: {
VkPhysicalDeviceCustomBorderColorFeaturesEXT *f = (void *)ext; VkPhysicalDeviceCustomBorderColorFeaturesEXT *f = (void *)ext;
f->customBorderColors = true; f->customBorderColors = true;
@ -349,6 +359,7 @@ nvk_get_device_extensions(const struct nvk_physical_device *device,
struct vk_device_extension_table *ext) struct vk_device_extension_table *ext)
{ {
*ext = (struct vk_device_extension_table) { *ext = (struct vk_device_extension_table) {
.KHR_buffer_device_address = true,
.KHR_copy_commands2 = true, .KHR_copy_commands2 = true,
.KHR_create_renderpass2 = true, .KHR_create_renderpass2 = true,
.KHR_dedicated_allocation = true, .KHR_dedicated_allocation = true,
@ -369,6 +380,7 @@ nvk_get_device_extensions(const struct nvk_physical_device *device,
#endif #endif
.KHR_variable_pointers = true, .KHR_variable_pointers = true,
.EXT_border_color_swizzle = true, .EXT_border_color_swizzle = true,
.EXT_buffer_device_address = true,
.EXT_custom_border_color = true, .EXT_custom_border_color = true,
.EXT_extended_dynamic_state = true, .EXT_extended_dynamic_state = true,
.EXT_extended_dynamic_state2 = true, .EXT_extended_dynamic_state2 = true,

View file

@ -61,8 +61,10 @@ nvk_physical_device_spirv_options(const struct nvk_physical_device *pdevice,
return (struct spirv_to_nir_options) { return (struct spirv_to_nir_options) {
.caps = { .caps = {
.image_write_without_format = true, .image_write_without_format = true,
.physical_storage_buffer_address = true,
}, },
.ssbo_addr_format = nvk_buffer_addr_format(rs->storage_buffers), .ssbo_addr_format = nvk_buffer_addr_format(rs->storage_buffers),
.phys_ssbo_addr_format = nir_address_format_64bit_global,
.ubo_addr_format = nvk_buffer_addr_format(rs->uniform_buffers), .ubo_addr_format = nvk_buffer_addr_format(rs->uniform_buffers),
.shared_addr_format = nir_address_format_32bit_offset, .shared_addr_format = nir_address_format_32bit_offset,
}; };
@ -237,6 +239,8 @@ nvk_lower_nir(struct nvk_device *device, nir_shader *nir,
nir_address_format_32bit_offset); nir_address_format_32bit_offset);
NIR_PASS(_, nir, nvk_nir_lower_descriptors, rs, layout); NIR_PASS(_, nir, nvk_nir_lower_descriptors, rs, layout);
NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_global,
nir_address_format_64bit_global);
NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_ssbo, NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_ssbo,
nvk_buffer_addr_format(rs->storage_buffers)); nvk_buffer_addr_format(rs->storage_buffers));
NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_ubo, NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_ubo,