diff --git a/docs/features.txt b/docs/features.txt index 517036caf52..30f24369c2b 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -660,7 +660,7 @@ Khronos extensions that are not part of any Vulkan version: VK_EXT_vertex_attribute_divisor DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn) VK_EXT_vertex_input_dynamic_state DONE (anv, lvp, nvk, panvk, radv, tu, vn) VK_EXT_ycbcr_image_arrays DONE (anv, hasvk, lvp, nvk, panvk/v10+, radv, vn) - VK_EXT_zero_initialize_device_memory DONE (radv) + VK_EXT_zero_initialize_device_memory DONE (nvk, radv) VK_ANDROID_external_memory_android_hardware_buffer DONE (anv, radv, tu, vn) VK_ANDROID_native_buffer DONE (anv, radv, tu, v3dv, vn) VK_GOOGLE_decorate_string DONE (anv, hasvk, lvp, nvk, panvk, radv, tu, vn) diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index 460a079546c..ece336ba1fb 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -21,4 +21,4 @@ VK_EXT_shader_replicated_composites on panvk VK_EXT_depth_bias_control on panvk VK_KHR_shader_bfloat16 on anv/gfx125+ and radv/gfx12+ VK_KHR_robustness2 on RADV -VK_EXT_zero_initialize_device_memory on RADV +VK_EXT_zero_initialize_device_memory on RADV and NVK diff --git a/src/nouveau/vulkan/nvk_device_memory.c b/src/nouveau/vulkan/nvk_device_memory.c index 73aeb45c08c..fe8a6fd1eb0 100644 --- a/src/nouveau/vulkan/nvk_device_memory.c +++ b/src/nouveau/vulkan/nvk_device_memory.c @@ -102,6 +102,12 @@ nvk_GetMemoryFdPropertiesKHR(VkDevice device, return VK_SUCCESS; } +enum nvk_memory_init { + NVK_MEMORY_INIT_NONE, + NVK_MEMORY_INIT_ZERO, + NVK_MEMORY_INIT_TRASH, +}; + VKAPI_ATTR VkResult VKAPI_CALL nvk_AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo, @@ -189,9 +195,30 @@ nvk_AllocateMemory(VkDevice device, goto fail_alloc; } - if (!is_import && (pdev->debug_flags & (NVK_DEBUG_ZERO_MEMORY | - NVK_DEBUG_TRASH_MEMORY))) { - bool use_zero = (pdev->debug_flags & NVK_DEBUG_ZERO_MEMORY) != 0; + enum nvk_memory_init init; + if (is_import) { + /* From the Vulkan 1.4.315 spec: + * + * VUID-VkMemoryAllocateFlagsInfo-flags-10760 + * + * "If the allocation is performing a memory import operation, then + * flags must not contain VK_MEMORY_ALLOCATE_ZERO_INITIALIZE_BIT_EXT" + */ + assert(!(mem->vk.alloc_flags & VK_MEMORY_ALLOCATE_ZERO_INITIALIZE_BIT_EXT)); + init = NVK_MEMORY_INIT_NONE; + } else { + if (mem->vk.alloc_flags & VK_MEMORY_ALLOCATE_ZERO_INITIALIZE_BIT_EXT) + init = NVK_MEMORY_INIT_ZERO; + else if (pdev->debug_flags & NVK_DEBUG_ZERO_MEMORY) + init = NVK_MEMORY_INIT_ZERO; + else if (pdev->debug_flags & NVK_DEBUG_TRASH_MEMORY) + init = NVK_MEMORY_INIT_TRASH; + else + init = NVK_MEMORY_INIT_NONE; + } + + if (init != NVK_MEMORY_INIT_NONE) { + bool use_zero = init == NVK_MEMORY_INIT_ZERO; if (type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { void *map; result = nvkmd_mem_map(mem->mem, &dev->vk.base, diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index fea61a13534..ac87375c574 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -288,6 +288,7 @@ nvk_get_device_extensions(const struct nvk_instance *instance, .EXT_vertex_input_dynamic_state = true, .EXT_ycbcr_2plane_444_formats = true, .EXT_ycbcr_image_arrays = true, + .EXT_zero_initialize_device_memory = true, #if DETECT_OS_ANDROID .ANDROID_native_buffer = vk_android_get_ugralloc() != NULL, #endif @@ -707,6 +708,9 @@ nvk_get_device_features(const struct nv_device_info *info, /* VK_EXT_ycbcr_image_arrays */ .ycbcrImageArrays = true, + /* VK_EXT_zero_initialize_device_memory */ + .zeroInitializeDeviceMemory = true, + /* VK_MESA_image_alignment_control */ .imageAlignmentControl = true,