Mesa (main): turnip: Implement VK_KHR_zero_initialize_workgroup_memory
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Feb 4 10:15:37 UTC 2022
Module: Mesa
Branch: main
Commit: ff059605aaad2af6ed1903fbfe9925e4b1635363
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ff059605aaad2af6ed1903fbfe9925e4b1635363
Author: Danylo Piliaiev <dpiliaiev at igalia.com>
Date: Tue Feb 1 19:30:53 2022 +0200
turnip: Implement VK_KHR_zero_initialize_workgroup_memory
Moved nir_lower_compute_system_values to lower
load_local_invocation_index which could be emitted by
nir_zero_initialize_shared_memory.
Relevant CTS tests:
dEQP-VK.compute.zero_initialize_workgroup_memory.*
Signed-off-by: Danylo Piliaiev <dpiliaiev at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14829>
---
docs/features.txt | 2 +-
src/freedreno/vulkan/tu_device.c | 3 ++-
src/freedreno/vulkan/tu_shader.c | 21 ++++++++++++++++-----
3 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/docs/features.txt b/docs/features.txt
index 1881a78491e..0771e42976c 100644
--- a/docs/features.txt
+++ b/docs/features.txt
@@ -479,7 +479,7 @@ Vulkan 1.3 -- all DONE: anv, radv
VK_KHR_shader_non_semantic_info DONE (anv, radv)
VK_KHR_shader_terminate_invocation DONE (anv, radv, tu)
VK_KHR_synchronization2 DONE (anv, radv)
- VK_KHR_zero_initialize_workgroup_memory DONE (anv, radv)
+ VK_KHR_zero_initialize_workgroup_memory DONE (anv, radv, tu)
VK_EXT_4444_formats DONE (anv, lvp, radv, tu, v3dv)
VK_EXT_extended_dynamic_state DONE (anv, lvp, radv, tu)
VK_EXT_extended_dynamic_state2 DONE (anv, lvp, radv, tu)
diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c
index bb95ea8f0a1..d15fbd75e9d 100644
--- a/src/freedreno/vulkan/tu_device.c
+++ b/src/freedreno/vulkan/tu_device.c
@@ -159,6 +159,7 @@ get_device_extensions(const struct tu_physical_device *device,
.KHR_separate_depth_stencil_layouts = true,
.KHR_buffer_device_address = true,
.KHR_shader_integer_dot_product = true,
+ .KHR_zero_initialize_workgroup_memory = true,
#ifndef TU_USE_KGSL
.KHR_timeline_semaphore = true,
#endif
@@ -593,7 +594,7 @@ tu_get_physical_device_features_1_3(struct tu_physical_device *pdevice,
features->computeFullSubgroups = true;
features->synchronization2 = false;
features->textureCompressionASTC_HDR = false;
- features->shaderZeroInitializeWorkgroupMemory = false;
+ features->shaderZeroInitializeWorkgroupMemory = true;
features->dynamicRendering = false;
features->shaderIntegerDotProduct = true;
features->maintenance4 = false;
diff --git a/src/freedreno/vulkan/tu_shader.c b/src/freedreno/vulkan/tu_shader.c
index 82e94da573f..e3e72f5f413 100644
--- a/src/freedreno/vulkan/tu_shader.c
+++ b/src/freedreno/vulkan/tu_shader.c
@@ -87,10 +87,6 @@ tu_spirv_to_nir(struct tu_device *dev,
},
};
- const struct nir_lower_compute_system_values_options compute_sysval_options = {
- .has_base_workgroup_id = true,
- };
-
const nir_shader_compiler_options *nir_options =
ir3_get_compiler_options(dev->compiler);
@@ -158,7 +154,6 @@ tu_spirv_to_nir(struct tu_device *dev,
NIR_PASS_V(nir, nir_lower_is_helper_invocation);
NIR_PASS_V(nir, nir_lower_system_values);
- NIR_PASS_V(nir, nir_lower_compute_system_values, &compute_sysval_options);
NIR_PASS_V(nir, nir_lower_clip_cull_distance_arrays);
@@ -763,6 +758,22 @@ tu_shader_create(struct tu_device *dev,
NIR_PASS_V(nir, nir_lower_explicit_io,
nir_var_mem_shared,
nir_address_format_32bit_offset);
+
+ if (nir->info.zero_initialize_shared_memory && nir->info.shared_size > 0) {
+ const unsigned chunk_size = 16; /* max single store size */
+ /* Shared memory is allocated in 1024b chunks in HW, but the zero-init
+ * extension only requires us to initialize the memory that the shader
+ * is allocated at the API level, and it's up to the user to ensure
+ * that accesses are limited to those bounds.
+ */
+ const unsigned shared_size = ALIGN(nir->info.shared_size, chunk_size);
+ NIR_PASS_V(nir, nir_zero_initialize_shared_memory, shared_size, chunk_size);
+ }
+
+ const struct nir_lower_compute_system_values_options compute_sysval_options = {
+ .has_base_workgroup_id = true,
+ };
+ NIR_PASS_V(nir, nir_lower_compute_system_values, &compute_sysval_options);
}
nir_assign_io_var_locations(nir, nir_var_shader_in, &nir->num_inputs, nir->info.stage);
More information about the mesa-commit
mailing list