From d9f9955f9e9b3e4eeab1ecd4fa6513985b1cae36 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 4 May 2022 22:59:10 -0500 Subject: [PATCH] panvk: Enable robustBufferAccess It should already work for UBOs. This should do everything we need for SSBOs. Not sure about vertex and index buffers but we can deal with those later. Part-of: --- src/panfrost/ci/deqp-panfrost-g52-vk.toml | 1 + src/panfrost/vulkan/panvk_device.c | 1 + src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c | 4 +++- src/panfrost/vulkan/panvk_vX_shader.c | 4 +++- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/panfrost/ci/deqp-panfrost-g52-vk.toml b/src/panfrost/ci/deqp-panfrost-g52-vk.toml index dc96016a30d..76f92d81647 100644 --- a/src/panfrost/ci/deqp-panfrost-g52-vk.toml +++ b/src/panfrost/ci/deqp-panfrost-g52-vk.toml @@ -33,6 +33,7 @@ include = [ "dEQP-VK.pipeline.stencil.*", "dEQP-VK.rasterization.interpolation.*", "dEQP-VK.rasterization.primitive_size.*", + "dEQP-VK.robustness.buffer_access.*", "dEQP-VK.spirv_assembly.instruction.compute.opquantize.*", "dEQP-VK.spirv_assembly.instruction.compute.shader_default_output.*", "dEQP-VK.spirv_assembly.instruction.compute.workgroup_memory.*", diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c index e1514f18b00..94b28d7e3a8 100644 --- a/src/panfrost/vulkan/panvk_device.c +++ b/src/panfrost/vulkan/panvk_device.c @@ -475,6 +475,7 @@ panvk_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2 *pFeatures) { pFeatures->features = (VkPhysicalDeviceFeatures) { + .robustBufferAccess = true, .fullDrawIndexUint32 = true, .independentBlend = true, .logicOp = true, diff --git a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c index 1a2785dbdf0..b118edcfaea 100644 --- a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c +++ b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c @@ -486,7 +486,9 @@ panvk_per_arch(nir_lower_descriptors)(nir_shader *nir, .layout = layout, .desc_addr_format = nir_address_format_32bit_index_offset, .ubo_addr_format = nir_address_format_32bit_index_offset, - .ssbo_addr_format = nir_address_format_64bit_global_32bit_offset, + .ssbo_addr_format = dev->vk.enabled_features.robustBufferAccess ? + nir_address_format_64bit_bounded_global : + nir_address_format_64bit_global_32bit_offset, }; bool progress = nir_shader_instructions_pass(nir, lower_descriptors_instr, diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index f78bf6e655f..6aaec727a5f 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -342,7 +342,9 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, const struct spirv_to_nir_options spirv_options = { .caps = { false }, .ubo_addr_format = nir_address_format_32bit_index_offset, - .ssbo_addr_format = nir_address_format_64bit_global_32bit_offset, + .ssbo_addr_format = dev->vk.enabled_features.robustBufferAccess ? + nir_address_format_64bit_bounded_global : + nir_address_format_64bit_global_32bit_offset, }; nir_shader *nir;