turnip: implement VK_KHR_buffer_device_address

We don't advertise bufferDeviceAddressCaptureReplay capability and
neither does blob, because at the moment there is no way to allocate
bo with predefined iova.

There is no support of any arithmetic with addresses since shaderInt64
is not enabled. However, we could enable int64 support whenever we want.

Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8717>
This commit is contained in:
Danylo Piliaiev 2021-07-26 13:55:39 +03:00 committed by Marge Bot
parent 99388f0c27
commit d5757c965a
3 changed files with 11 additions and 4 deletions

View File

@ -446,7 +446,7 @@ Vulkan 1.1 -- all DONE: anv, lvp, radv, tu, vn
Vulkan 1.2 -- all DONE: anv, vn
VK_KHR_8bit_storage DONE (anv/gen8+, lvp, radv, vn)
VK_KHR_buffer_device_address DONE (anv/gen8+, lvp, radv, vn)
VK_KHR_buffer_device_address DONE (anv/gen8+, lvp, radv, tu, vn)
VK_KHR_create_renderpass2 DONE (anv, lvp, radv, tu, vn)
VK_KHR_depth_stencil_resolve DONE (anv, lvp, radv, tu, vn)
VK_KHR_draw_indirect_count DONE (anv, lvp, radv, tu, vn)

View File

@ -156,6 +156,7 @@ get_device_extensions(const struct tu_physical_device *device,
.KHR_vulkan_memory_model = true,
.KHR_driver_properties = true,
.KHR_separate_depth_stencil_layouts = true,
.KHR_buffer_device_address = true,
#ifndef TU_USE_KGSL
.KHR_timeline_semaphore = true,
#endif
@ -560,7 +561,7 @@ tu_get_physical_device_features_1_2(struct tu_physical_device *pdevice,
features->separateDepthStencilLayouts = true;
features->hostQueryReset = true;
features->timelineSemaphore = true;
features->bufferDeviceAddress = false;
features->bufferDeviceAddress = true;
features->bufferDeviceAddressCaptureReplay = false;
features->bufferDeviceAddressMultiDevice = false;
features->vulkanMemoryModel = true;
@ -2574,8 +2575,9 @@ VkDeviceAddress
tu_GetBufferDeviceAddress(VkDevice _device,
const VkBufferDeviceAddressInfoKHR* pInfo)
{
tu_stub();
return 0;
TU_FROM_HANDLE(tu_buffer, buffer, pInfo->buffer);
return tu_buffer_iova(buffer);
}
uint64_t tu_GetBufferOpaqueCaptureAddress(

View File

@ -81,6 +81,7 @@ tu_spirv_to_nir(struct tu_device *dev,
.subgroup_basic = true,
.subgroup_ballot = true,
.subgroup_vote = true,
.physical_storage_buffer_address = true,
},
};
@ -749,6 +750,10 @@ tu_shader_create(struct tu_device *dev,
nir_var_mem_ubo | nir_var_mem_ssbo,
nir_address_format_vec2_index_32bit_offset);
NIR_PASS_V(nir, nir_lower_explicit_io,
nir_var_mem_global,
nir_address_format_64bit_global);
if (nir->info.stage == MESA_SHADER_COMPUTE) {
NIR_PASS_V(nir, nir_lower_vars_to_explicit_types,
nir_var_mem_shared, shared_type_info);