nvk: Implement VK_EXT_zero_initialize_device_memory
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13159
Reviewed-By: Thomas H.P. Andersen <phomes@gmail.com>
Reviewed-By: Mel Henning <mhenning@darkrefraction.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34968>
This commit is contained in:
Faith Ekstrand 2025-05-14 04:34:51 -04:00 committed by Marge Bot
parent f542a60686
commit d808870d49
4 changed files with 36 additions and 5 deletions

View file

@ -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)

View file

@ -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

View file

@ -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,

View file

@ -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,