diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index d43d2c45ac3..4b917897dbf 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -146,6 +146,7 @@ nvk_get_device_extensions(const struct nvk_instance *instance, .KHR_variable_pointers = true, .KHR_vulkan_memory_model = nvk_use_nak(info), .KHR_workgroup_memory_explicit_layout = true, + .KHR_zero_initialize_workgroup_memory = true, .EXT_4444_formats = true, .EXT_attachment_feedback_loop_layout = true, .EXT_border_color_swizzle = true, @@ -334,6 +335,7 @@ nvk_get_device_features(const struct nv_device_info *info, .subgroupSizeControl = true, .computeFullSubgroups = true, .synchronization2 = true, + .shaderZeroInitializeWorkgroupMemory = true, .dynamicRendering = true, .shaderIntegerDotProduct = true, .maintenance4 = true, diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index c1b4656e3c2..09987514632 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -389,6 +389,15 @@ nvk_lower_nir(struct nvk_device *dev, nir_shader *nir, } NIR_PASS(_, 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) { + /* QMD::SHARED_MEMORY_SIZE requires an alignment of 256B so it's safe to + * align everything up to 16B so we can write whole vec4s. + */ + nir->info.shared_size = align(nir->info.shared_size, 16); + NIR_PASS(_, nir, nir_zero_initialize_shared_memory, + nir->info.shared_size, 16); + } } #ifndef NDEBUG