From 27ca1c28c0b9983d62cf0da2837504751596acf7 Mon Sep 17 00:00:00 2001 From: Mel Henning Date: Wed, 3 Sep 2025 17:43:07 -0400 Subject: [PATCH] nvk/cmd_pool: NVK_DEBUG=trash_mem for alloc_mem These buffers get recycled, so we can't rely on their contents. Unfortunately, conditional rendering was relying on these buffers being all zero, implicitly, because we didn't fully understand the hardware. By supporting this debug flag here, we add a way to check for code that accidentally assumes zero-initialization. Reviewed-by: Faith Ekstrand Reviewed-by: Mary Guillemard Part-of: --- src/nouveau/vulkan/nvk_cmd_pool.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/nouveau/vulkan/nvk_cmd_pool.c b/src/nouveau/vulkan/nvk_cmd_pool.c index 1751fededd4..7297e94272d 100644 --- a/src/nouveau/vulkan/nvk_cmd_pool.c +++ b/src/nouveau/vulkan/nvk_cmd_pool.c @@ -129,7 +129,10 @@ VkResult nvk_cmd_pool_alloc_mem(struct nvk_cmd_pool *pool, bool force_gart, struct nvk_cmd_mem **mem_out) { + const struct nvk_device *dev = nvk_cmd_pool_device(pool); + const struct nvk_physical_device *pdev = nvk_device_physical(dev); struct nvk_cmd_mem *mem = NULL; + if (force_gart) { if (!list_is_empty(&pool->free_gart_mem)) mem = list_first_entry(&pool->free_gart_mem, struct nvk_cmd_mem, link); @@ -137,13 +140,21 @@ nvk_cmd_pool_alloc_mem(struct nvk_cmd_pool *pool, bool force_gart, if (!list_is_empty(&pool->free_mem)) mem = list_first_entry(&pool->free_mem, struct nvk_cmd_mem, link); } + if (mem) { list_del(&mem->link); - *mem_out = mem; - return VK_SUCCESS; + } else { + VkResult result = nvk_cmd_mem_create(pool, force_gart, &mem); + if (result != VK_SUCCESS) + return result; } - return nvk_cmd_mem_create(pool, force_gart, mem_out); + if (unlikely(pdev->debug_flags & NVK_DEBUG_TRASH_MEMORY)) { + memset(mem->mem->map, 0xF1, mem->mem->size_B); + } + + *mem_out = mem; + return VK_SUCCESS; } VkResult