From ffd3ef35bb561bd487cb3a92b7129d479bf48eff Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Wed, 31 Aug 2022 12:39:32 +0200 Subject: [PATCH] v3dv: implement VK_KHR_workgroup_memory_explicit_layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is an issue with some Amber tests for this feature using a larger number of workgroup invocations than supported without checking the limit. I filed and issue [1] (and a CL with a fix), but meanwhile we want to flag those as expected crashes for CI. [1] https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/3913 Reviewed-by: Alejandro PiƱeiro Part-of: --- docs/features.txt | 2 +- src/broadcom/ci/broadcom-rpi4-fails.txt | 6 ++++++ src/broadcom/vulkan/v3dv_device.c | 11 +++++++++++ src/broadcom/vulkan/v3dv_pipeline.c | 7 +++++-- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index 82f8fd6ec31..9b0942d8a15 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -530,7 +530,7 @@ Khronos extensions that are not part of any Vulkan version: VK_KHR_swapchain DONE (anv, dzn, lvp, panvk, pvr, radv, tu, v3dv, vn) VK_KHR_swapchain_mutable_format DONE (anv, lvp, radv, tu, v3dv, vn) VK_KHR_wayland_surface DONE (anv, dzn, lvp, panvk, radv, tu, v3dv, vn) - VK_KHR_workgroup_memory_explicit_layout DONE (anv, radv) + VK_KHR_workgroup_memory_explicit_layout DONE (anv, radv, v3dv) VK_KHR_win32_keyed_mutex not started VK_KHR_win32_surface DONE (dzn, lvp) VK_KHR_xcb_surface DONE (anv, dzn, lvp, radv, tu, v3dv, vn) diff --git a/src/broadcom/ci/broadcom-rpi4-fails.txt b/src/broadcom/ci/broadcom-rpi4-fails.txt index 4a14b26b91a..7396dad3b9e 100644 --- a/src/broadcom/ci/broadcom-rpi4-fails.txt +++ b/src/broadcom/ci/broadcom-rpi4-fails.txt @@ -355,3 +355,9 @@ spec@!opengl 2.0@max-samplers border,Fail # https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/3759 dEQP-VK.pipeline.monolithic.color_write_enable_maxa.cwe_after_bind.attachments4_more0,Crash + +# https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/3913 +dEQP-VK.compute.workgroup_memory_explicit_layout.copy_memory.two_invocations,Crash +dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.block,Crash +dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.other_block,Crash +dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.block_with_offset,Crash diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 985db8eab6d..6d7aa11b1fe 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -156,6 +156,7 @@ get_device_extensions(const struct v3dv_physical_device *device, .KHR_timeline_semaphore = true, .KHR_uniform_buffer_standard_layout = true, .KHR_synchronization2 = true, + .KHR_workgroup_memory_explicit_layout = true, #ifdef V3DV_USE_WSI_PLATFORM .KHR_swapchain = true, .KHR_swapchain_mutable_format = true, @@ -1285,6 +1286,16 @@ v3dv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR: { + VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *features = + (VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR *)ext; + features->workgroupMemoryExplicitLayout = true; + features->workgroupMemoryExplicitLayoutScalarBlockLayout = false; + features->workgroupMemoryExplicitLayout8BitAccess = true; + features->workgroupMemoryExplicitLayout16BitAccess = true; + break; + } + default: v3dv_debug_ignored_stype(ext->sType); break; diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 979bf72d60e..763c97d76ff 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -182,6 +182,7 @@ static const struct spirv_to_nir_options default_spirv_options = { .vk_memory_model = true, .vk_memory_model_device_scope = true, .physical_storage_buffer_address = true, + .workgroup_memory_explicit_layout = true, }, .ubo_addr_format = nir_address_format_32bit_index_offset, .ssbo_addr_format = nir_address_format_32bit_index_offset, @@ -3127,8 +3128,10 @@ shared_type_info(const struct glsl_type *type, unsigned *size, unsigned *align) static void lower_cs_shared(struct nir_shader *nir) { - NIR_PASS(_, nir, nir_lower_vars_to_explicit_types, - nir_var_mem_shared, shared_type_info); + if (!nir->info.shared_memory_explicit_layout) { + NIR_PASS(_, nir, nir_lower_vars_to_explicit_types, + nir_var_mem_shared, shared_type_info); + } NIR_PASS(_, nir, nir_lower_explicit_io, nir_var_mem_shared, nir_address_format_32bit_offset); }